From 11ff9b1942cd7de4f2235c24275c138688a39dcf Mon Sep 17 00:00:00 2001 From: "Desmond A. Kirkpatrick" Date: Sun, 11 Oct 2026 20:18:35 -0700 Subject: [PATCH 01/26] Apply latest updates overlay --- packages/rohd_devtools_widgets/CHANGELOG.md | 4 - packages/rohd_devtools_widgets/README.md | 5 +- .../analysis_options.yaml | 6 +- .../lib/rohd_devtools_widgets.dart | 3 + .../lib/src/app_bar_overlay.dart | 66 +- .../lib/src/bit_expansion_menu.dart | 55 +- .../lib/src/bit_field_utils.dart | 160 +- .../lib/src/cross_probe_button.dart | 44 +- .../lib/src/cross_probe_menu.dart | 25 +- .../lib/src/export_button.dart | 12 +- .../lib/src/logic_type_utils.dart | 12 +- .../lib/src/markdown_help_button.dart | 117 +- .../lib/src/signal_value_format_menu.dart | 89 + .../lib/src/signal_value_format_registry.dart | 6 +- packages/rohd_devtools_widgets/pubspec.yaml | 12 +- .../pubspec_overrides.yaml | 3 - .../test/app_bar_overlay_test.dart | 2 +- .../test/bit_expansion_menu_test.dart | 6 +- .../test/bit_field_utils_test.dart | 2 +- .../test/capture_boundary_test.dart | 6 +- .../test/cross_probe_button_test.dart | 2 +- .../test/cross_probe_menu_test.dart | 12 +- .../test/export_button_test.dart | 2 +- .../test/export_toast_test.dart | 2 +- .../test/markdown_help_button_test.dart | 2 +- .../signal_value_format_registry_test.dart | 74 +- .../lib/src/models/signal_waveform.dart | 193 +- .../test/signal_waveform_test.dart | 121 +- pubspec.yaml | 3 +- pubspec_overrides.yaml | 3 + rohd_devtools_extension/.gitignore | 1 + rohd_devtools_extension/.vscode/launch.json | 66 +- rohd_devtools_extension/.vscode/settings.json | 5 + rohd_devtools_extension/.vscode/tasks.json | 353 +- rohd_devtools_extension/Makefile | 281 +- rohd_devtools_extension/README.md | 159 +- rohd_devtools_extension/analysis_options.yaml | 1 + .../assets/FilterBank.flc.json | 832 + .../assets/FilterBank.rohd.json | 11988 +++++++++ .../assets/FilterBank.traced.flc.json | 832 + .../assets/FilterBank.traced.rohd.json | 11988 +++++++++ .../assets/TwoFPAdders.rohd.json | 20045 ++++++++++++++++ .../assets/help/rohd_shell_help.md | 70 + .../assets/layout_bridge/elk_layout_only.js | 96 + rohd_devtools_extension/assets/rohd_icon.png | Bin 0 -> 4911 bytes .../assets/rohd_schematic.json.bak | 5140 ++++ .../assets/systemc_icon.png | Bin 0 -> 9477 bytes .../assets/systemverilog_icon.png | Bin 0 -> 54567 bytes .../elkjs/LICENSES/elkjs_LICENSES.txt | 159 + .../assets/third_party/elkjs/elk.bundled.js | 6444 +++++ rohd_devtools_extension/bin/rohd_shell.dart | 895 + rohd_devtools_extension/lib/main.dart | 115 +- .../cli/design_query_language.dart | 158 + .../cli/rohd_design_dtd_service.dart | 277 + .../cli/rohd_shell_dtd_service.dart | 188 + .../rohd_devtools/cli/rohd_shell_output.dart | 173 + .../lib/rohd_devtools/cli/waveform_cli.dart | 310 + .../lib/rohd_devtools/const/app_theme.dart | 5 +- .../lib/rohd_devtools/cubit/cubits.dart | 1 + .../rohd_devtools/cubit/hierarchy_cubit.dart | 170 + .../cubit/rohd_service_cubit.dart | 99 +- .../cubit/standalone_rohd_service_cubit.dart | 97 + .../cubit/standalone_rohd_service_state.dart | 52 + .../rohd_devtools/examples/rohd_examples.dart | 429 + .../rohd_devtools/models/signal_model.dart | 44 +- .../lib/rohd_devtools/models/tree_model.dart | 92 +- .../services/base_signal_waveform_api.dart | 1246 + .../services/design_data_adapter.dart | 274 + .../services/devtools_dtd_connection.dart | 2 + .../devtools_dtd_connection_stub.dart | 13 + .../services/devtools_dtd_connection_web.dart | 15 + .../services/extension_manager_bridge.dart | 2 + .../services/extension_manager_bridge_io.dart | 5 + .../extension_manager_bridge_web.dart | 6 + .../services/flc_extension_client.dart | 166 + .../rohd_devtools/services/flc_service.dart | 404 + .../services/in_process_transport.dart | 230 + .../services/in_process_tree_data_source.dart | 221 + .../in_process_waveform_data_source.dart | 304 + .../services/io_vm_connection_strategy.dart | 8 +- .../loopback_signal_waveform_api.dart | 57 + .../services/netlist_const_extractor.dart | 252 + .../services/netlist_evaluator.dart | 1722 ++ .../platform_vm_connection_strategy.dart | 2 +- .../platform_vm_connection_strategy_stub.dart | 2 +- .../services/rohd_service_transport.dart | 121 + .../lib/rohd_devtools/services/services.dart | 21 + .../services/signal_selection_bus.dart | 79 + .../services/signal_value_source_binding.dart | 16 +- .../services/source_navigation_service.dart | 886 + .../services/standalone_tree_service.dart | 135 + .../static_json_tree_data_source.dart | 102 + .../third_party_license_registry.dart | 52 + .../services/tree_data_source.dart | 46 + .../rohd_devtools/services/tree_service.dart | 373 +- .../services/vm_connection_strategy.dart | 46 + .../vm_service_signal_value_source.dart | 14 +- .../vm_service_signal_waveform_api.dart | 169 + .../services/vm_service_transport.dart | 820 + .../services/vm_service_tree_data_source.dart | 600 + .../vm_service_waveform_data_source.dart | 1068 + .../services/waveform_data_source.dart | 180 + .../waveform_signal_value_source.dart | 43 + .../services/web_vm_connection_strategy.dart | 2 +- .../wellen_backed_waveform_data_source.dart | 522 + .../ui/details_panel_content.dart | 387 + .../lib/rohd_devtools/ui/devtool_appbar.dart | 218 +- .../ui/devtools_connection_host.dart | 47 +- .../ui/devtools_split_layout.dart | 384 + .../ui/module_search_overlay.dart | 296 + .../rohd_devtools/ui/module_tree_card.dart | 287 +- .../ui/module_tree_details_navbar.dart | 202 +- .../rohd_devtools/ui/rohd_design_shell.dart | 493 + .../ui/rohd_shell_help_button.dart | 46 + .../rohd_devtools/ui/signal_details_card.dart | 381 +- .../lib/rohd_devtools/ui/signal_table.dart | 1720 +- .../rohd_devtools/ui/source_frame_picker.dart | 225 + .../ui/standalone_app_shell.dart | 3701 ++- .../lib/rohd_devtools/ui/ui.dart | 7 + .../rohd_devtools/ui/vm_connection_form.dart | 8 +- .../ui/waveform_viewer_wrapper.dart | 274 + .../rohd_devtools/utils/browser_window.dart | 12 + .../utils/browser_window_io.dart | 32 + .../utils/browser_window_stub.dart | 16 + .../utils/browser_window_web.dart | 18 + .../utils/hierarchy_extensions.dart | 24 + .../lib/rohd_devtools/utils/regex_utils.dart | 73 + .../view/rohd_devtools_page.dart | 168 +- .../view/tree_structure_page.dart | 900 +- .../flutter/generated_plugin_registrant.cc | 8 + .../linux/flutter/generated_plugins.cmake | 3 + .../rohd_devtools_widgets/pubspec.yaml | 25 - rohd_devtools_extension/pubspec.yaml | 38 +- rohd_devtools_extension/scripts/README.md | 50 + .../scripts/build_linux_native.sh | 41 + .../scripts/devtools_dev_mode.sh | 570 + .../scripts/devtools_run.sh | 54 + .../scripts/ensure_dart_bindings.sh | 48 + .../scripts/fix_control_body_newline.py | 231 + .../scripts/fix_directives.py | 102 + rohd_devtools_extension/scripts/fix_types.py | 79 + rohd_devtools_extension/scripts/free_ports.sh | 39 + .../scripts/prepare_web_assets.sh | 25 + .../scripts/resolve_package_root.dart | 67 + .../scripts/stage_assets.sh | 104 + .../scripts/verify_elk_distribution.sh | 33 + .../shared/module_info_helper.js | 159 + .../test/array3d_eval_test.dart | 181 + .../test/const/app_theme_test.dart | 22 +- .../test/const_eval_test.dart | 261 + .../test/cubit/basic_cubits_test.dart | 15 +- .../test/cubit/snapshot_cubit_test.dart | 92 +- .../test/enable_diag_test.dart | 84 + .../test/fixtures/filter_bank.json | 6226 +++++ .../test/flc_extension_client_test.dart | 77 + .../test/loopback_miter_test.dart | 445 + rohd_devtools_extension/test/miter_test.dart | 1053 + .../test/models/signal_tree_model_test.dart | 126 +- .../fixtures/tree_model.stub.dart | 76 +- .../tree_structure/model_tree_card_test.dart | 85 +- .../tree_structure/rohd_devtools_mocks.dart | 7 +- .../tree_structure_page_test.dart | 138 +- .../test/netlist_const_extractor_test.dart | 86 + .../test/rohd_design_dtd_service_test.dart | 102 + .../test/rohd_design_shell_test.dart | 62 + .../test/rohd_shell_output_test.dart | 143 + .../test/services/tree_service_test.dart | 62 + .../vm_service_signal_waveform_api_test.dart | 28 + .../test/source_navigation_service_test.dart | 79 + .../test/ui/devtool_appbar_test.dart | 78 +- ...vtools_connection_host_lifecycle_test.dart | 92 +- .../ui/devtools_connection_host_test.dart | 45 +- .../test/ui/diagnostic_properties_test.dart | 7 +- .../ui/module_tree_details_navbar_test.dart | 5 +- .../test/ui/presentation_widgets_test.dart | 17 +- .../test/ui/signal_details_card_test.dart | 51 +- .../test/ui/signal_table_test.dart | 53 +- .../test/ui/signal_table_text_field_test.dart | 14 +- .../test/ui/vm_connection_form_test.dart | 25 +- .../test/view/rohd_devtools_page_test.dart | 10 +- .../tool/gh_actions/build_app.sh | 13 +- .../tool/test_devtools_install.dart | 80 +- .../web/assets/FilterBank.flc.json | 832 + .../web/assets/FilterBank.rohd.json | 11988 +++++++++ .../web/assets/FilterBank.traced.flc.json | 832 + .../web/assets/FilterBank.traced.rohd.json | 11988 +++++++++ .../web/assets/TwoFPAdders.rohd.json | 20045 ++++++++++++++++ .../web/assets/rohd_schematic.json | 5140 ++++ rohd_devtools_extension/web/debugger.png | Bin 0 -> 952 bytes .../web/icons/debugger-192.png | Bin 0 -> 4911 bytes .../web/icons/debugger-512.png | Bin 0 -> 50043 bytes .../web/icons/debugger-maskable-192.png | Bin 0 -> 4911 bytes .../web/icons/debugger-maskable-512.png | Bin 0 -> 50043 bytes rohd_devtools_extension/web/index.html | 40 +- test/waveform_service_test.dart | 190 +- 195 files changed, 143104 insertions(+), 2326 deletions(-) create mode 100644 packages/rohd_devtools_widgets/lib/src/signal_value_format_menu.dart delete mode 100644 packages/rohd_devtools_widgets/pubspec_overrides.yaml create mode 100644 pubspec_overrides.yaml create mode 100644 rohd_devtools_extension/.vscode/settings.json create mode 100644 rohd_devtools_extension/assets/FilterBank.flc.json create mode 100644 rohd_devtools_extension/assets/FilterBank.rohd.json create mode 100644 rohd_devtools_extension/assets/FilterBank.traced.flc.json create mode 100644 rohd_devtools_extension/assets/FilterBank.traced.rohd.json create mode 100644 rohd_devtools_extension/assets/TwoFPAdders.rohd.json create mode 100644 rohd_devtools_extension/assets/help/rohd_shell_help.md create mode 100644 rohd_devtools_extension/assets/layout_bridge/elk_layout_only.js create mode 100644 rohd_devtools_extension/assets/rohd_icon.png create mode 100644 rohd_devtools_extension/assets/rohd_schematic.json.bak create mode 100644 rohd_devtools_extension/assets/systemc_icon.png create mode 100644 rohd_devtools_extension/assets/systemverilog_icon.png create mode 100644 rohd_devtools_extension/assets/third_party/elkjs/LICENSES/elkjs_LICENSES.txt create mode 100644 rohd_devtools_extension/assets/third_party/elkjs/elk.bundled.js create mode 100644 rohd_devtools_extension/bin/rohd_shell.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/cli/design_query_language.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/cli/rohd_design_dtd_service.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/cli/rohd_shell_dtd_service.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/cli/rohd_shell_output.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/cli/waveform_cli.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/cubit/hierarchy_cubit.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/cubit/standalone_rohd_service_cubit.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/cubit/standalone_rohd_service_state.dart create mode 100755 rohd_devtools_extension/lib/rohd_devtools/examples/rohd_examples.dart create mode 100755 rohd_devtools_extension/lib/rohd_devtools/services/base_signal_waveform_api.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/design_data_adapter.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/devtools_dtd_connection.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/devtools_dtd_connection_stub.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/devtools_dtd_connection_web.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/extension_manager_bridge.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/extension_manager_bridge_io.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/extension_manager_bridge_web.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/flc_extension_client.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/flc_service.dart create mode 100755 rohd_devtools_extension/lib/rohd_devtools/services/in_process_transport.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/in_process_tree_data_source.dart create mode 100755 rohd_devtools_extension/lib/rohd_devtools/services/in_process_waveform_data_source.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/loopback_signal_waveform_api.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/netlist_const_extractor.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/netlist_evaluator.dart create mode 100755 rohd_devtools_extension/lib/rohd_devtools/services/rohd_service_transport.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/signal_selection_bus.dart create mode 100755 rohd_devtools_extension/lib/rohd_devtools/services/source_navigation_service.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/standalone_tree_service.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/static_json_tree_data_source.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/third_party_license_registry.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/tree_data_source.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/vm_connection_strategy.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/vm_service_signal_waveform_api.dart create mode 100755 rohd_devtools_extension/lib/rohd_devtools/services/vm_service_transport.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/vm_service_tree_data_source.dart create mode 100755 rohd_devtools_extension/lib/rohd_devtools/services/vm_service_waveform_data_source.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/waveform_data_source.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/waveform_signal_value_source.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/services/wellen_backed_waveform_data_source.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/ui/details_panel_content.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/ui/devtools_split_layout.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/ui/module_search_overlay.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/ui/rohd_design_shell.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/ui/rohd_shell_help_button.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/ui/source_frame_picker.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/ui/waveform_viewer_wrapper.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/utils/browser_window.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/utils/browser_window_io.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/utils/browser_window_stub.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/utils/browser_window_web.dart create mode 100644 rohd_devtools_extension/lib/rohd_devtools/utils/hierarchy_extensions.dart create mode 100755 rohd_devtools_extension/lib/rohd_devtools/utils/regex_utils.dart delete mode 100644 rohd_devtools_extension/packages/rohd_devtools_widgets/pubspec.yaml create mode 100644 rohd_devtools_extension/scripts/README.md create mode 100755 rohd_devtools_extension/scripts/build_linux_native.sh create mode 100755 rohd_devtools_extension/scripts/devtools_dev_mode.sh create mode 100644 rohd_devtools_extension/scripts/devtools_run.sh create mode 100644 rohd_devtools_extension/scripts/ensure_dart_bindings.sh create mode 100644 rohd_devtools_extension/scripts/fix_control_body_newline.py create mode 100644 rohd_devtools_extension/scripts/fix_directives.py create mode 100644 rohd_devtools_extension/scripts/fix_types.py create mode 100755 rohd_devtools_extension/scripts/free_ports.sh create mode 100755 rohd_devtools_extension/scripts/prepare_web_assets.sh create mode 100644 rohd_devtools_extension/scripts/resolve_package_root.dart create mode 100755 rohd_devtools_extension/scripts/stage_assets.sh create mode 100644 rohd_devtools_extension/scripts/verify_elk_distribution.sh create mode 100644 rohd_devtools_extension/shared/module_info_helper.js create mode 100644 rohd_devtools_extension/test/array3d_eval_test.dart create mode 100755 rohd_devtools_extension/test/const_eval_test.dart create mode 100755 rohd_devtools_extension/test/enable_diag_test.dart create mode 100644 rohd_devtools_extension/test/fixtures/filter_bank.json create mode 100644 rohd_devtools_extension/test/flc_extension_client_test.dart create mode 100755 rohd_devtools_extension/test/loopback_miter_test.dart create mode 100755 rohd_devtools_extension/test/miter_test.dart create mode 100644 rohd_devtools_extension/test/netlist_const_extractor_test.dart create mode 100644 rohd_devtools_extension/test/rohd_design_dtd_service_test.dart create mode 100644 rohd_devtools_extension/test/rohd_design_shell_test.dart create mode 100644 rohd_devtools_extension/test/rohd_shell_output_test.dart create mode 100644 rohd_devtools_extension/test/services/tree_service_test.dart create mode 100644 rohd_devtools_extension/test/services/vm_service_signal_waveform_api_test.dart create mode 100644 rohd_devtools_extension/test/source_navigation_service_test.dart create mode 100644 rohd_devtools_extension/web/assets/FilterBank.flc.json create mode 100644 rohd_devtools_extension/web/assets/FilterBank.rohd.json create mode 100644 rohd_devtools_extension/web/assets/FilterBank.traced.flc.json create mode 100644 rohd_devtools_extension/web/assets/FilterBank.traced.rohd.json create mode 100644 rohd_devtools_extension/web/assets/TwoFPAdders.rohd.json create mode 100644 rohd_devtools_extension/web/assets/rohd_schematic.json create mode 100644 rohd_devtools_extension/web/debugger.png create mode 100644 rohd_devtools_extension/web/icons/debugger-192.png create mode 100644 rohd_devtools_extension/web/icons/debugger-512.png create mode 100644 rohd_devtools_extension/web/icons/debugger-maskable-192.png create mode 100644 rohd_devtools_extension/web/icons/debugger-maskable-512.png diff --git a/packages/rohd_devtools_widgets/CHANGELOG.md b/packages/rohd_devtools_widgets/CHANGELOG.md index 891d3c8114..bd08414264 100644 --- a/packages/rohd_devtools_widgets/CHANGELOG.md +++ b/packages/rohd_devtools_widgets/CHANGELOG.md @@ -1,7 +1,3 @@ -## 0.1.1 - -- Fix the ROHD dependency lower bound: require `^0.6.10` instead of `^0.6.9`, since signal formatting uses `toRadixString`'s `includeWidth` and `sepChar` parameters introduced in ROHD 0.6.10 (). - ## 0.1.0 - Initial release of shared ROHD DevTools widgets. diff --git a/packages/rohd_devtools_widgets/README.md b/packages/rohd_devtools_widgets/README.md index 8e5a7e0b71..12266400e1 100644 --- a/packages/rohd_devtools_widgets/README.md +++ b/packages/rohd_devtools_widgets/README.md @@ -70,13 +70,10 @@ across DevTools packages. ## Usage -For a complete runnable example, see -[`example/main.dart`](example/main.dart). - Add the package to your Flutter application: ```shell -flutter pub add rohd_devtools_widgets +flutter pub add rohd_devtools_widgets:^0.1.0 ``` Import the shared widgets you need: diff --git a/packages/rohd_devtools_widgets/analysis_options.yaml b/packages/rohd_devtools_widgets/analysis_options.yaml index 67a8abe099..0b2cfe659e 100644 --- a/packages/rohd_devtools_widgets/analysis_options.yaml +++ b/packages/rohd_devtools_widgets/analysis_options.yaml @@ -7,4 +7,8 @@ analyzer: - windows/** - macos/** - linux/** -include: ../../rohd_devtools_extension/analysis_options.yaml +include: package:lints/recommended.yaml + +linter: + rules: + - migrate_design_widgets diff --git a/packages/rohd_devtools_widgets/lib/rohd_devtools_widgets.dart b/packages/rohd_devtools_widgets/lib/rohd_devtools_widgets.dart index 7547440d22..8ef56aec2c 100644 --- a/packages/rohd_devtools_widgets/lib/rohd_devtools_widgets.dart +++ b/packages/rohd_devtools_widgets/lib/rohd_devtools_widgets.dart @@ -26,6 +26,8 @@ export 'src/export_toast.dart'; export 'src/logic_type_utils.dart'; // Help export 'src/markdown_help_button.dart'; +// Regular expression helpers +export 'src/regex_utils.dart'; export 'src/rohd_extension_client.dart'; // ROHD extension client export 'src/rohd_extension_status.dart'; @@ -34,3 +36,4 @@ export 'src/save_png_stub.dart' if (dart.library.js_interop) 'src/save_png_web.dart'; // Shared signal display-format preferences and value formatting export 'src/signal_value_format_registry.dart'; +export 'src/signal_value_format_menu.dart'; diff --git a/packages/rohd_devtools_widgets/lib/src/app_bar_overlay.dart b/packages/rohd_devtools_widgets/lib/src/app_bar_overlay.dart index 3ebf2183c9..8a1a3dc832 100644 --- a/packages/rohd_devtools_widgets/lib/src/app_bar_overlay.dart +++ b/packages/rohd_devtools_widgets/lib/src/app_bar_overlay.dart @@ -14,11 +14,29 @@ // 2026 April // Author: Desmond Kirkpatrick -import 'dart:async'; - import 'package:flutter/foundation.dart'; import 'package:material_ui/material_ui.dart'; +/// Provides an external show/hide trigger for descendant [AppBarOverlay]s. +/// +/// Place above any [AppBarOverlay] in the widget tree. When [notifier] is +/// `true`, the overlay stays visible even if the mouse is outside its own +/// trigger zone. Useful for keeping the overlay open while the mouse is +/// over an adjacent area such as a tab bar. +class AppBarOverlayTrigger extends InheritedNotifier> { + /// Creates an [AppBarOverlayTrigger] with the given [notifier]. + const AppBarOverlayTrigger({ + required ValueNotifier notifier, + required super.child, + super.key, + }) : super(notifier: notifier); + + /// Returns the trigger notifier from the nearest ancestor, or `null`. + static ValueNotifier? of(BuildContext context) => context + .dependOnInheritedWidgetOfExactType() + ?.notifier; +} + /// Wraps a [body] widget and an [appBar] widget, where the AppBar /// auto-hides by sliding up when [autoHide] is true. /// @@ -76,6 +94,9 @@ class _AppBarOverlayState extends State late final AnimationController _controller; late final Animation _slideAnimation; + ValueNotifier? _externalTrigger; + bool _mouseInOverlay = false; + @override void initState() { super.initState(); @@ -100,33 +121,56 @@ class _AppBarOverlayState extends State } } + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final trigger = AppBarOverlayTrigger.of(context); + if (trigger != _externalTrigger) { + _externalTrigger?.removeListener(_onExternalTrigger); + _externalTrigger = trigger; + _externalTrigger?.addListener(_onExternalTrigger); + } + } + @override void didUpdateWidget(covariant AppBarOverlay oldWidget) { super.didUpdateWidget(oldWidget); if (!widget.autoHide && oldWidget.autoHide) { // Switched from auto-hide → always visible: snap open. - unawaited(_controller.forward()); + _controller.forward(); } else if (widget.autoHide && !oldWidget.autoHide) { // Switched from always visible → auto-hide: hide immediately. - unawaited(_controller.reverse()); + _controller.reverse(); } } @override void dispose() { + _externalTrigger?.removeListener(_onExternalTrigger); _controller.dispose(); super.dispose(); } + void _onExternalTrigger() { + if (_externalTrigger?.value ?? false) { + _show(); + } else if (!_mouseInOverlay) { + _hide(); + } + } + void _show() { - unawaited(_controller.forward()); + _controller.forward(); } void _hide() { if (!widget.autoHide) { return; } - unawaited(_controller.reverse()); + if (_externalTrigger?.value ?? false) { + return; + } + _controller.reverse(); } @override @@ -173,8 +217,14 @@ class _AppBarOverlayState extends State child: SlideTransition( position: _slideAnimation, child: MouseRegion( - onEnter: (_) => _show(), - onExit: (_) => _hide(), + onEnter: (_) { + _mouseInOverlay = true; + _show(); + }, + onExit: (_) { + _mouseInOverlay = false; + _hide(); + }, child: Opacity( opacity: widget.panelOpacity, child: widget.appBar, diff --git a/packages/rohd_devtools_widgets/lib/src/bit_expansion_menu.dart b/packages/rohd_devtools_widgets/lib/src/bit_expansion_menu.dart index ec72c54ed0..fb7e0affd0 100644 --- a/packages/rohd_devtools_widgets/lib/src/bit_expansion_menu.dart +++ b/packages/rohd_devtools_widgets/lib/src/bit_expansion_menu.dart @@ -11,18 +11,20 @@ // Author: Desmond Kirkpatrick import 'package:material_ui/material_ui.dart'; -import 'package:rohd_devtools_widgets/src/bit_field_utils.dart'; + +import 'bit_field_utils.dart'; /// Popup-menu values used by the bit-expansion items. /// /// Callers may match against these string constants when handling a /// `showMenu` result that includes bit-expansion items. abstract final class BitExpansionMenuValues { - /// "Expand Bits" menu item for expanding each bit (or a chosen range) as a - /// synthesized 1-bit waveform. + /// Menu item: "Expand Bits [N]" — expand each bit (or a chosen range) + /// as a synthesized 1-bit waveform. static const String expandBits = 'expand_bits'; - /// "Define Bit Fields" menu item for naming arbitrary bit ranges. + /// Menu item: "Define Bit Fields [N]..." — open a dialog that lets the + /// user name arbitrary bit ranges. static const String defineFields = 'define_fields'; } @@ -42,8 +44,6 @@ class BitExpandRangeAction extends BitExpansionAction { /// High bit (inclusive) of the range to expand. final int bitEnd; - /// Creates an action to expand the inclusive range from [bitStart] to - /// [bitEnd]. const BitExpandRangeAction(this.bitStart, this.bitEnd); } @@ -53,7 +53,6 @@ class BitDefineFieldsAction extends BitExpansionAction { /// The user-defined bit fields. final List fields; - /// Creates an action defining [fields] for a signal. const BitDefineFieldsAction(this.fields); } @@ -74,24 +73,24 @@ List> buildBitExpansionMenuItems({ double fontSize = 13, double itemHeight = 32, bool includeDivider = false, -}) => - >[ - if (includeDivider) const PopupMenuDivider(height: 8), - PopupMenuItem( - height: itemHeight, - value: BitExpansionMenuValues.expandBits, - child: - Text('Expand Bits [$width]', style: TextStyle(fontSize: fontSize)), - ), - PopupMenuItem( - height: itemHeight, - value: BitExpansionMenuValues.defineFields, - child: Text( - 'Define Bit Fields [$width]...', - style: TextStyle(fontSize: fontSize), - ), +}) { + return >[ + if (includeDivider) const PopupMenuDivider(height: 8), + PopupMenuItem( + height: itemHeight, + value: BitExpansionMenuValues.expandBits, + child: Text('Expand Bits [$width]', style: TextStyle(fontSize: fontSize)), + ), + PopupMenuItem( + height: itemHeight, + value: BitExpansionMenuValues.defineFields, + child: Text( + 'Define Bit Fields [$width]...', + style: TextStyle(fontSize: fontSize), ), - ]; + ), + ]; +} /// Translate a popup-menu [value] returned by `showMenu` into a /// [BitExpansionAction], showing any follow-up dialog as needed. @@ -123,9 +122,7 @@ Future resolveBitExpansionMenuValue( signalName: signalName, width: width, ); - if (parsed == null) { - return null; - } + if (parsed == null) return null; final (high, low) = parsed; return BitExpandRangeAction(low, high); } @@ -135,9 +132,7 @@ Future resolveBitExpansionMenuValue( signalName: signalName, width: width, ); - if (fields == null || fields.isEmpty) { - return null; - } + if (fields == null || fields.isEmpty) return null; return BitDefineFieldsAction(fields); } return null; diff --git a/packages/rohd_devtools_widgets/lib/src/bit_field_utils.dart b/packages/rohd_devtools_widgets/lib/src/bit_field_utils.dart index 9b705cdfd8..111d0e8b40 100644 --- a/packages/rohd_devtools_widgets/lib/src/bit_field_utils.dart +++ b/packages/rohd_devtools_widgets/lib/src/bit_field_utils.dart @@ -20,7 +20,6 @@ class BitFieldDef { /// Low bit (inclusive, LSB of the field). final int low; - /// Creates a bit-field definition. const BitFieldDef({ required this.name, required this.high, @@ -51,22 +50,16 @@ abstract final class BitFieldUtils { static (int, int)? parseBitRange(String input, int maxBit) { if (input.contains(':')) { final parts = input.split(':'); - if (parts.length != 2) { - return null; - } + if (parts.length != 2) return null; final high = int.tryParse(parts[0].trim()); final low = int.tryParse(parts[1].trim()); - if (high == null || low == null) { - return null; - } + if (high == null || low == null) return null; final h = high.clamp(0, maxBit); final l = low.clamp(0, maxBit); return h >= l ? (h, l) : (l, h); } final bit = int.tryParse(input); - if (bit == null) { - return null; - } + if (bit == null) return null; final clamped = bit.clamp(0, maxBit); return (clamped, clamped); } @@ -83,9 +76,7 @@ abstract final class BitFieldUtils { final fields = []; for (final rawLine in lines) { final line = rawLine.trim(); - if (line.isEmpty) { - continue; - } + if (line.isEmpty) continue; final tokens = _splitAsciiWhitespace(line); // Try: name high:low @@ -167,9 +158,7 @@ abstract final class BitFieldUtils { } static bool _isWord(String value) { - if (value.isEmpty) { - return false; - } + if (value.isEmpty) return false; for (var i = 0; i < value.length; i++) { final char = value.codeUnitAt(i); final isUppercase = char >= 65 && char <= 90; @@ -184,14 +173,10 @@ abstract final class BitFieldUtils { } static bool _isUnsignedDecimal(String value) { - if (value.isEmpty) { - return false; - } + if (value.isEmpty) return false; for (var i = 0; i < value.length; i++) { final char = value.codeUnitAt(i); - if (char < 48 || char > 57) { - return false; - } + if (char < 48 || char > 57) return false; } return true; } @@ -223,37 +208,37 @@ Future<(int, int)?> showBitRangeDialog( final result = await showDialog( context: context, barrierColor: Colors.black26, - builder: (ctx) => AlertDialog( - title: Text( - '$signalName [$width bits]', - style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold), - ), - content: TextField( - controller: controller, - autofocus: true, - decoration: InputDecoration( - labelText: 'Bit range (high:low) or single bit', - hintText: '$maxBit:0', - isDense: true, + builder: (ctx) { + return AlertDialog( + title: Text( + '$signalName [$width bits]', + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold), ), - onSubmitted: (value) => Navigator.of(ctx).pop(value), - ), - actions: [ - TextButton( - onPressed: () => Navigator.of(ctx).pop(), - child: const Text('Cancel'), - ), - TextButton( - onPressed: () => Navigator.of(ctx).pop(controller.text), - child: const Text('OK'), + content: TextField( + controller: controller, + autofocus: true, + decoration: InputDecoration( + labelText: 'Bit range (high:low) or single bit', + hintText: '$maxBit:0', + isDense: true, + ), + onSubmitted: (value) => Navigator.of(ctx).pop(value), ), - ], - ), + actions: [ + TextButton( + onPressed: () => Navigator.of(ctx).pop(), + child: const Text('Cancel'), + ), + TextButton( + onPressed: () => Navigator.of(ctx).pop(controller.text), + child: const Text('OK'), + ), + ], + ); + }, ); - if (result == null || result.trim().isEmpty) { - return null; - } + if (result == null || result.trim().isEmpty) return null; return BitFieldUtils.parseBitRange(result.trim(), maxBit); } @@ -272,11 +257,12 @@ Future?> showDefineBitFieldsDialog( // newline and place the cursor at the end so the user can immediately // type additional fields without accidentally replacing existing ones. final hasExisting = existingDefs != null && existingDefs.isNotEmpty; - String formatField(BitFieldDef field) => field.high == field.low - ? '${field.name} ${field.high}' - : '${field.name} ${field.high}:${field.low}'; final initialText = hasExisting - ? '${existingDefs.map(formatField).join('\n')}\n' + ? '${existingDefs.map((f) { + return f.high == f.low + ? '${f.name} ${f.high}' + : '${f.name} ${f.high}:${f.low}'; + }).join('\n')}\n' : 'field0 $maxBit:0'; final controller = TextEditingController(text: initialText); @@ -296,44 +282,44 @@ Future?> showDefineBitFieldsDialog( final result = await showDialog( context: context, barrierColor: Colors.black26, - builder: (ctx) => AlertDialog( - title: Text( - '$signalName [$width bits] — Define Fields', - style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold), - ), - content: SizedBox( - width: 320, - child: TextField( - controller: controller, - autofocus: true, - maxLines: 8, - minLines: 3, - style: const TextStyle(fontFamily: 'monospace', fontSize: 13), - decoration: InputDecoration( - labelText: 'One field per line: name high:low', - hintText: 'exponent $maxBit:${maxBit - 10}\n' - 'mantissa ${maxBit - 11}:0', - isDense: true, - border: const OutlineInputBorder(), - ), + builder: (ctx) { + return AlertDialog( + title: Text( + '$signalName [$width bits] — Define Fields', + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold), ), - ), - actions: [ - TextButton( - onPressed: () => Navigator.of(ctx).pop(), - child: const Text('Cancel'), - ), - TextButton( - onPressed: () => Navigator.of(ctx).pop(controller.text), - child: const Text('OK'), + content: SizedBox( + width: 320, + child: TextField( + controller: controller, + autofocus: true, + maxLines: 8, + minLines: 3, + style: const TextStyle(fontFamily: 'monospace', fontSize: 13), + decoration: InputDecoration( + labelText: 'One field per line: name high:low', + hintText: 'exponent $maxBit:${maxBit - 10}\n' + 'mantissa ${maxBit - 11}:0', + isDense: true, + border: const OutlineInputBorder(), + ), + ), ), - ], - ), + actions: [ + TextButton( + onPressed: () => Navigator.of(ctx).pop(), + child: const Text('Cancel'), + ), + TextButton( + onPressed: () => Navigator.of(ctx).pop(controller.text), + child: const Text('OK'), + ), + ], + ); + }, ); - if (result == null || result.trim().isEmpty) { - return null; - } + if (result == null || result.trim().isEmpty) return null; final fields = BitFieldUtils.parseBitFieldDefs(result, maxBit); return fields.isEmpty ? null : fields; } diff --git a/packages/rohd_devtools_widgets/lib/src/cross_probe_button.dart b/packages/rohd_devtools_widgets/lib/src/cross_probe_button.dart index 857ed07c94..618587f52d 100644 --- a/packages/rohd_devtools_widgets/lib/src/cross_probe_button.dart +++ b/packages/rohd_devtools_widgets/lib/src/cross_probe_button.dart @@ -7,9 +7,9 @@ // 2026 June // Author: Desmond Kirkpatrick -import 'package:flutter/foundation.dart'; import 'package:material_ui/material_ui.dart'; -import 'package:rohd_devtools_widgets/src/cross_probe_service.dart'; + +import 'cross_probe_service.dart'; /// A toolbar icon button for cross-probing signal selections between viewers. /// @@ -27,27 +27,23 @@ class CrossProbeButton extends StatelessWidget { const CrossProbeButton({required this.service, super.key}); @override - Widget build(BuildContext context) => ValueListenableBuilder( - valueListenable: service.isActive, - builder: (context, active, _) { - final color = active - ? Theme.of(context).colorScheme.primary - : Theme.of(context).disabledColor; - return Tooltip( - message: active - ? 'Cross-probing active — tap to disable' - : 'Cross-probing disabled — tap to enable', - child: IconButton( - icon: Icon(Icons.compare_arrows, color: color), - onPressed: () => service.isActive.value = !service.isActive.value, - ), - ); - }, - ); - - @override - void debugFillProperties(DiagnosticPropertiesBuilder properties) { - super.debugFillProperties(properties); - properties.add(DiagnosticsProperty('service', service)); + Widget build(BuildContext context) { + return ValueListenableBuilder( + valueListenable: service.isActive, + builder: (context, active, _) { + final color = active + ? Theme.of(context).colorScheme.primary + : Theme.of(context).disabledColor; + return Tooltip( + message: active + ? 'Cross-probing active — tap to disable' + : 'Cross-probing disabled — tap to enable', + child: IconButton( + icon: Icon(Icons.compare_arrows, color: color), + onPressed: () => service.isActive.value = !service.isActive.value, + ), + ); + }, + ); } } diff --git a/packages/rohd_devtools_widgets/lib/src/cross_probe_menu.dart b/packages/rohd_devtools_widgets/lib/src/cross_probe_menu.dart index e018ab82b1..3d254c8db8 100644 --- a/packages/rohd_devtools_widgets/lib/src/cross_probe_menu.dart +++ b/packages/rohd_devtools_widgets/lib/src/cross_probe_menu.dart @@ -27,17 +27,28 @@ typedef AvailableSourceFormats = List Function(); /// Invoked when the user picks `Go to Source` for [signalPaths]. typedef GoToSourceCallback = void Function( - RohdSourceFormat format, List signalPaths); + RohdSourceFormat format, + List signalPaths, +); /// Builds an icon for a source/output [format]. -typedef SourceFormatIconBuilder = Widget Function(RohdSourceFormat format, - {double size}); +typedef SourceFormatIconBuilder = Widget Function( + RohdSourceFormat format, { + double size, +}); /// Prefix used to encode source-navigation entries in a `String`-valued popup /// menu (e.g. `'goto_source:rohd'`). Allows the shared items to coexist with /// each viewer's other `String` menu values. const String _gotoSourceValuePrefix = 'goto_source:'; +/// Formats shown when source availability is unknown (module info not yet +/// loaded, the extension is unreachable, or the query errored). +const List kDefaultNavigableFormats = [ + RohdSourceFormat.rohd, + RohdSourceFormat.sv, +]; + /// Encode a popup-menu value for navigating to [format]. String gotoSourceMenuValue(RohdSourceFormat format) => '$_gotoSourceValuePrefix${format.name}'; @@ -207,11 +218,13 @@ Widget sourceFormatIconStrip({ /// Resolve which navigable source formats to display for [info]. /// /// When [info] is `null`, the extension is unavailable, or the query errored, -/// no formats are returned because availability has not been confirmed. -/// Otherwise the exact set of usable navigable formats is returned. +/// availability is treated as *unknown* and [kDefaultNavigableFormats] is +/// returned so the actions stay available while metadata converges. +/// Otherwise the exact set of usable navigable formats is returned (which may +/// be empty when the module genuinely has no source). List resolveNavigableFormats(RohdModuleInfo? info) { if (info == null || !info.extensionAvailable || info.error != null) { - return const []; + return kDefaultNavigableFormats; } return info.navigableSourceFormats; } diff --git a/packages/rohd_devtools_widgets/lib/src/export_button.dart b/packages/rohd_devtools_widgets/lib/src/export_button.dart index 4db7615818..837aa544ed 100644 --- a/packages/rohd_devtools_widgets/lib/src/export_button.dart +++ b/packages/rohd_devtools_widgets/lib/src/export_button.dart @@ -7,7 +7,6 @@ // 2026 April // Author: Desmond Kirkpatrick -import 'package:flutter/foundation.dart'; import 'package:material_ui/material_ui.dart'; /// Small camera-icon button for triggering PNG export. @@ -21,10 +20,9 @@ class ExportPngButton extends StatelessWidget { /// Tooltip text shown on hover. final String tooltip; - /// Creates a PNG export button. const ExportPngButton({ - required this.onPressed, super.key, + required this.onPressed, this.tooltip = 'Export as PNG', }); @@ -52,12 +50,4 @@ class ExportPngButton extends StatelessWidget { ), ); } - - @override - void debugFillProperties(DiagnosticPropertiesBuilder properties) { - super.debugFillProperties(properties); - properties - ..add(ObjectFlagProperty.has('onPressed', onPressed)) - ..add(StringProperty('tooltip', tooltip)); - } } diff --git a/packages/rohd_devtools_widgets/lib/src/logic_type_utils.dart b/packages/rohd_devtools_widgets/lib/src/logic_type_utils.dart index d9602c5c3c..adf89e9287 100644 --- a/packages/rohd_devtools_widgets/lib/src/logic_type_utils.dart +++ b/packages/rohd_devtools_widgets/lib/src/logic_type_utils.dart @@ -271,9 +271,9 @@ String _extractContiguousBits(String binaryValue, int startBit, int width) { final totalWidth = binaryValue.length; final endBit = startBit + width; // exclusive if (startBit >= 0 && endBit <= totalWidth) { - return LogicValue.ofString( - binaryValue, - ).slice(endBit - 1, startBit).toString(includeWidth: false); + return LogicValue.ofString(binaryValue) + .slice(endBit - 1, startBit) + .toString(includeWidth: false); } final result = StringBuffer(); @@ -309,9 +309,9 @@ String? hexToBinary(String hexValue, int width) { final sourceWidth = cleaned.length * 4; final parseWidth = sourceWidth > width ? sourceWidth : width; try { - return LogicValue.ofRadixString( - "$parseWidth'h$cleaned", - ).slice(width - 1, 0).toString(includeWidth: false); + return LogicValue.ofRadixString("$parseWidth'h$cleaned") + .slice(width - 1, 0) + .toString(includeWidth: false); } on Exception { return null; } diff --git a/packages/rohd_devtools_widgets/lib/src/markdown_help_button.dart b/packages/rohd_devtools_widgets/lib/src/markdown_help_button.dart index d9717639fc..390e970baa 100644 --- a/packages/rohd_devtools_widgets/lib/src/markdown_help_button.dart +++ b/packages/rohd_devtools_widgets/lib/src/markdown_help_button.dart @@ -20,9 +20,6 @@ // 2026 March // Author: Desmond Kirkpatrick -import 'dart:async'; - -import 'package:flutter/foundation.dart'; import 'package:material_ui/material_ui.dart'; /// A help button that loads its content from a markdown asset file. @@ -112,22 +109,6 @@ class MarkdownHelpButton extends StatefulWidget { @override State createState() => _MarkdownHelpButtonState(); - - @override - void debugFillProperties(DiagnosticPropertiesBuilder properties) { - super.debugFillProperties(properties); - properties - ..add(StringProperty('assetPath', assetPath)) - ..add(DiagnosticsProperty('isDark', isDark)) - ..add(StringProperty('label', label)) - ..add(StringProperty('package', package)) - ..add( - DiagnosticsProperty?>( - 'substitutions', - substitutions, - ), - ); - } } class _MarkdownHelpButtonState extends State { @@ -137,7 +118,7 @@ class _MarkdownHelpButtonState extends State { @override void didChangeDependencies() { super.didChangeDependencies(); - unawaited(_loadContent()); + _loadContent(); } @override @@ -145,7 +126,7 @@ class _MarkdownHelpButtonState extends State { super.didUpdateWidget(oldWidget); if (oldWidget.assetPath != widget.assetPath || oldWidget.package != widget.package) { - unawaited(_loadContent()); + _loadContent(); } } @@ -319,57 +300,53 @@ class _MarkdownHelpButtonState extends State { } } - unawaited( - showDialog( - context: context, - builder: (ctx) => Dialog( - backgroundColor: bgColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - ), - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 600, maxHeight: 600), - child: Padding( - padding: const EdgeInsets.all(24), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Title row - Row( - children: [ - if (titleIcon != null) ...[ - titleIcon, - const SizedBox(width: 10), - ], - Expanded( - child: Text( - content.title, - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - color: fgColor, - ), - ), - ), - IconButton( - icon: Icon(Icons.close, color: fgColor, size: 20), - onPressed: () => Navigator.of(ctx).pop(), - ), + showDialog( + context: context, + builder: (ctx) => Dialog( + backgroundColor: bgColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 600, maxHeight: 600), + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Title row + Row( + children: [ + if (titleIcon != null) ...[ + titleIcon, + const SizedBox(width: 10), ], - ), - Divider(color: dividerColor), - // Scrollable content - Flexible( - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: widgets, + Expanded( + child: Text( + content.title, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: fgColor, + ), ), ), + IconButton( + icon: Icon(Icons.close, color: fgColor, size: 20), + onPressed: () => Navigator.of(ctx).pop(), + ), + ], + ), + Divider(color: dividerColor), + // Scrollable content + Flexible( + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: widgets, + ), ), - ], - ), + ), + ], ), ), ), @@ -411,7 +388,7 @@ class _HelpContent { final title = _extractTitle(raw) ?? 'Help'; // Extract tooltip text. - var tooltip = ''; + String tooltip = ''; if (tooltipIdx >= 0 && detailsIdx > tooltipIdx) { tooltip = raw.substring(tooltipIdx + tooltipMarker.length, detailsIdx).trim(); @@ -436,7 +413,7 @@ class _HelpContent { final blocks = <_DetailBlock>[]; final lines = raw.split('\n'); - for (var i = 0; i < lines.length; i++) { + for (int i = 0; i < lines.length; i++) { final line = lines[i]; final trimmed = line.trim(); diff --git a/packages/rohd_devtools_widgets/lib/src/signal_value_format_menu.dart b/packages/rohd_devtools_widgets/lib/src/signal_value_format_menu.dart new file mode 100644 index 0000000000..9e24c841ad --- /dev/null +++ b/packages/rohd_devtools_widgets/lib/src/signal_value_format_menu.dart @@ -0,0 +1,89 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// signal_value_format_menu.dart +// Shared display-format menu for signal occurrence surfaces. +// +// 2026 September 29 +// Author: Desmond Kirkpatrick + +import 'package:material_ui/material_ui.dart'; +import 'package:rohd_devtools_widgets/src/cross_probe_menu.dart' + show buildRohdPopupMenuItem; +import 'package:rohd_devtools_widgets/src/signal_value_format_registry.dart'; +import 'package:rohd_hierarchy/rohd_hierarchy.dart' show OccurrenceAddress; + +/// Popup-menu value used to open the signal display-format submenu. +const signalValueFormatMenuValue = 'signal_format_as'; + +/// Builds the command that opens the signal display-format submenu. +PopupMenuItem buildSignalValueFormatMenuItem({required int count}) => + buildRohdPopupMenuItem( + value: signalValueFormatMenuValue, + icon: const Icon(Icons.numbers, size: 16), + label: count == 1 ? 'Format As' : 'Format $count Signals As', + textStyle: const TextStyle(fontSize: 13), + ); + +/// Shows signal display-format choices and returns the selected format. +/// +/// When [addresses] is non-empty, the shared format registry is updated before +/// the selected value is returned. +Future showSignalValueFormatMenu( + BuildContext context, { + required Offset globalPosition, + Iterable addresses = const [], +}) async { + final overlay = Overlay.of(context).context.findRenderObject()! as RenderBox; + final local = overlay.globalToLocal(globalPosition); + final selectedFormat = await showMenu( + context: context, + position: RelativeRect.fromLTRB( + local.dx, + local.dy, + overlay.size.width - local.dx, + overlay.size.height - local.dy, + ), + items: SignalValueFormat.values + .map( + (format) => buildRohdPopupMenuItem( + value: format, + icon: Icon(_iconFor(format), size: 16), + label: _labelFor(format), + textStyle: const TextStyle(fontSize: 13), + ), + ) + .toList(), + ); + if (selectedFormat == null) { + return null; + } + final resolvedAddresses = addresses.whereType().toList(); + if (resolvedAddresses.isNotEmpty) { + SignalValueFormatRegistry.setFormatFor( + resolvedAddresses, + selectedFormat, + ); + } + return selectedFormat; +} + +String _labelFor(SignalValueFormat format) => switch (format) { + SignalValueFormat.waveform => 'Waveform Default', + SignalValueFormat.binary => 'Binary', + SignalValueFormat.hexadecimal => 'Hexadecimal', + SignalValueFormat.unsignedDecimal => 'Unsigned Decimal', + SignalValueFormat.signedDecimal => 'Signed Decimal', + SignalValueFormat.octal => 'Octal', + SignalValueFormat.ascii => 'ASCII', + }; + +IconData _iconFor(SignalValueFormat format) => switch (format) { + SignalValueFormat.waveform => Icons.timeline, + SignalValueFormat.binary => Icons.looks_one, + SignalValueFormat.hexadecimal => Icons.tag, + SignalValueFormat.unsignedDecimal => Icons.pin, + SignalValueFormat.signedDecimal => Icons.plus_one, + SignalValueFormat.octal => Icons.filter_8, + SignalValueFormat.ascii => Icons.text_fields, + }; diff --git a/packages/rohd_devtools_widgets/lib/src/signal_value_format_registry.dart b/packages/rohd_devtools_widgets/lib/src/signal_value_format_registry.dart index 379fac5561..1c80790816 100644 --- a/packages/rohd_devtools_widgets/lib/src/signal_value_format_registry.dart +++ b/packages/rohd_devtools_widgets/lib/src/signal_value_format_registry.dart @@ -206,7 +206,8 @@ class SignalValueFormatRegistry { ), SignalValueFormat.signedDecimal => logicValue.toBigInt().toSigned(logicValue.width).toString(), - SignalValueFormat.octal => _formatOctal(logicValue), + SignalValueFormat.octal => + '0o${logicValue.toRadixString(radix: 8, includeWidth: false, sepChar: '')}', SignalValueFormat.ascii => () { final byteCount = (logicValue.width + 7) ~/ 8; return String.fromCharCodes( @@ -223,9 +224,6 @@ class SignalValueFormatRegistry { }; } - static String _formatOctal(LogicValue value) => - '0o${value.toRadixString(radix: 8, includeWidth: false, sepChar: '')}'; - /// Parses [value] as a waveform literal and returns it with its canonical /// waveform representation. static (LogicValue, String)? _waveformValue(String value, int width) { diff --git a/packages/rohd_devtools_widgets/pubspec.yaml b/packages/rohd_devtools_widgets/pubspec.yaml index 3226381732..c5216f8c42 100644 --- a/packages/rohd_devtools_widgets/pubspec.yaml +++ b/packages/rohd_devtools_widgets/pubspec.yaml @@ -1,7 +1,6 @@ name: rohd_devtools_widgets description: "Shared Flutter widgets and utilities for ROHD debug tools, including cross-probing, signal formatting, help, and PNG export." -version: 0.1.1 -publish_to: none +version: 0.1.0 homepage: https://intel.github.io/rohd-website/ repository: https://github.com/intel/rohd/tree/main/packages/rohd_devtools_widgets issue_tracker: https://github.com/intel/rohd/issues @@ -9,12 +8,11 @@ environment: sdk: '>=3.6.0 <4.0.0' flutter: '>=3.44.0' dependencies: - cupertino_ui: '>=1.0.0 <1.1.0' flutter: {sdk: flutter} - material_ui: '>=1.1.0 <1.3.0' - rohd: ^0.6.10 - rohd_hierarchy: - path: ../rohd_hierarchy + # Keep the modern Material compatibility layer below its Dart 3.6-incompatible release. + material_ui: ">=1.1.0 <1.3.0" + rohd: ^0.6.9 + rohd_hierarchy: ^0.2.0 web: ^1.0.0 dev_dependencies: flutter_test: {sdk: flutter} diff --git a/packages/rohd_devtools_widgets/pubspec_overrides.yaml b/packages/rohd_devtools_widgets/pubspec_overrides.yaml deleted file mode 100644 index c5a70b57ae..0000000000 --- a/packages/rohd_devtools_widgets/pubspec_overrides.yaml +++ /dev/null @@ -1,3 +0,0 @@ -dependency_overrides: - rohd: - path: ../.. \ No newline at end of file diff --git a/packages/rohd_devtools_widgets/test/app_bar_overlay_test.dart b/packages/rohd_devtools_widgets/test/app_bar_overlay_test.dart index 99b74332a5..cd7a3e2a82 100644 --- a/packages/rohd_devtools_widgets/test/app_bar_overlay_test.dart +++ b/packages/rohd_devtools_widgets/test/app_bar_overlay_test.dart @@ -9,8 +9,8 @@ import 'dart:ui' show PointerDeviceKind; -import 'package:flutter_test/flutter_test.dart'; import 'package:material_ui/material_ui.dart'; +import 'package:flutter_test/flutter_test.dart'; import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart'; void main() { diff --git a/packages/rohd_devtools_widgets/test/bit_expansion_menu_test.dart b/packages/rohd_devtools_widgets/test/bit_expansion_menu_test.dart index 5c21d5bf22..f4a5177176 100644 --- a/packages/rohd_devtools_widgets/test/bit_expansion_menu_test.dart +++ b/packages/rohd_devtools_widgets/test/bit_expansion_menu_test.dart @@ -7,8 +7,8 @@ // 2026 July // Author: Desmond Kirkpatrick -import 'package:flutter_test/flutter_test.dart'; import 'package:material_ui/material_ui.dart'; +import 'package:flutter_test/flutter_test.dart'; import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart'; void main() { @@ -115,7 +115,7 @@ void main() { await tester.tap(find.text('OK')); await tester.pumpAndSettle(); - final range = (await rangeFuture)! as BitExpandRangeAction; + final range = await rangeFuture as BitExpandRangeAction; expect(range.bitStart, 3); expect(range.bitEnd, 6); @@ -130,7 +130,7 @@ void main() { await tester.tap(find.text('OK')); await tester.pumpAndSettle(); - final fields = (await fieldsFuture)! as BitDefineFieldsAction; + final fields = await fieldsFuture as BitDefineFieldsAction; expect(fields.fields.map((field) => field.name), ['upper', 'lower']); }); } diff --git a/packages/rohd_devtools_widgets/test/bit_field_utils_test.dart b/packages/rohd_devtools_widgets/test/bit_field_utils_test.dart index a72f62197b..73ff4cb1e3 100644 --- a/packages/rohd_devtools_widgets/test/bit_field_utils_test.dart +++ b/packages/rohd_devtools_widgets/test/bit_field_utils_test.dart @@ -7,8 +7,8 @@ // 2026 July // Author: Desmond Kirkpatrick -import 'package:flutter_test/flutter_test.dart'; import 'package:material_ui/material_ui.dart'; +import 'package:flutter_test/flutter_test.dart'; import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart'; void main() { diff --git a/packages/rohd_devtools_widgets/test/capture_boundary_test.dart b/packages/rohd_devtools_widgets/test/capture_boundary_test.dart index 679a59cfab..a27221697e 100644 --- a/packages/rohd_devtools_widgets/test/capture_boundary_test.dart +++ b/packages/rohd_devtools_widgets/test/capture_boundary_test.dart @@ -9,9 +9,9 @@ import 'dart:typed_data'; +import 'package:material_ui/material_ui.dart'; import 'package:flutter/rendering.dart' show RenderRepaintBoundary; import 'package:flutter_test/flutter_test.dart'; -import 'package:material_ui/material_ui.dart'; import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart'; void main() { @@ -103,7 +103,7 @@ void main() { find.byWidgetPredicate( (widget) => widget is Text && - (widget.data?.startsWith('Saved: /tmp/wave_') ?? false), + widget.data?.startsWith('Saved: /tmp/wave_') == true, ), findsOneWidget, ); @@ -136,7 +136,7 @@ void main() { find.byWidgetPredicate( (widget) => widget is Text && - (widget.data?.startsWith('Downloaded capture_') ?? false), + widget.data?.startsWith('Downloaded capture_') == true, ), findsOneWidget, ); diff --git a/packages/rohd_devtools_widgets/test/cross_probe_button_test.dart b/packages/rohd_devtools_widgets/test/cross_probe_button_test.dart index 961beb70ce..f8f03f1210 100644 --- a/packages/rohd_devtools_widgets/test/cross_probe_button_test.dart +++ b/packages/rohd_devtools_widgets/test/cross_probe_button_test.dart @@ -7,8 +7,8 @@ // 2026 July // Author: Desmond Kirkpatrick -import 'package:flutter_test/flutter_test.dart'; import 'package:material_ui/material_ui.dart'; +import 'package:flutter_test/flutter_test.dart'; import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart'; void main() { diff --git a/packages/rohd_devtools_widgets/test/cross_probe_menu_test.dart b/packages/rohd_devtools_widgets/test/cross_probe_menu_test.dart index 3174829036..c40c0c04b2 100644 --- a/packages/rohd_devtools_widgets/test/cross_probe_menu_test.dart +++ b/packages/rohd_devtools_widgets/test/cross_probe_menu_test.dart @@ -30,14 +30,17 @@ void main() { ); }); - test('resolves only confirmed navigable formats', () { - expect(resolveNavigableFormats(null), isEmpty); - expect(resolveNavigableFormats(RohdModuleInfo.unavailable), isEmpty); + test('resolves default and exact navigable formats', () { + expect(resolveNavigableFormats(null), kDefaultNavigableFormats); + expect( + resolveNavigableFormats(RohdModuleInfo.unavailable), + kDefaultNavigableFormats, + ); expect( resolveNavigableFormats( const RohdModuleInfo(extensionAvailable: true, error: 'not ready'), ), - isEmpty, + kDefaultNavigableFormats, ); expect( resolveNavigableFormats( @@ -81,7 +84,6 @@ void main() { ); expect(items, hasLength(2)); - expect(items, everyElement(isA>())); expect(items[0].value, 'goto_source:rohd'); expect(items[1].value, 'goto_source:sv'); diff --git a/packages/rohd_devtools_widgets/test/export_button_test.dart b/packages/rohd_devtools_widgets/test/export_button_test.dart index e4049e50a3..af5fe1f9f7 100644 --- a/packages/rohd_devtools_widgets/test/export_button_test.dart +++ b/packages/rohd_devtools_widgets/test/export_button_test.dart @@ -7,8 +7,8 @@ // 2026 July // Author: Desmond Kirkpatrick -import 'package:flutter_test/flutter_test.dart'; import 'package:material_ui/material_ui.dart'; +import 'package:flutter_test/flutter_test.dart'; import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart'; void main() { diff --git a/packages/rohd_devtools_widgets/test/export_toast_test.dart b/packages/rohd_devtools_widgets/test/export_toast_test.dart index 88e8200a97..2138404f91 100644 --- a/packages/rohd_devtools_widgets/test/export_toast_test.dart +++ b/packages/rohd_devtools_widgets/test/export_toast_test.dart @@ -7,8 +7,8 @@ // 2026 July // Author: Desmond Kirkpatrick -import 'package:flutter_test/flutter_test.dart'; import 'package:material_ui/material_ui.dart'; +import 'package:flutter_test/flutter_test.dart'; import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart'; void main() { diff --git a/packages/rohd_devtools_widgets/test/markdown_help_button_test.dart b/packages/rohd_devtools_widgets/test/markdown_help_button_test.dart index 910c3fd35d..e3e7ad6436 100644 --- a/packages/rohd_devtools_widgets/test/markdown_help_button_test.dart +++ b/packages/rohd_devtools_widgets/test/markdown_help_button_test.dart @@ -9,9 +9,9 @@ import 'dart:convert'; +import 'package:material_ui/material_ui.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:material_ui/material_ui.dart'; import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart'; void main() { diff --git a/packages/rohd_devtools_widgets/test/signal_value_format_registry_test.dart b/packages/rohd_devtools_widgets/test/signal_value_format_registry_test.dart index 0786f9aec3..47c937ab88 100644 --- a/packages/rohd_devtools_widgets/test/signal_value_format_registry_test.dart +++ b/packages/rohd_devtools_widgets/test/signal_value_format_registry_test.dart @@ -94,11 +94,7 @@ void main() { "8'hff", ); expect( - SignalValueFormatRegistry.formatValue( - '1010', - SignalValueFormat.octal, - 4, - ), + SignalValueFormatRegistry.formatValue('1010', SignalValueFormat.octal, 4), '0o12', ); expect( @@ -131,12 +127,9 @@ void main() { }); test('looks up an occurrence address from the format trie', () { - SignalValueFormatRegistry.setFormatFor( - [ - const OccurrenceAddress([0, 2, 4]), - ], - SignalValueFormat.signedDecimal, - ); + SignalValueFormatRegistry.setFormatFor([ + const OccurrenceAddress([0, 2, 4]), + ], SignalValueFormat.signedDecimal); expect( SignalValueFormatRegistry.formatFor(const OccurrenceAddress([0, 2, 4])), @@ -145,12 +138,9 @@ void main() { }); test('looks up a fallback occurrence address', () { - SignalValueFormatRegistry.setFormatFor( - [ - const OccurrenceAddress([0, 2, 4]), - ], - SignalValueFormat.unsignedDecimal, - ); + SignalValueFormatRegistry.setFormatFor([ + const OccurrenceAddress([0, 2, 4]), + ], SignalValueFormat.unsignedDecimal); expect( SignalValueFormatRegistry.formatForAny([ @@ -189,26 +179,23 @@ void main() { test('rejects an invalid signal occurrence address', () { expect( - () => SignalValueFormatRegistry.setFormatFor( - const [OccurrenceAddress.root], - SignalValueFormat.unsignedDecimal, - ), + () => SignalValueFormatRegistry.setFormatFor(const [ + OccurrenceAddress.root, + ], SignalValueFormat.unsignedDecimal), throwsArgumentError, ); expect( - () => SignalValueFormatRegistry.formatFor( - const OccurrenceAddress([0, -1]), - ), + () => + SignalValueFormatRegistry.formatFor(const OccurrenceAddress([0, -1])), throwsArgumentError, ); }); test('preserves registry state when a preference batch is invalid', () { const address = OccurrenceAddress([0, 2, 4]); - SignalValueFormatRegistry.setFormatFor( - [address], - SignalValueFormat.unsignedDecimal, - ); + SignalValueFormatRegistry.setFormatFor([ + address, + ], SignalValueFormat.unsignedDecimal); final changesBefore = SignalValueFormatRegistry.changes.value; expect( @@ -221,28 +208,31 @@ void main() { ]), throwsArgumentError, ); - expect(SignalValueFormatRegistry.formatFor(address), - SignalValueFormat.unsignedDecimal); + expect( + SignalValueFormatRegistry.formatFor(address), + SignalValueFormat.unsignedDecimal, + ); expect(SignalValueFormatRegistry.changes.value, changesBefore); }); test('preserves registry state when an address batch is invalid', () { const address = OccurrenceAddress([0, 2, 4]); - SignalValueFormatRegistry.setFormatFor( - [address], - SignalValueFormat.unsignedDecimal, - ); + SignalValueFormatRegistry.setFormatFor([ + address, + ], SignalValueFormat.unsignedDecimal); final changesBefore = SignalValueFormatRegistry.changes.value; expect( - () => SignalValueFormatRegistry.setFormatFor( - [address, OccurrenceAddress.root], - SignalValueFormat.signedDecimal, - ), + () => SignalValueFormatRegistry.setFormatFor([ + address, + OccurrenceAddress.root, + ], SignalValueFormat.signedDecimal), throwsArgumentError, ); - expect(SignalValueFormatRegistry.formatFor(address), - SignalValueFormat.unsignedDecimal); + expect( + SignalValueFormatRegistry.formatFor(address), + SignalValueFormat.unsignedDecimal, + ); expect(SignalValueFormatRegistry.changes.value, changesBefore); }); @@ -252,9 +242,7 @@ void main() { SignalValueFormat.signedDecimal, ); expect( - SignalValueFormatRegistry.formatToString( - SignalValueFormat.signedDecimal, - ), + SignalValueFormatRegistry.formatToString(SignalValueFormat.signedDecimal), 'signedDecimal', ); expect(SignalValueFormatRegistry.formatFromString('unknown'), isNull); diff --git a/packages/rohd_waveform/lib/src/models/signal_waveform.dart b/packages/rohd_waveform/lib/src/models/signal_waveform.dart index 06780d300d..c076468b61 100644 --- a/packages/rohd_waveform/lib/src/models/signal_waveform.dart +++ b/packages/rohd_waveform/lib/src/models/signal_waveform.dart @@ -16,6 +16,42 @@ import 'package:rohd_waveform/src/models/waveform_data.dart'; /// Function type for looking up signal metadata by ID. typedef SignalLookup = SignalOccurrence? Function(String signalId); +/// Criterion used when searching waveform transitions. +enum WaveformSearchCriterion { + /// Match samples with an exact value. + value, + + /// Match low-to-high transitions. + risingEdge, + + /// Match high-to-low transitions. + fallingEdge, +} + +/// Display representation selected for a monitored waveform row. +enum MonitorValueFormat { + /// Render the signal using its waveform shape and labels. + waveform, + + /// Display numeric values as binary. + binary, + + /// Display numeric values as hexadecimal. + hexadecimal, + + /// Display numeric values as unsigned decimal. + unsignedDecimal, + + /// Display numeric values as signed decimal. + signedDecimal, + + /// Display numeric values as octal. + octal, + + /// Display numeric values as ASCII characters. + ascii, +} + /// Waveform data for a signal. /// /// This class holds the time-series waveform data for a signal and provides @@ -37,10 +73,27 @@ typedef SignalLookup = SignalOccurrence? Function(String signalId); /// print(waveform.name); // Uses lookup to get SignalOccurrence.name /// ``` class SignalWaveform { + static int _nextMonitorRow = 0; + /// The ID of the signal this waveform data belongs to. /// Use this to look up SignalOccurrence metadata from the hierarchy. final String signalId; + /// Identity for this monitor-list row. + /// + /// The first occurrence keeps [signalId] for compatibility. Copies used for + /// duplicate monitor rows receive a distinct ID unless one is provided. + final String monitorId; + + /// Parent monitor-row identity for generated fields and bit slices. + String? monitorParentId; + + /// Optional named group applied to this monitored row. + String? monitorGroup; + + /// Display representation selected for this monitored row. + MonitorValueFormat valueFormat; + /// The waveform data points (time, value pairs). final List data; @@ -57,8 +110,7 @@ class SignalWaveform { /// rather than directly fetched from the VM service. bool _isComputed; - /// Whether this waveform was computed/synthesized (e.g. gate evaluation) - /// rather than directly fetched from the VM service. + /// Whether this waveform was computed rather than directly sampled. bool get isComputed => _isComputed; /// Explicit width for a computed signal not present in the hierarchy. @@ -70,19 +122,32 @@ class SignalWaveform { /// Creates a new SignalWaveform. SignalWaveform({ required this.signalId, + String? monitorId, List? data, bool isComputed = false, - }) : _isComputed = isComputed, + this.overrideWidth, + this.overrideName, + this.monitorParentId, + this.monitorGroup, + this.valueFormat = MonitorValueFormat.waveform, + }) : monitorId = monitorId ?? signalId, + _isComputed = isComputed, data = data ?? []; /// Creates an empty SignalWaveform for a signal. - factory SignalWaveform.empty(String signalId) => - SignalWaveform(signalId: signalId); + factory SignalWaveform.empty(String signalId, {bool isComputed = false}) => + SignalWaveform(signalId: signalId, isComputed: isComputed); /// Creates a SignalWaveform from WaveformData. - factory SignalWaveform.fromWaveformData(WaveformData waveformData) => + /// + /// [signalId] may provide the canonical hierarchy path when the waveform + /// source uses a different identifier format. + factory SignalWaveform.fromWaveformData( + WaveformData waveformData, { + String? signalId, + }) => SignalWaveform( - signalId: waveformData.signalId, + signalId: signalId ?? waveformData.signalId, data: List.from(waveformData.data), isComputed: waveformData.isComputed, ); @@ -93,12 +158,22 @@ class SignalWaveform { /// times (e.g., for performance studies or side-by-side comparison). Each /// monitor entry must have its own SignalWaveform instance to avoid sharing /// state between rows in the waveform panel. - factory SignalWaveform.copyFrom(SignalWaveform other) => SignalWaveform( - signalId: other.signalId, - data: List.from(other.data), - isComputed: other.isComputed) - ..overrideWidth = other.overrideWidth - ..overrideName = other.overrideName; + factory SignalWaveform.copyFrom( + SignalWaveform other, { + String? monitorId, + bool? isComputed, + }) => + SignalWaveform( + signalId: other.signalId, + monitorId: monitorId ?? '${other.signalId}#${_nextMonitorRow++}', + data: List.from(other.data), + isComputed: isComputed ?? other.isComputed, + overrideWidth: other.overrideWidth, + overrideName: other.overrideName, + monitorParentId: other.monitorParentId, + monitorGroup: other.monitorGroup, + valueFormat: other.valueFormat, + ); // ───────────────────────────────────────────────────────────────────────── // Metadata accessors (via backpointer lookup) @@ -134,6 +209,14 @@ class SignalWaveform { /// The full hierarchical path (from metadata). String? get fullPath => signal?.path(); + /// Whether this waveform represents [occurrence]. + /// + /// Waveform sources can use different textual IDs for the same hierarchy + /// signal, so compare resolved occurrence addresses when metadata is present. + bool matchesOccurrence(SignalOccurrence occurrence) => + signalId == occurrence.path() || + (signal?.address != null && signal?.address == occurrence.address); + /// Whether this signal is a port (has direction). bool get isPort => signal?.isPort ?? false; @@ -355,6 +438,65 @@ class SignalWaveform { return idx >= 0 ? idx : -1; } + /// Finds the next sample after [currentTime] matching [criterion]. + int getNextMatchingDataPointIndex( + int currentTime, { + required WaveformSearchCriterion criterion, + String? value, + }) { + for (var index = getNextDataPointIndex(currentTime); + index != -1 && index < data.length; + index++) { + if (_matchesSearch(index, criterion, value)) { + return index; + } + } + return -1; + } + + /// Finds the previous sample before [currentTime] matching [criterion]. + int getPreviousMatchingDataPointIndex( + int currentTime, { + required WaveformSearchCriterion criterion, + String? value, + }) { + for (var index = getPreviousDataPointIndex(currentTime); + index >= 0; + index--) { + if (_matchesSearch(index, criterion, value)) { + return index; + } + } + return -1; + } + + bool _matchesSearch( + int index, + WaveformSearchCriterion criterion, + String? value, + ) { + final current = data[index].value; + if (criterion == WaveformSearchCriterion.value) { + return current == value; + } + if (index == 0) { + return false; + } + final wasHigh = _isHigh(data[index - 1].value); + final isHigh = _isHigh(current); + return criterion == WaveformSearchCriterion.risingEdge + ? !wasHigh && isHigh + : wasHigh && !isHigh; + } + + bool _isHigh(String value) { + final normalized = value.toLowerCase(); + return normalized == '1' || + normalized == "1'b1" || + normalized == "1'h1" || + normalized == 'true'; + } + @override String toString() => 'SignalWaveform($signalId, ${data.length} points)'; @@ -373,3 +515,28 @@ class SignalWaveform { [], ); } + +/// A monitored waveform row with a user-defined display name. +class MonitoredSignal extends SignalWaveform { + /// Display name used in the monitored-signal list. + final String displayName; + + /// Creates a named copy of an existing waveform. + MonitoredSignal.fromWaveform( + SignalWaveform waveform, { + required this.displayName, + }) : super( + signalId: waveform.signalId, + monitorId: waveform.monitorId, + data: List.from(waveform.data), + isComputed: waveform.isComputed, + overrideWidth: waveform.overrideWidth, + overrideName: displayName, + monitorParentId: waveform.monitorParentId, + monitorGroup: waveform.monitorGroup, + valueFormat: waveform.valueFormat, + ); + + @override + String get name => displayName; +} diff --git a/packages/rohd_waveform/test/signal_waveform_test.dart b/packages/rohd_waveform/test/signal_waveform_test.dart index e8f45f8bd7..b52b788995 100644 --- a/packages/rohd_waveform/test/signal_waveform_test.dart +++ b/packages/rohd_waveform/test/signal_waveform_test.dart @@ -45,7 +45,7 @@ void main() { { 'name': 'exponent', 'width': 5, - 'bits': [8, 9, 10, 11, 12] + 'bits': [8, 9, 10, 11, 12], }, ], }, @@ -70,6 +70,16 @@ void main() { wf.clearData(); expect(wf.isEmpty, isTrue); }); + + test('computed state is set when constructing or copying a waveform', () { + final computed = SignalWaveform.empty('s', isComputed: true); + final preserved = SignalWaveform.copyFrom(computed); + final overridden = SignalWaveform.copyFrom(computed, isComputed: false); + + expect(computed.isComputed, isTrue); + expect(preserved.isComputed, isTrue); + expect(overridden.isComputed, isFalse); + }); }); group('SignalWaveform.appendData', () { @@ -89,11 +99,14 @@ void main() { }); group('SignalWaveform.getValueByTime (binary search)', () { - final wf = SignalWaveform(signalId: 's', data: [ - Data(time: 0, value: '0'), - Data(time: 10, value: '1'), - Data(time: 20, value: '0'), - ]); + final wf = SignalWaveform( + signalId: 's', + data: [ + Data(time: 0, value: '0'), + Data(time: 10, value: '1'), + Data(time: 20, value: '0'), + ], + ); test('returns the value at or before a time', () { expect(wf.getValueByTime(0), '0'); @@ -113,12 +126,15 @@ void main() { }); group('SignalWaveform navigation indices', () { - final wf = SignalWaveform(signalId: 's', data: [ - Data(time: 0, value: '0'), - Data(time: 10, value: '1'), - Data(time: 10, value: '1'), - Data(time: 20, value: '0'), - ]); + final wf = SignalWaveform( + signalId: 's', + data: [ + Data(time: 0, value: '0'), + Data(time: 10, value: '1'), + Data(time: 10, value: '1'), + Data(time: 20, value: '0'), + ], + ); test('getNextDataPointIndex skips duplicates at current time', () { expect(wf.getNextDataPointIndex(0), 1); @@ -133,25 +149,83 @@ void main() { }); }); + group('SignalWaveform matching navigation', () { + final wf = SignalWaveform( + signalId: 's', + data: [ + Data(time: 0, value: '0'), + Data(time: 10, value: '1'), + Data(time: 20, value: '0'), + Data(time: 30, value: "1'b1"), + ], + ); + + test('finds values and edges in both directions', () { + expect( + wf.getNextMatchingDataPointIndex( + 0, + criterion: WaveformSearchCriterion.risingEdge, + ), + 1, + ); + expect( + wf.getNextMatchingDataPointIndex( + 10, + criterion: WaveformSearchCriterion.fallingEdge, + ), + 2, + ); + expect( + wf.getPreviousMatchingDataPointIndex( + 31, + criterion: WaveformSearchCriterion.value, + value: '0', + ), + 2, + ); + }); + }); + group('SignalWaveform copy/serialization', () { test('copyFrom produces an independent data list', () { final original = SignalWaveform( signalId: 's', data: [Data(time: 0, value: '0')], + monitorGroup: 'inputs', + valueFormat: MonitorValueFormat.hexadecimal, ); final copy = SignalWaveform.copyFrom(original); expect(copy.signalId, 's'); + expect(copy.monitorId, isNot(original.monitorId)); + expect(copy.monitorGroup, 'inputs'); + expect(copy.valueFormat, MonitorValueFormat.hexadecimal); copy.appendData([Data(time: 5, value: '1')]); expect(original.length, 1, reason: 'copy must not mutate the original'); expect(copy.length, 2); }); + test('supports explicit monitor identity and display name', () { + final original = SignalWaveform(signalId: 's'); + final copy = SignalWaveform.copyFrom(original, monitorId: 's-copy'); + final monitored = MonitoredSignal.fromWaveform( + copy, + displayName: 'Status', + ); + + expect(copy.monitorId, 's-copy'); + expect(monitored.monitorId, 's-copy'); + expect(monitored.name, 'Status'); + }); + test('round-trips through JSON', () { - final wf = SignalWaveform(signalId: 'sig', data: [ - Data(time: 0, value: '0'), - Data(time: 4, value: '1'), - ]); + final wf = SignalWaveform( + signalId: 'sig', + data: [ + Data(time: 0, value: '0'), + Data(time: 4, value: '1'), + ], + ); final restored = SignalWaveform.fromJson(wf.toJson()); expect(restored.signalId, 'sig'); expect(restored.length, 2); @@ -169,10 +243,13 @@ void main() { }); test('reports start/end times from its samples', () { - final wd = WaveformData(signalId: 's', data: [ - Data(time: 3, value: '0'), - Data(time: 9, value: '1'), - ]); + final wd = WaveformData( + signalId: 's', + data: [ + Data(time: 3, value: '0'), + Data(time: 9, value: '1'), + ], + ); expect(wd.startTime, 3); expect(wd.endTime, 9); expect(wd.isNotEmpty, isTrue); @@ -195,8 +272,8 @@ void main() { data: [Data(time: 0, value: '0')], isComputed: true, ); - final wf = SignalWaveform.fromWaveformData(wd); - expect(wf.signalId, 's'); + final wf = SignalWaveform.fromWaveformData(wd, signalId: 'top/s'); + expect(wf.signalId, 'top/s'); expect(wf.length, 1); expect(wf.isComputed, isTrue); }); diff --git a/pubspec.yaml b/pubspec.yaml index aa6289e72e..163e3f94d7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,8 +14,7 @@ dependencies: collection: ^1.15.0 logging: ^1.0.1 meta: ^1.9.0 - rohd_hierarchy: - path: packages/rohd_hierarchy + rohd_hierarchy: ^0.2.0 test: ^1.17.3 yaml: ^3.1.1 diff --git a/pubspec_overrides.yaml b/pubspec_overrides.yaml new file mode 100644 index 0000000000..409a079ac6 --- /dev/null +++ b/pubspec_overrides.yaml @@ -0,0 +1,3 @@ +dependency_overrides: + rohd_hierarchy: + path: packages/rohd_hierarchy diff --git a/rohd_devtools_extension/.gitignore b/rohd_devtools_extension/.gitignore index 29a3a5017f..5d633917d6 100644 --- a/rohd_devtools_extension/.gitignore +++ b/rohd_devtools_extension/.gitignore @@ -30,6 +30,7 @@ migrate_working_dir/ .pub-cache/ .pub/ /build/ +.devtools_dependency_sources # Symbolication related app.*.symbols diff --git a/rohd_devtools_extension/.vscode/launch.json b/rohd_devtools_extension/.vscode/launch.json index fae1b0be81..d9f5e115bf 100644 --- a/rohd_devtools_extension/.vscode/launch.json +++ b/rohd_devtools_extension/.vscode/launch.json @@ -1,45 +1,71 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + // ============================================================ + // Web (DevTools Extension) + // ============================================================ { - "name": "rohd_devtools_extension", + "name": "Web: DevTools", + "program": "lib/main.dart", "request": "launch", - "type": "dart" + "type": "dart", + "deviceId": "web-server", + "args": ["--web-port=9099", "--web-hostname=localhost"] }, { - "name": "rohd_devtools_extension (profile mode)", + "name": "Web: DevTools + Simulated", + "program": "lib/main.dart", "request": "launch", "type": "dart", - "flutterMode": "profile" + "deviceId": "web-server", + "args": [ + "--web-port=9099", + "--web-hostname=localhost", + "--dart-define=use_simulated_environment=true" + ] }, { - "name": "rohd_devtools_extension (release mode)", + "name": "Web: Standalone", + "program": "lib/main_standalone.dart", "request": "launch", "type": "dart", - "flutterMode": "release" + "deviceId": "web-server", + "args": ["--web-port=9099", "--web-hostname=localhost"] }, { - "name": "rohd_devtools_extension + simulated environment", + "name": "Web: Chrome", "program": "lib/main.dart", "request": "launch", "type": "dart", - "args": [ - "--dart-define=use_simulated_environment=true" - ], + "deviceId": "chrome" }, + // ============================================================ + // Linux Native + // ============================================================ { - "name": "Run: Web Standalone (port 9099)", + "name": "Linux: DevTools", + "program": "lib/main_standalone.dart", "request": "launch", "type": "dart", + "deviceId": "linux", + "args": ["--enable-software-rendering"] + }, + { + "name": "Linux: Standalone", "program": "lib/main_standalone.dart", - "deviceId": "web-server", - "args": [ - "--web-port=9099", - "--web-hostname=0.0.0.0" - ] + "request": "launch", + "type": "dart", + "deviceId": "linux", + "args": ["--enable-software-rendering"] + }, + { + "name": "Linux: Profile", + "program": "lib/main_standalone.dart", + "request": "launch", + "type": "dart", + "deviceId": "linux", + "flutterMode": "profile", + "args": ["--enable-software-rendering"] } ] -} \ No newline at end of file +} diff --git a/rohd_devtools_extension/.vscode/settings.json b/rohd_devtools_extension/.vscode/settings.json new file mode 100644 index 0000000000..cbe8ef3021 --- /dev/null +++ b/rohd_devtools_extension/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "chat.tools.terminal.autoApprove": { + "flutter": true + }, +} diff --git a/rohd_devtools_extension/.vscode/tasks.json b/rohd_devtools_extension/.vscode/tasks.json index 1d5530e981..ea0832278d 100644 --- a/rohd_devtools_extension/.vscode/tasks.json +++ b/rohd_devtools_extension/.vscode/tasks.json @@ -1,137 +1,224 @@ { - "version": "2.0.0", - "tasks": [ - { - "label": "Run: Web Standalone (Debug, port 9099)", - "type": "shell", - "command": "flutter run -d web-server --web-port=9099 --web-hostname=0.0.0.0 lib/main_standalone.dart", - "isBackground": true, - "problemMatcher": { - "pattern": { - "regexp": "^$" - }, - "background": { - "activeOnStart": true, - "beginsPattern": "^Launching", - "endsPattern": "is being served at" - } - }, - "presentation": { - "reveal": "always", - "panel": "dedicated", - "focus": true - }, - "detail": "Runs standalone web app in debug mode on port 9099" - }, - { - "label": "Run: Web Standalone (Release, port 9099)", - "type": "shell", - "command": "flutter run --release -d web-server --web-port=9099 --web-hostname=0.0.0.0 lib/main_standalone.dart", - "isBackground": true, - "problemMatcher": { - "pattern": { - "regexp": "^$" - }, - "background": { - "activeOnStart": true, - "beginsPattern": "^Launching", - "endsPattern": "is being served at" - } - }, - "presentation": { - "reveal": "always", - "panel": "dedicated", - "focus": true - }, - "detail": "Runs standalone web app in release mode on port 9099" - }, - { - "label": "Run: Linux Standalone (Debug)", - "type": "shell", - "command": "flutter run -d linux lib/main_standalone.dart", - "isBackground": true, - "problemMatcher": { - "pattern": { - "regexp": "^$" - }, - "background": { - "activeOnStart": true, - "beginsPattern": "^Launching", - "endsPattern": "^Application finished" - } - }, - "presentation": { - "reveal": "always", - "panel": "dedicated", - "focus": true - }, - "detail": "Runs standalone Linux app in debug mode" - }, - { - "label": "Run: Linux Standalone (Debug, software rendering)", - "type": "shell", - "command": "flutter run -d linux --enable-software-rendering lib/main_standalone.dart", - "isBackground": true, - "problemMatcher": { - "pattern": { - "regexp": "^$" - }, - "background": { - "activeOnStart": true, - "beginsPattern": "^Launching", - "endsPattern": "^Application finished" - } - }, - "presentation": { - "reveal": "always", - "panel": "dedicated", - "focus": true - }, - "detail": "Runs standalone Linux app in debug mode with software rendering" - }, - { - "label": "Run: Linux Standalone (Release)", - "type": "shell", - "command": "flutter run --release -d linux lib/main_standalone.dart", - "isBackground": true, - "problemMatcher": { - "pattern": { - "regexp": "^$" - }, - "background": { - "activeOnStart": true, - "beginsPattern": "^Launching", - "endsPattern": "^Application finished" + "version": "2.0.0", + "tasks": [ + { + "label": "Configure Dependency Bundle: ROHD Core", + "type": "shell", + "command": "bash scripts/devtools_dev_mode.sh configure-group rohd ${input:rohdSource} && flutter pub get", + "options": { + "cwd": "${workspaceFolder}", + "env": { + "ROHD_GIT_REF": "${input:rohdSourceValue}", + "ROHD_LOCAL_PATH": "${input:rohdSourceValue}" + } + }, + "problemMatcher": [], + "detail": "Select hosted, Git, or local for the fundamental rohd package." + }, + { + "label": "Configure Dependency Bundle: ROHD Packages", + "type": "shell", + "command": "bash scripts/devtools_dev_mode.sh configure-group rohd-packages ${input:rohdPackageSource} && flutter pub get", + "options": { + "cwd": "${workspaceFolder}", + "env": { + "ROHD_GIT_REF": "${input:rohdSourceValue}", + "ROHD_LOCAL_PATH": "${input:rohdSourceValue}" + } + }, + "problemMatcher": [], + "detail": "Select one source for rohd_hierarchy, rohd_waveform, rohd_devtools_widgets, and rohd_source_navigator." + }, + { + "label": "Configure Dependency Bundle: Wave Viewer", + "type": "shell", + "command": "bash scripts/devtools_dev_mode.sh configure-group wave-viewer ${input:waveViewerSource} && flutter pub get", + "options": { + "cwd": "${workspaceFolder}", + "env": { + "WAVE_VIEWER_GIT_REF": "${input:waveViewerSourceValue}", + "WAVE_VIEWER_LOCAL_PATH": "${input:waveViewerSourceValue}" + } + }, + "problemMatcher": [], + "detail": "Select hosted, Git, or local for rohd_wave_viewer and dart_wellen without changing the schematic viewer." + }, + { + "label": "Configure Dependency Bundle: Schematic Viewer", + "type": "shell", + "command": "bash scripts/devtools_dev_mode.sh configure-group schematic-viewer ${input:schematicViewerSource} && flutter pub get", + "options": { + "cwd": "${workspaceFolder}", + "env": { + "SCHEMATIC_VIEWER_GIT_REF": "${input:schematicViewerSourceValue}", + "SCHEMATIC_VIEWER_LOCAL_PATH": "${input:schematicViewerSourceValue}" + } + }, + "problemMatcher": [], + "detail": "Select hosted, Git, or local for rohd_schematic_viewer without changing the wave viewer." + }, + { + "label": "Configure Dependency Bundle: All", + "type": "shell", + "command": "bash scripts/devtools_dev_mode.sh configure-group all ${input:allDependencySource} && flutter pub get", + "options": { + "cwd": "${workspaceFolder}", + "env": { + "ROHD_GIT_REF": "${input:rohdSourceValue}", + "ROHD_LOCAL_PATH": "${input:rohdSourceValue}", + "WAVE_VIEWER_GIT_REF": "${input:waveViewerSourceValue}", + "WAVE_VIEWER_LOCAL_PATH": "${input:waveViewerSourceValue}", + "SCHEMATIC_VIEWER_GIT_REF": "${input:schematicViewerSourceValue}", + "SCHEMATIC_VIEWER_LOCAL_PATH": "${input:schematicViewerSourceValue}" + } + }, + "problemMatcher": [], + "detail": "Select one source for every ROHD and viewer dependency." + }, + { + "label": "Run: Web Debug (choose dependency bundles)", + "type": "shell", + "command": "bash scripts/devtools_run.sh web-debug", + "isBackground": true, + "problemMatcher": { + "pattern": { + "regexp": "^$" + }, + "background": { + "activeOnStart": true, + "beginsPattern": "^Launching", + "endsPattern": "is being served at" + } + }, + "presentation": { + "reveal": "always", + "panel": "dedicated", + "focus": true + } + }, + { + "label": "Run: Web Release (choose dependency bundles)", + "type": "shell", + "command": "bash scripts/devtools_run.sh web-release", + "isBackground": true, + "problemMatcher": { + "pattern": { + "regexp": "^$" + }, + "background": { + "activeOnStart": true, + "beginsPattern": "^Launching", + "endsPattern": "is being served at" + } + }, + "presentation": { + "reveal": "always", + "panel": "dedicated", + "focus": true + } + }, + { + "label": "Run: Linux Debug (choose dependency bundles)", + "type": "shell", + "command": "bash scripts/devtools_run.sh linux-debug", + "isBackground": true, + "problemMatcher": { + "pattern": { + "regexp": "^$" + }, + "background": { + "activeOnStart": true, + "beginsPattern": "^Launching", + "endsPattern": "^Application finished" + } + }, + "presentation": { + "reveal": "always", + "panel": "dedicated", + "focus": true + } + }, + { + "label": "Run: Linux Release (choose dependency bundles)", + "type": "shell", + "command": "bash scripts/devtools_run.sh linux-release", + "isBackground": true, + "problemMatcher": { + "pattern": { + "regexp": "^$" + }, + "background": { + "activeOnStart": true, + "beginsPattern": "^Launching", + "endsPattern": "^Application finished" + } + }, + "presentation": { + "reveal": "always", + "panel": "dedicated", + "focus": true + } + }, + { + "label": "Show DevTools Dependency Sources", + "type": "shell", + "command": "bash scripts/devtools_dev_mode.sh show", + "problemMatcher": [] } - }, - "presentation": { - "reveal": "always", - "panel": "dedicated", - "focus": true - }, - "detail": "Runs standalone Linux app in release mode" - }, - { - "label": "Run: Linux Standalone (Release, software rendering)", - "type": "shell", - "command": "flutter run --release -d linux --enable-software-rendering lib/main_standalone.dart", - "isBackground": true, - "problemMatcher": { - "pattern": { - "regexp": "^$" - }, - "background": { - "activeOnStart": true, - "beginsPattern": "^Launching", - "endsPattern": "^Application finished" + ], + "inputs": [ + { + "id": "rohdSource", + "type": "pickString", + "description": "Source for rohd", + "options": ["hosted", "git", "local"], + "default": "hosted" + }, + { + "id": "rohdPackageSource", + "type": "pickString", + "description": "Source for the ROHD companion package bundle", + "options": ["hosted", "git", "local"], + "default": "hosted" + }, + { + "id": "waveViewerSource", + "type": "pickString", + "description": "Source for rohd_wave_viewer and dart_wellen", + "options": ["hosted", "git", "local"], + "default": "hosted" + }, + { + "id": "schematicViewerSource", + "type": "pickString", + "description": "Source for rohd_schematic_viewer", + "options": ["hosted", "git", "local"], + "default": "hosted" + }, + { + "id": "allDependencySource", + "type": "pickString", + "description": "Source for every ROHD and viewer dependency", + "options": ["hosted", "git", "local"], + "default": "hosted" + }, + { + "id": "rohdSourceValue", + "type": "promptString", + "description": "Git ref or local ROHD checkout path (leave blank for the default)", + "default": "" + }, + { + "id": "waveViewerSourceValue", + "type": "promptString", + "description": "Git ref or local Wave Viewer checkout path (leave blank for the default)", + "default": "" + }, + { + "id": "schematicViewerSourceValue", + "type": "promptString", + "description": "Git ref or local Schematic Viewer checkout path (leave blank for the default)", + "default": "" } - }, - "presentation": { - "reveal": "always", - "panel": "dedicated", - "focus": true - }, - "detail": "Runs standalone Linux app in release mode with software rendering" - } - ] + ] } diff --git a/rohd_devtools_extension/Makefile b/rohd_devtools_extension/Makefile index c8915711c5..7b76282fe3 100644 --- a/rohd_devtools_extension/Makefile +++ b/rohd_devtools_extension/Makefile @@ -1,38 +1,291 @@ -# Minimal build entrypoints for the upstream standalone extension package. +# Makefile for ROHD DevTools Extension +# Restructured to leverage widget Makefiles (rohd-schematic-viewer, rohd-wave-viewer) +# Minimal redundancy: each widget manages its own build, assets copied at top level ROOT := $(shell pwd) +RELEASE_DIR ?= $(HOME)/release +SCHEMATIC_VIEWER_DIR := $(RELEASE_DIR)/rohd-schematic-viewer +WAVE_VIEWER_DIR := $(RELEASE_DIR)/rohd-wave-viewer +STAMP_DIR := $(ROOT)/build/.stamp +WAVEFORM_CLI_BUILD := $(WAVE_VIEWER_DIR)/build/cli +CLI_BUILD := $(ROOT)/build/cli +CLI_BINARY := $(CLI_BUILD)/rohd-wave +CLI_WORKER := $(CLI_BUILD)/rohd-wave-worker FLUTTER_WEB_BUILD_ARGS ?= +LOCAL_WIDGETS_DIR := $(ROOT)/../packages/rohd_devtools_widgets -.PHONY: all linux web web-release clean-linux clean-web help +# Widget directories - each has its own Makefile +WIDGET_DIRS := $(SCHEMATIC_VIEWER_DIR) $(WAVE_VIEWER_DIR) + +# Source file patterns for dependency tracking +DART_SOURCES := $(shell find lib -name '*.dart' 2>/dev/null) $(shell for w in $(WIDGET_DIRS); do find $$w/lib -name '*.dart' 2>/dev/null; done) +WIDGET_SOURCES := $(shell for w in $(WIDGET_DIRS); do find $$w -name '*.dart' -o -name '*.js' -o -name '*.ts' 2>/dev/null; done) +ASSET_STAGING_INPUTS := scripts/stage_assets.sh scripts/resolve_package_root.dart $(wildcard $(ROOT)/.dart_tool/package_config.json) + +.PHONY: all build-linux build-web clean clean-linux clean-web clean-stamps web web-release web-run web-run-profile help force real-clean extension install-local install-remote test dart-bindings widget-prepare cli cli-build all: linux -linux: - @flutter pub get - @flutter build linux --target=lib/main_standalone.dart +# Ensure all widget dependencies are ready (each widget manages its own bindings) +# This delegates to widget Makefiles which handle language-specific bindings. +dart-bindings: + @bash $(ROOT)/scripts/ensure_dart_bindings.sh + +# Run the lightweight cubit and widget tests on the Flutter VM. The extension +# entry point uses `dart:js_interop`, but these tests exercise platform-neutral +# library code and do not require a browser. +# The filter_bank integration test imports the full ROHD simulation stack +# which takes several minutes to DDC-compile — run via `make test-integration`. +test: assets/.staged dart-bindings + @flutter test test/cubit/basic_cubits_test.dart + @flutter test test/modules/tree_structure/tree_structure_page_test.dart + @flutter test test/modules/tree_structure/model_tree_card_test.dart + +# Full integration test using the real FilterBank ROHD example in loopback mode. +# First run after `flutter clean` takes ~5 min (DDC compiles ROHD → JS); cached runs ~30s. +test-integration: assets/.staged dart-bindings + @flutter test --platform chrome test/integration/filter_bank_integration_test.dart + +# Run everything. +test-all: test test-integration + +# Package the CLI at the DevTools root. The waveform widget still builds its +# Rust worker because it owns the Wellen implementation details. +cli-build: + @$(MAKE) -C $(WAVE_VIEWER_DIR) cli-build + @mkdir -p $(CLI_BUILD) + @cp $(WAVEFORM_CLI_BUILD)/rohd-wave $(CLI_BINARY) + @cp $(WAVEFORM_CLI_BUILD)/rohd-wave-worker $(CLI_WORKER) + +cli: cli-build + @$(CLI_BINARY) $(ARGS) -web: +# Stage assets from all widgets - copies their assets to canonical assets/ location +# Each widget contributes its own assets; top-level script merges them. +# Flutter's pubspec.yaml declares assets/ and automatically bundles into: +# - build/web/assets/ (for web builds) +# - build/linux/assets/ (for Linux native builds) +# Output marker: assets/.staged (to detect when asset sources change) +assets/.staged: $(WIDGET_SOURCES) $(ASSET_STAGING_INPUTS) + @echo "Aggregating assets from all widgets..." + @bash scripts/stage_assets.sh + @touch $@ + +# Legacy target for compatibility +stage-js: assets/.staged + +# Prepare web artifacts (delegated to widgets that provide them) +# Each widget that supports web builds handles its own artifacts. +web/pkg: assets/.staged dart-bindings + @echo "Preparing web artifacts from widgets..." + @for widget in $(WIDGET_DIRS); do \ + if [ -f "$$widget/Makefile" ] && grep -q '^wasm:' "$$widget/Makefile" 2>/dev/null; then \ + echo "Building web artifacts from $$widget..."; \ + cd $$widget && $(MAKE) wasm; \ + fi; \ + done + +# Build web version with Flutter - output: build/web/index.html (Flutter's main artifact) +build/web/index.html: web/pkg pubspec.yaml $(DART_SOURCES) + @echo "Building Flutter web app with all widgets..." + @bash $(ROOT)/scripts/ensure_dart_bindings.sh @flutter pub get @flutter build web --release --target=lib/main_standalone.dart $(FLUTTER_WEB_BUILD_ARGS) + @bash $(ROOT)/scripts/verify_elk_distribution.sh $(ROOT)/build/web/assets + @echo "Copying widget artifacts into build/web..." + @rm -rf $(ROOT)/build/web/pkg + @for widget in $(WIDGET_DIRS); do \ + if [ -d "$$widget/web/pkg" ]; then \ + cp -r $$widget/web/pkg $(ROOT)/build/web/; \ + break; \ + fi; \ + done + @echo "Web build ready at: build/web/" +# Legacy target for compatibility +web: build/web/index.html + +# Force a fresh release build. FLUTTER_WEB_BUILD_ARGS can set deployment +# options such as a repository-scoped base href. web-release: @rm -f build/web/index.html - @$(MAKE) web + @$(MAKE) build/web/index.html + +# Run web standalone version (development - no stamp, always runs) +web-run: web/pkg + @echo "Ensuring ports are free..." + @bash $(ROOT)/scripts/free_ports.sh + @echo "Running Flutter web standalone app..." + @bash $(ROOT)/scripts/ensure_dart_bindings.sh + @flutter pub get + @flutter run -d web-server --web-port=9099 --web-hostname=127.0.0.1 lib/main_standalone.dart + +# Run web standalone version in profile mode (faster startup, limited debugging) +web-run-profile: web/pkg + @echo "Ensuring ports are free..." + @bash $(ROOT)/scripts/free_ports.sh + @echo "Running Flutter web standalone app (profile mode)..." + @bash $(ROOT)/scripts/ensure_dart_bindings.sh + @flutter pub get + @flutter run -d web-server --web-port=9099 --web-hostname=127.0.0.1 --profile lib/main_standalone.dart + +# Prepare all widgets (compilation of native/wasm code, asset staging, bindings) +# Each widget handles its own build requirements - top-level never knows implementation details +widget-prepare: dart-bindings + @for widget in $(WIDGET_DIRS); do \ + if [ -f "$$widget/Makefile" ] && grep -q '^prepare:' "$$widget/Makefile" 2>/dev/null; then \ + echo "Preparing $$widget..."; \ + cd $$widget && $(MAKE) prepare; \ + fi; \ + done +# Build Linux standalone version - output: build/linux/release/rohd_devtools +build/linux/release: widget-prepare assets/.staged pubspec.yaml $(DART_SOURCES) + @echo "Building Flutter Linux standalone app..." + @bash $(ROOT)/scripts/ensure_dart_bindings.sh + @flutter pub get + @flutter build linux --target=lib/main_standalone.dart + @bash $(ROOT)/scripts/verify_elk_distribution.sh $(ROOT)/build/linux/x64/release/bundle/data/flutter_assets + +# Legacy target for compatibility +linux: build/linux/release + +# Clean all build artifacts +clean: clean-linux clean-web clean-assets + @echo "Cleaning Flutter build cache..." + @flutter clean + @echo "Removing generated doc/..." + -rm -rf $(ROOT)/doc + @echo "Clean complete" + +# Real-clean - deep clean including dependency packages and all widget submodules +real-clean: clean + @echo "Performing real-clean - removing all build outputs and packages..." + @if [ -d "$(LOCAL_WIDGETS_DIR)" ]; then \ + echo "Real-cleaning $(LOCAL_WIDGETS_DIR)..."; \ + (cd "$(LOCAL_WIDGETS_DIR)" && flutter clean); \ + elif [ -d "$(ROOT)/packages/rohd_devtools_widgets" ]; then \ + echo "Real-cleaning $(ROOT)/packages/rohd_devtools_widgets..."; \ + (cd "$(ROOT)/packages/rohd_devtools_widgets" && flutter clean); \ + else \ + echo "No local rohd_devtools_widgets package found; skipping."; \ + fi + @for widget in $(WIDGET_DIRS); do \ + echo "Real-cleaning $$widget..."; \ + cd $$widget && $(MAKE) real-clean; \ + done + @echo "Real-cleaning rohd_extension/dart..." + -@cd ../rohd_extension/dart && flutter clean + @echo "Removing generated flutter_rust_bridge artifacts..." + -find $(ROOT)/packages -name "flutter_rust_bridge.generated*" -delete + @for widget in $(WIDGET_DIRS); do \ + find $$widget/packages -name "flutter_rust_bridge.generated*" -delete 2>/dev/null || true; \ + done + @echo "Removing .dart_tool and pub cache artifacts..." + -rm -rf $(ROOT)/.dart_tool + -rm -rf $(ROOT)/.dart_plugins + -rm -rf $(ROOT)/pubspec.lock + @echo "Removing staged assets (preserving source assets/help/)..." + -rm -rf $(ROOT)/assets/js + -rm -f $(ROOT)/assets/schematic_layout_bridge.js + -rm -f $(ROOT)/assets/rohd_schematic.json + -rm -f $(ROOT)/assets/elk_layout_only.js + -rm -f $(ROOT)/assets/.staged + @echo "Real-clean complete - run 'flutter pub get' to restore dependencies" + +# Clean Linux build artifacts clean-linux: + @echo "Cleaning Linux build artifacts..." -rm -rf $(ROOT)/build/linux + -rm -rf $(ROOT)/build/native_assets -rm -rf $(ROOT)/linux/flutter/ephemeral +# Clean web build artifacts clean-web: + @echo "Cleaning web build artifacts..." -rm -rf $(ROOT)/build/web + -rm -rf $(ROOT)/build/flutter_assets + -rm -rf $(ROOT)/build/extension + @echo "Removing stale web asset files from parent directory..." + -rm -f $(ROOT)/web/schematic_layout_bridge.js + -rm -rf $(ROOT)/web/assets/js + +# Clean staged assets (copied from widgets) +clean-assets: + @echo "Cleaning staged assets..." + -rm -rf $(ROOT)/assets/js + -rm -f $(ROOT)/assets/schematic_layout_bridge.js + -rm -f $(ROOT)/assets/rohd_schematic.json + -rm -f $(ROOT)/assets/.staged +# Help target help: - @echo "ROHD DevTools Extension" + @echo "ROHD Debugger Makefile" @echo "" - @echo "Targets:" - @echo " all - Build the Linux standalone app (default)" - @echo " linux - Run flutter pub get and build Linux standalone" - @echo " web - Build the web standalone app" + @echo "Core Targets:" + @echo " all - Build Linux standalone (default)" + @echo " linux - Build Linux standalone app (all widgets)" + @echo " web - Build web app (all widgets)" @echo " web-release - Force a release web build" - @echo " clean-linux - Remove Linux build outputs" - @echo " clean-web - Remove web build outputs" \ No newline at end of file + @echo " web-run - Run web app in development mode" + @echo " cli-build - Package the rohd-wave CLI and file worker" + @echo " cli - Run the packaged CLI (pass arguments via ARGS)" + @echo " test - Run tests (Dart + widget integration)" + @echo " test-all - Run all tests including integration tests" + @echo "" + @echo "Extension Targets:" + @echo " extension - Build VS Code extension" + @echo " install-local - Install to local VS Code" + @echo " install-remote - Install to remote VS Code Server" + @echo "" + @echo "Asset Targets:" + @echo " stage-js - Stage assets from all widgets" + @echo " dart-bindings - Ensure all widget bindings are ready" + @echo "" + @echo "Cleanup:" + @echo " clean - Clean all build artifacts" + @echo " real-clean - Deep clean: all builds, packages, widget artifacts" + @echo " force - Force rebuild (clean + all)" + @echo "" + @echo "Architecture:" + @echo " This Makefile is widget-agnostic. Top-level coordinates:" + @echo " - Asset staging from all widgets via scripts/stage_assets.sh" + @echo " - Bindings preparation by delegating to each widget" + @echo " - Web/native builds by discovering widget capabilities" + @echo " - Each widget manages its own implementation" + @echo " - No hardcoded Rust/WASM/implementation details" + +# Force rebuild of everything +force: clean all + +# Build the VSCode extension with all dependencies (schematic viewer + wave viewer) +# Output: build/extension/web/index.html (final deployable artifact) +extension: build/extension/web/index.html + +# Build VS Code extension - copies and stages all required artifacts +# Requires: WASM, Flutter web build, and widget assets +build/extension/web/index.html: build/web/index.html + @echo "Building VS Code extension (web + widget assets)..." + @bash $(ROOT)/scripts/ensure_dart_bindings.sh + @flutter pub get + @mkdir -p build/extension + @echo "Staging extension assets..." + @cp -r assets build/extension/ + @cp -r web build/extension/ + @if [ -d "$(ROOT)/build/web" ]; then cp -r build/web build/extension/web_assets; fi + @bash $(ROOT)/scripts/verify_elk_distribution.sh $(ROOT)/build/extension/web_assets/assets + @echo "Extension built at build/extension/" + +# Install extension locally to user's VS Code installation +install-local: build/extension/web/index.html + @echo "Installing extension to local VS Code..." + @mkdir -p ~/.vscode/extensions + @cp -r build/extension ~/.vscode/extensions/rohd-devtools-extension + @echo "Extension installed to ~/.vscode/extensions/rohd-devtools-extension" + +# Install extension remotely to VS Code Server on remote machine +install-remote: build/extension/web/index.html + @echo "Installing extension to remote VS Code Server..." + @mkdir -p ~/.vscode-server/extensions + @cp -r build/extension ~/.vscode-server/extensions/rohd-devtools-extension + @echo "Extension installed to ~/.vscode-server/extensions/rohd-devtools-extension" diff --git a/rohd_devtools_extension/README.md b/rohd_devtools_extension/README.md index eb97d68be6..3543624293 100644 --- a/rohd_devtools_extension/README.md +++ b/rohd_devtools_extension/README.md @@ -41,14 +41,16 @@ Build a static bundle for a repository-scoped web path: ```sh cd rohd_devtools_extension -tool/gh_actions/build_app.sh /rohd/rohd_devtools_extension/ +tool/gh_actions/build_app.sh /rohd_devtools_extension/ ``` The bundle is written to `build/web/`. The optional argument must start and end with `/`; it becomes the Flutter base href used when the app is hosted below a -site root. Local builds default to `/rohd_devtools_extension/`. On pushes to -`main`, the `General` workflow includes this bundle in the existing ROHD -documentation deployment at `/rohd/rohd_devtools_extension/`. +site root. When the argument is omitted in GitHub Actions, the repository name +determines the base href. Local builds default to `/rohd_devtools_extension/`. +The build disables Flutter's generated service worker to avoid stale bundles. +On pushes to `main`, the `General` workflow includes this bundle in the existing +ROHD documentation deployment at `/rohd_devtools_extension/`. Run the release Linux standalone form: @@ -69,6 +71,155 @@ flows, including debug-mode variants. Those VS Code tasks are for extension development only and may change or be removed; the commands above are the release-mode forms to use directly. +The dependency tasks configure four independent bundles: ROHD core, ROHD +companion packages, the Wave Viewer, and the Schematic Viewer. Each bundle can +use hosted, Git, or local packages without changing the other bundles. The +selection is persisted in the ignored `.devtools_dependency_sources` file and +rendered into `pubspec_overrides.yaml` by +[`scripts/devtools_dev_mode.sh`](scripts/devtools_dev_mode.sh). Local viewer +paths default below `~/true-release` when that directory exists and otherwise +below `~/release`; the task prompts and script environment variables can +override those defaults. The web application loads Schematic Viewer assets +through Flutter's package asset namespace, so hosted Schematic Viewer builds +do not require a local viewer checkout. + +## Command-Line Interface + +The supported terminal entrypoint is the DTD-attached shell in +[`bin/rohd_shell.dart`](bin/rohd_shell.dart). It currently provides target +hierarchy and connectivity queries, and it can send selected signals to +available DevTools or VS Code cross-probe participants. The intended DevTools +CLI architecture is a generic command host whose connectivity, waveform, and +future providers register their capabilities rather than expose separate +tool-specific executables. + +The older `rohd-wave` implementation in [`bin/rohd_wave.dart`](bin/rohd_wave.dart) +is a waveform-specific prototype, not the DevTools CLI and not a supported +packaged executable. Its waveform commands have not yet moved into the generic +command host. Do not use `make cli-build` or publish +`build/cli/rohd-wave` as the DevTools command-line interface. + +### Handle Queries + +The DevTools console query core uses typed signal handles rather than requiring +people to repeatedly type compact addresses. Its supported language is small: +select a signal, bind it with `let`, then pipe that signal to one graph query. + +```text +let mid = select signal top/mid +@mid | fanout +@mid | fanin +select signal top/a | fanout transparent +select signal 0.2.4 | fanout +``` + +`@mid` retains the signal's canonical path, leaf name, width, and stable +address. The default `fanin` and `fanout` stages take one horizontal net hop. +`fanout transparent` follows an encountered input port into its non-leaf child +block, repeating until it reaches ports on leaf blocks. This makes a signal +cross module boundaries without pretending that arbitrary logic is a +pass-through. It does not traverse through primitive cells or infer cones +through muxes, adders, or flops; those need separate, explicit policies. + +### DTD Shell Attachment + +`rohd_shell.dart` is a DTD-attached inspection shell. It first uses the +DevTools-owned `rohd.devtoolsShell` service when that service is registered. +Otherwise it discovers the Dart VM through DTD and evaluates +`RohdShellService` in the paused target isolate. The target fallback requires +no DevTools browser or running service extension after target discovery. + +The target must construct a registered `NetlistService`; shell hierarchy and +connectivity queries are unavailable when the target has only legacy +`ModuleTree` JSON. + +```sh +dart run bin/rohd_shell.dart --dtd "$DTD_URI" +dart run bin/rohd_shell.dart --dtd "$DTD_URI" top +dart run bin/rohd_shell.dart --dtd "$DTD_URI" 'find-signals "clk|reset"' +``` + +The first form starts an interactive session. The later forms send one command +and print a JSON response. Use `help` in the shell for manifest-derived command +help and argument metadata. + +#### Cross-Probe Send + +`send` is an agent operation: it resolves signal paths in the shell process +that owns the live occurrence handles, then publishes only canonical paths to +an available cross-probe participant. Occurrence wrappers never cross the DTD +or VS Code boundary. + +```text +let sum = find-signal top/alu/sum +send $sum top/clk +``` + +When the terminal is using `rohd.devtoolsShell`, `send` uses DevTools' local +`CrossProbeService`; both `$sum` and the established `@sum` alias spelling are +accepted there. When the terminal is using the target fallback and the VS Code +extension is connected, it resolves each reference with the target shell and +calls the `rohd.signalBus.send` DTD service. That service delegates to +`rohd.sendSignals`, so registered VS Code viewers receive the same canonical +path list even when DevTools is not running. + +`send` reports an unavailable capability when no suitable signal bus is +registered. It accepts signals only; focusing cells is a separate capability. + +#### Hierarchy and Connectivity Commands + +Paths are absolute and use `/` (for example, `top/alu/sum`); dot-separated +paths are accepted as input too. `find-cell` and `find-signal` return live +target objects, so a shell alias retains identity instead of serializing and +re-parsing the occurrence. + +```text +top +find-cell +find-signal +find-cells [root=. ] [opaque|transparent] +find-signals [root=. ] [opaque|transparent] +owner-cell +parent-cell +fanin [opaque|transparent] +fanout [opaque|transparent] + +let sum = find-signal top/alu/sum +fanin $sum transparent +send $sum top/clk +let leaves = find-cells '.*' . transparent +``` + +The default root for `find-cells` and `find-signals` is `.` (the top +occurrence). Regexes match occurrence or signal names within that root's +subtree. `opaque` searches every descendant and returns immediate connectivity +endpoints. `transparent` returns only leaf cells/signals for searches, and for +fanin/fanout it crosses only hierarchical port boundaries until it reaches a +leaf. It never infers propagation through arbitrary logic, primitives, muxes, +adders, or flops. Invalid regexes and unknown paths produce JSON error +responses. + +#### Current Scope and Next Work + +The current shell supports structural hierarchy lookup, regex querying, +ownership, and netlist-backed port connectivity. Remaining work includes: + +- Clear shell aliases when the registered `NetlistService` changes, so stale +live occurrences cannot cross designs. +- Add broader connectivity fixtures for buses, inouts, constants, multiple +drivers, and fanin/fanout parity with the schematic graph implementation. +- Add optional query limits and pagination to keep large-design regex and +connectivity responses bounded. +- Attach the existing schematic graph through `externalHierarchy` when a +shared target-side graph API is needed, preserving the same occurrence +handles. +- Add waveform-value and source-location commands backed by +`WaveformDataService` and `TraceService`; report those capabilities as +unavailable until their services are initialized. + +Shell argument and command validation errors exit with code `64`. Operational +errors, including an unavailable DTD or VM, exit with code `1`. + ## Current Features The in-app help menu is the source of truth for the current feature set. The diff --git a/rohd_devtools_extension/analysis_options.yaml b/rohd_devtools_extension/analysis_options.yaml index 1bfb3d1009..727818c3d5 100644 --- a/rohd_devtools_extension/analysis_options.yaml +++ b/rohd_devtools_extension/analysis_options.yaml @@ -110,6 +110,7 @@ linter: - lines_longer_than_80_chars - literal_only_boolean_expressions - matching_super_parameters + - migrate_design_widgets - missing_code_block_language_in_doc_comment - missing_whitespace_between_adjacent_strings - no_adjacent_strings_in_list diff --git a/rohd_devtools_extension/assets/FilterBank.flc.json b/rohd_devtools_extension/assets/FilterBank.flc.json new file mode 100644 index 0000000000..299b88121e --- /dev/null +++ b/rohd_devtools_extension/assets/FilterBank.flc.json @@ -0,0 +1,832 @@ +{ + "version": 6, + "files": [ + "example/filter_bank/filter_bank.dart", + "example/filter_bank/filter_sample.dart", + "example/filter_bank/filter_channel.dart", + "example/filter_bank/filter_controller.dart", + ".dart_tool/../lib/src/interfaces/interface.dart", + "example/filter_bank/mac_unit.dart", + "example/filter_bank/coeff_bank.dart", + ".dart_tool/../lib/src/finite_state_machine.dart", + ".dart_tool/../lib/src/swizzle.dart" + ], + "modules": { + "FilterBank": { + "outputFiles": { + "sv": [ + "././FilterBank.sv" + ] + }, + "tree": [ + [ + "0:168:11", + "clk@545:13" + ], + [ + "0:169:13", + "reset@546:13" + ], + [ + "0:170:13", + "start@547:13" + ], + [ + "0:171:17", + "inputDone@548:13" + ], + [ + "0:176:19", + [ + "1:47:54", + [ + "1:48:31", + "sample0_data@sv:571:8;sv:567:14~data", + "sample0_valid@sv:572:8;sv:568:7~valid", + "sample1_data@sv:573:8;sv:569:14~data", + "sample1_valid@sv:574:8;sv:570:7~valid" + ], + "sample0@549:20", + "sample1@550:20" + ] + ], + [ + "0:182:13", + "channelOut@551:26", + "channelOut[0]@575:126~channelOut_0", + "channelOut[1]@577:124~channelOut_1" + ], + [ + "0:183:22", + "validOut@sv:575:151;sv:552:14" + ], + [ + "0:184:18", + "done@sv:576:165;sv:553:14" + ], + [ + "0:185:19", + "state@sv:576:178;sv:554:20" + ], + [ + "0:208:7", + [ + "2:83:14", + "enable@sv:576:131;sv:566:7" + ], + [ + "2:72:8", + "*ch0@575:25", + "*ch1@577:23" + ] + ], + [ + "0:189:24", + [ + "3:83:9", + "*controller@576:19" + ] + ] + ] + }, + "FilterChannel_T3_W16": { + "outputFiles": { + "sv": [ + "././FilterBank.sv" + ] + }, + "tree": [ + [ + "0:208:7", + [ + "2:75:9", + [ + "4:96:26", + "sampleIn@409:20", + "validIn@410:13" + ], + [ + "4:113:22", + "dataOut@sv:450:1;sv:453:7;sv:414:21", + "validOut@sv:450:1;sv:458:3;sv:415:14" + ] + ], + [ + "2:81:11", + "clk@411:13" + ], + [ + "2:82:13", + "reset@412:13" + ], + [ + "2:83:14", + "enable@413:13" + ], + [ + "2:199:23", + "validPipe@sv:461:1;sv:464:7;sv:446:7" + ], + [ + "2:200:46", + "outputReady@sv:474:8;sv:437:7" + ], + [ + "2:184:23", + "lastTapD2@sv:475:1;sv:479:7;sv:433:7" + ], + [ + "2:183:23", + "lastTapD1@sv:475:1;sv:478:7;sv:432:7" + ], + [ + "2:185:23", + "outputReg@sv:475:1;sv:480:7;sv:438:14" + ], + [ + "2:166:63", + "lastTap@sv:538:8;sv:431:7" + ], + [ + "2:90:24", + "tapCounter@sv:492:1;sv:495:7;sv:441:13" + ], + [ + "2:92:53", + "atFirstTap@sv:512:8;sv:426:7" + ], + [ + "2:93:21", + "shiftEn@sv:513:8;sv:440:7" + ], + [ + "2:101:23", + "nextTap0@sv:514:8;sv:434:14", + "nextTap1@sv:517:8;sv:435:14", + "nextTap2@sv:518:8;sv:436:14" + ], + [ + "2:97:23", + "delayLine@429:19", + "delayLine[0]@515:1~delayLine_0", + "delayLine[1]@516:1~delayLine_1", + "delayLine[2]@519:1~delayLine_2" + ], + [ + "2:130:12", + "tapMux2@sv:520:8;sv:443:14", + "tapMux1@sv:535:8;sv:442:14" + ], + [ + "2:134:22", + "accumReg@sv:522:1;sv:522:36;sv:425:14" + ], + [ + "2:137:27", + "accumFeedback@sv:523:1;sv:526:7;sv:424:14" + ], + [ + "2:111:24", + "coeffArray@427:19", + "coeffArray[0]@447:1~coeffArray_0", + "coeffArray[1]@448:1~coeffArray_1", + "coeffArray[2]@449:1~coeffArray_2" + ], + [ + "2:128:55", + "tapSelect2@sv:534:8;sv:445:7", + "tapSelect1@sv:536:8;sv:444:7" + ], + [ + "2:94:35", + "enableAndValid@sv:537:8;sv:430:7" + ], + [ + "2:167:5", + "_in7__tapCounter_add_const_1@sv:539:1;sv:422:13", + "2'h0~const_0", + "1'h1~const_1", + "2'h0~const_0", + "1'h1~const_1", + "1'h1~const_1", + "2'h0~const_0", + "*sequential_1@492:5" + ], + [ + "2:147:17", + [ + "5:57:15", + "coeffIn@sv:533:85;sv:428:14" + ], + [ + "5:62:20", + "result@sv:521:127;sv:439:14" + ], + [ + "5:55:9", + "*mac@521:14" + ] + ], + [ + "2:172:35", + "_tapCounter_add_const_1_carry@sv:539:1;sv:423:7", + "2'h1~const_1", + "*add@539:1" + ], + [ + "2:113:33", + "16'h1~const_1", + "16'h2~const_2", + "16'h1~const_1" + ], + [ + "2:212:5", + "1'h1~const_1", + "16'h0~const_0", + "*combinational@450:5" + ], + [ + "2:203:5", + "1'h0~const_0", + "1'h1~const_1", + "*sequential@461:5" + ], + [ + "2:188:5", + "1'h0~const_0", + "1'h0~const_0", + "16'h0~const_0", + "1'h1~const_1", + "*sequential_0@475:5" + ], + [ + "2:92:20", + "2'h0~const_0", + "*equals@512:45" + ], + [ + "2:138:5", + "16'h0~const_0", + "1'h1~const_1", + "*combinational_0@523:5" + ], + [ + "2:128:22", + "2'h2~const_2", + "2'h1~const_1", + "*equals_0@534:45", + "*equals_1@536:45" + ], + [ + "2:166:20", + "2'h2~const_2", + "*equals_2@538:42" + ], + [ + "2:200:36", + "*and_@474:46" + ], + [ + "2:94:59", + "*and__0@513:51" + ], + [ + "2:102:18", + "*mux@514:58", + "*mux_0@517:62", + "*mux_1@518:62" + ], + [ + "2:104:32", + "*flipflop@515:94", + "*flipflop_0@516:94", + "*flipflop_1@519:94" + ], + [ + "2:129:24", + "*mux_2@520:59", + "*mux_3@535:64" + ], + [ + "2:159:17", + "*flipflop_2@522:84" + ], + [ + "2:116:23", + [ + "6:44:9", + "*coeffBank@533:19" + ] + ], + [ + "2:94:24", + "*and__1@537:47" + ] + ] + ] + }, + "Combinational": { + "tree": [ + [ + "0:208:7", + [ + "2:212:5", + "_in0_validPipe", + "_in1_outputReg", + "_in2_const_1", + "_in3_const_0", + "_out4_dataOut", + "_out5_validOut" + ] + ] + ] + }, + "Sequential": { + "tree": [ + [ + "0:208:7", + [ + "2:203:5", + "_in0_reset", + "_in1_const_0", + "_in2_const_1", + "_in3_enable", + "_in4_outputReady", + "_trigger0_clk", + "_out5_validPipe" + ] + ] + ] + }, + "And2Gate": { + "tree": [ + [ + "0:208:7", + [ + "2:200:36", + "_in0_lastTapD2", + "_in1_enable", + "_lastTapD2_and_enable" + ] + ] + ] + }, + "Equals": { + "tree": [ + [ + "0:208:7", + [ + "2:92:20", + "_in0_tapCounter", + "_in1_const_0", + "_tapCounter_equals_const_0" + ] + ] + ] + }, + "Mux": { + "tree": [ + [ + "0:208:7", + [ + "2:102:18", + "_control_shiftEn", + "_d0_delayLine_0", + "_d1_sampleIn", + "_out" + ] + ] + ] + }, + "FlipFlop": { + "tree": [ + [ + "0:208:7", + [ + "2:104:32", + "_clk", + "_d", + "_reset", + "_q", + "const_0", + "const_1", + "*sequential" + ] + ] + ] + }, + "MacUnit_W16": { + "outputFiles": { + "sv": [ + "././FilterBank.sv" + ] + }, + "tree": [ + [ + "0:208:7", + [ + "2:147:17", + [ + "5:56:16", + "sampleIn@28:20" + ], + [ + "5:57:15", + "coeffIn@29:20" + ], + [ + "5:58:15", + "accumIn@30:20" + ], + [ + "5:59:11", + "clk@31:13" + ], + [ + "5:60:13", + "reset@32:13" + ], + [ + "5:61:14", + "enable@33:13" + ], + [ + "5:62:20", + "result@sv:60:1;sv:62:3;sv:34:21" + ], + [ + "5:66:18", + "coeffIn_stage2_o@sv:60:1;sv:63:3;sv:50:14", + "accumIn_stage2_o@sv:60:1;sv:64:3;sv:45:14", + "sampleIn_stage1_o@sv:91:1;sv:96:3;sv:57:14", + "sampleIn_stage2_i@sv:67:1;sv:71:7;sv:58:14", + "_in4__out", + "_in5__out", + "sampleIn_stage0_o@sv:112:1;sv:117:3;sv:54:14", + "_out", + "_in5__out_0~_in5__out", + "sampleIn_stage1_i@sv:67:1;sv:70:7;sv:56:14", + "coeffIn_stage1_i@sv:79:1;sv:82:7;sv:47:14", + "accumIn_stage1_o@sv:91:1;sv:95:3;sv:43:14", + "accumIn_stage2_i@sv:100:1;sv:104:7;sv:44:14", + "_in4__out_0~_in4__out", + "_in5__out_1~_in5__out", + "accumIn_stage0_o@sv:112:1;sv:116:3;sv:41:14", + "accumIn_stage1_i@sv:100:1;sv:103:7;sv:42:14", + "coeffIn_stage0_o@sv:112:1;sv:115:3;sv:46:14", + "coeffIn_stage1_o@sv:91:1;sv:94:3;sv:48:14", + "coeffIn_stage2_i@sv:79:1;sv:83:7;sv:49:14", + "16'h0~const_0", + "16'h0~const_0", + "1'h1~const_1", + "16'h0~const_0", + "16'h0~const_0", + "1'h1~const_1", + "16'h0~const_0", + "16'h0~const_0", + "1'h1~const_1", + "*comb_stage2@60:5", + "*mux", + "*ff_sampleIn@67:5", + "*mux_0", + "*mux_1", + "*ff_coeffIn@79:5", + "*comb_stage1@91:5", + "*mux_2", + "*ff_accumIn@100:5", + "*mux_3", + "*comb_stage0@112:5", + "*mux_4" + ], + [ + "5:63:29", + "stall@sv:121:8;sv:59:7" + ], + [ + "5:63:20", + "*not_@121:29" + ] + ] + ], + [ + "5:80:54", + "macSum@sv:99:1;sv:51:14" + ], + [ + "5:75:54", + "product@sv:120:8;sv:52:14" + ], + [ + "5:80:22", + "sampleIn_stage1@sv:91:1;sv:93:3;sv:55:14" + ], + [ + "5:80:36", + "_sampleIn_stage1_add_accumIn_stage1_carry@sv:99:1;sv:40:7", + "*add@99:1" + ], + [ + "5:75:22", + "sampleIn_stage0@sv:112:1;sv:114:3;sv:53:14" + ], + [ + "5:75:36", + "*multiply@120:60" + ] + ] + }, + "Add": { + "tree": [ + [ + "0:208:7", + [ + "2:147:17", + [ + "5:66:18", + [ + "5:80:36", + "_in0_sampleIn_stage1", + "_in1_accumIn_stage1", + "_sampleIn_stage1_add_accumIn_stage1", + "_sampleIn_stage1_add_accumIn_stage1_carry" + ] + ] + ] + ] + ] + }, + "Multiply": { + "tree": [ + [ + "0:208:7", + [ + "2:147:17", + [ + "5:66:18", + [ + "5:75:36", + "_in0_sampleIn_stage0", + "_in1_coeffIn_stage0", + "_sampleIn_stage0_multiply_coeffIn_stage0" + ] + ] + ] + ] + ] + }, + "NotGate": { + "tree": [ + [ + "0:208:7", + [ + "2:147:17", + [ + "5:63:20", + "_enable", + "_enable_b" + ] + ] + ] + ] + }, + "CoeffBank_T3_W16": { + "outputFiles": { + "sv": [ + "././FilterBank.sv" + ] + }, + "tree": [ + [ + "0:208:7", + [ + "2:116:23", + [ + "6:46:16", + "tapIndex@8:19" + ], + [ + "6:47:24", + "coeffArray@9:25", + "coeffArray[0]~coeffArray_0", + "coeffArray[1]~coeffArray_1", + "coeffArray[2]~coeffArray_2" + ], + [ + "6:49:22", + "coeffOut@sv:19:8;sv:10:21" + ], + [ + "6:55:54", + "tapMatch0@sv:20:8;sv:16:7", + "tapMatch1@sv:21:8;sv:17:7", + "tapMatch2@sv:22:8;sv:18:7" + ], + [ + "6:54:18", + "_d0__out", + "_out", + "16'h0~const_0", + "*mux@19:118", + "*mux_0", + "*mux_1" + ], + [ + "6:55:18", + "2'h0~const_0", + "2'h1~const_1", + "2'h2~const_2", + "*equals@20:42", + "*equals_0@21:42", + "*equals_1@22:42" + ] + ] + ] + ] + }, + "FilterController": { + "outputFiles": { + "sv": [ + "././FilterBank.sv" + ] + }, + "tree": [ + [ + "0:189:24", + [ + "3:84:11", + "clk@263:13" + ], + [ + "3:85:13", + "reset@264:13" + ], + [ + "3:86:13", + "start@265:13" + ], + [ + "3:87:18", + "inputValid@266:13" + ], + [ + "3:88:17", + "inputDone@267:13" + ], + [ + "3:90:26", + "filterEnable@sv:295:1;sv:299:11;sv:268:14" + ], + [ + "3:91:26", + "loadingPhase@sv:295:1;sv:300:11;sv:269:14" + ], + [ + "3:92:22", + "doneFlag@sv:295:1;sv:301:11;sv:270:14" + ], + [ + "3:93:19", + "state@sv:375:8;sv:271:20" + ], + [ + "3:100:12", + [ + "7:106:13", + [ + "7:124:13", + "currentState@sv:394:1;sv:397:7;sv:285:13" + ], + [ + "7:126:13", + "nextState@sv:295:1;sv:304:19;sv:289:13" + ], + [ + "7:159:16", + [ + "7:142:28", + "FilterState_idle@sv:290:8;sv:280:13", + "FilterState_loading@sv:291:8;sv:281:13", + "FilterState_running@sv:292:8;sv:282:13", + "FilterState_draining@sv:293:8;sv:279:13", + "FilterState_done@sv:294:8;sv:278:13" + ], + [ + "7:141:23", + "3'h0~const_0", + "3'h1~const_1", + "3'h2~const_2", + "3'h3~const_3", + "3'h4~const_4" + ] + ], + [ + "7:135:5", + "1'h0~const_0", + "1'h0~const_0", + "1'h0~const_0", + "1'h1~const_1", + "3'h1~const_1", + "3'h0~const_0", + "1'h1~const_1", + "1'h1~const_1", + "1'h0~const_0", + "1'h1~const_1", + "3'h2~const_2", + "3'h1~const_1", + "1'h1~const_1", + "1'h0~const_0", + "1'h0~const_0", + "1'h1~const_1", + "3'h3~const_3", + "3'h2~const_2", + "1'h1~const_1", + "1'h0~const_0", + "1'h0~const_0", + "1'h1~const_1", + "3'h4~const_4", + "3'h3~const_3", + "1'h0~const_0", + "1'h0~const_0", + "1'h1~const_1", + "1'h1~const_1", + "3'h4~const_4", + "1'h0~const_0", + "1'h0~const_0", + "1'h0~const_0", + "*combinational@295:5" + ], + [ + "7:177:16", + "3'h0~const_0", + "1'h1~const_1", + "*sequential_0@394:5" + ] + ] + ], + [ + "3:166:24", + "isDraining@sv:376:8;sv:288:7" + ], + [ + "3:96:24", + "drainCount@sv:377:1;sv:380:7;sv:286:13" + ], + [ + "3:98:53", + "drainDone@sv:392:8;sv:287:7" + ], + [ + "3:169:5", + "_in4__drainCount_add_const_1@sv:393:1;sv:284:13", + "8'h0~const_0", + "1'h1~const_1", + "1'h1~const_1", + "8'h0~const_0", + "*sequential@377:5" + ], + [ + "3:171:33", + "_drainCount_add_const_1_carry@sv:393:1;sv:283:7", + "8'h1~const_1", + "*add@393:1" + ], + [ + "3:161:32", + [ + "8:23:44", + "0'h0~const_0", + "*swizzle@375:34" + ] + ], + [ + "3:167:37", + "3'h3~const_3", + "*equals@376:47" + ], + [ + "3:98:20", + "8'h6~const_6", + "*equals_0@392:44" + ] + ] + ] + }, + "Swizzle": { + "tree": [ + [ + "0:189:24", + [ + "3:161:32", + [ + "8:23:44", + "_in0", + "_in1", + "_swizzled" + ] + ] + ] + ] + } + }, + "packageRoot": "." +} \ No newline at end of file diff --git a/rohd_devtools_extension/assets/FilterBank.rohd.json b/rohd_devtools_extension/assets/FilterBank.rohd.json new file mode 100644 index 0000000000..e38e93b355 --- /dev/null +++ b/rohd_devtools_extension/assets/FilterBank.rohd.json @@ -0,0 +1,11988 @@ +{ + "creator": "NetlistSynthesizer (rohd)", + "version": "0.0.2", + "files": [ + "example/filter_bank/coeff_bank.dart", + "example/filter_bank/filter_channel.dart", + "example/filter_bank/filter_bank.dart", + "example/filter_bank/mac_unit.dart", + ".dart_tool/../lib/src/interfaces/interface.dart", + "example/filter_bank/filter_controller.dart", + ".dart_tool/../lib/src/finite_state_machine.dart", + ".dart_tool/../lib/src/swizzle.dart", + "example/filter_bank/filter_sample.dart" + ], + "modules": { + "CoeffBank_T3_W16": { + "attributes": { + "src": "generated", + "rohd.src_trace": { + "signals": { + "tapIndex": [ + "0:46:16", + "1:116:23", + "2:208:7" + ], + "coeffArray": [ + "0:47:24", + "1:116:23", + "2:208:7" + ], + "coeffOut": [ + "0:49:22", + "1:116:23", + "2:208:7" + ], + "tapMatch0": [ + "0:55:54", + "1:116:23", + "2:208:7" + ], + "tapMatch1": [ + "0:55:54", + "1:116:23", + "2:208:7" + ], + "tapMatch2": [ + "0:55:54", + "1:116:23", + "2:208:7" + ], + "_d0__out": [ + "0:54:18", + "1:116:23", + "2:208:7" + ], + "_out": [ + "0:54:18", + "1:116:23", + "2:208:7" + ], + "coeffArray[0]": [ + "0:47:24", + "1:116:23", + "2:208:7" + ], + "2'h0": [ + "0:55:21", + "1:116:23", + "2:208:7" + ], + "coeffArray[1]": [ + "0:47:24", + "1:116:23", + "2:208:7" + ], + "2'h1": [ + "0:55:21", + "1:116:23", + "2:208:7" + ], + "16'h0": [ + "0:52:22", + "1:116:23", + "2:208:7" + ], + "coeffArray[2]": [ + "0:47:24", + "1:116:23", + "2:208:7" + ], + "2'h2": [ + "0:55:21", + "1:116:23", + "2:208:7" + ] + }, + "instances": { + "mux": [ + "0:54:18", + "1:116:23", + "2:208:7" + ], + "equals": [ + "0:55:18", + "1:116:23", + "2:208:7" + ], + "mux_0": [ + "0:54:18", + "1:116:23", + "2:208:7" + ], + "equals_0": [ + "0:55:18", + "1:116:23", + "2:208:7" + ], + "mux_1": [ + "0:54:18", + "1:116:23", + "2:208:7" + ], + "equals_1": [ + "0:55:18", + "1:116:23", + "2:208:7" + ] + } + } + }, + "ports": { + "tapIndex": { + "direction": "input", + "bits": [ + 2, + 3 + ], + "logic_type": { + "width": 2 + } + }, + "coeffArray": { + "direction": "input", + "bits": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51 + ], + "logic_type": { + "width": 48, + "arrayDims": [ + 3 + ], + "elementWidth": 16 + } + }, + "coeffOut": { + "direction": "output", + "bits": [ + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67 + ], + "logic_type": { + "width": 16 + } + } + }, + "cells": { + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 68 + ], + "A": [ + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86 + ], + "B": [ + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102 + ], + "Y": [ + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67 + ] + } + }, + "equals": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3 + ], + "B": [ + 103, + 104 + ], + "Y": [ + 68 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 69 + ], + "A": [ + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120 + ], + "B": [ + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136 + ], + "Y": [ + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86 + ] + } + }, + "equals_0": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3 + ], + "B": [ + 137, + 138 + ], + "Y": [ + 69 + ] + } + }, + "mux_1": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 70 + ], + "A": [ + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154 + ], + "B": [ + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170 + ], + "Y": [ + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120 + ] + } + }, + "equals_1": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3 + ], + "B": [ + 171, + 172 + ], + "Y": [ + 70 + ] + } + }, + "array_slice": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 48, + "Y_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arraySlice", + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51 + ], + "Y": [ + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102 + ] + } + }, + "array_slice_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 16, + "A_WIDTH": 48, + "Y_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arraySlice", + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51 + ], + "Y": [ + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136 + ] + } + }, + "array_slice_1": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 32, + "A_WIDTH": 48, + "Y_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arraySlice", + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51 + ], + "Y": [ + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170 + ] + } + }, + "const_0_2_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h0": "output" + }, + "connections": { + "2'h0": [ + 103, + 104 + ] + } + }, + "const_1_2_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h1": "output" + }, + "connections": { + "2'h1": [ + 137, + 138 + ] + } + }, + "const_2_16_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "16'h0": "output" + }, + "connections": { + "16'h0": [ + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154 + ] + } + }, + "const_3_2_h2": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h2": "output" + }, + "connections": { + "2'h2": [ + 171, + 172 + ] + } + } + }, + "netnames": { + "tapIndex": { + "bits": [ + 2, + 3 + ], + "logic_type": { + "width": 2 + }, + "attributes": {} + }, + "coeffArray": { + "bits": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51 + ], + "logic_type": { + "width": 48, + "arrayDims": [ + 3 + ], + "elementWidth": 16 + }, + "attributes": {} + }, + "coeffOut": { + "bits": [ + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "tapMatch0": { + "bits": [ + 68 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapMatch1": { + "bits": [ + 69 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapMatch2": { + "bits": [ + 70 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "_d0__out": { + "bits": [ + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "coeffArray_0_": { + "bits": [ + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "_out": { + "bits": [ + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "coeffArray_1_": { + "bits": [ + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray_2_": { + "bits": [ + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "const_0_2_h0": { + "bits": [ + 103, + 104 + ], + "attributes": { + "computed": 1 + } + }, + "const_1_2_h1": { + "bits": [ + 137, + 138 + ], + "attributes": { + "computed": 1 + } + }, + "const_2_16_h0": { + "bits": [ + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154 + ], + "attributes": { + "computed": 1 + } + }, + "const_3_2_h2": { + "bits": [ + 171, + 172 + ], + "attributes": { + "computed": 1 + } + } + } + }, + "MacUnit_W16": { + "attributes": { + "src": "generated", + "rohd.src_trace": { + "signals": { + "sampleIn": [ + "3:56:16", + "1:147:17", + "2:208:7" + ], + "coeffIn": [ + "3:57:15", + "1:147:17", + "2:208:7" + ], + "accumIn": [ + "3:58:15", + "1:147:17", + "2:208:7" + ], + "clk": [ + "3:59:11", + "1:147:17", + "2:208:7" + ], + "reset": [ + "3:60:13", + "1:147:17", + "2:208:7" + ], + "enable": [ + "3:61:14", + "1:147:17", + "2:208:7" + ], + "result": [ + "3:62:20", + "1:147:17", + "2:208:7" + ], + "macSum": [ + "3:80:54" + ], + "product": [ + "3:75:54" + ], + "coeffIn_stage2_o": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "accumIn_stage2_o": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "sampleIn_stage1_o": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "sampleIn_stage2_i": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "_in4__out": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "_in5__out": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "sampleIn_stage0_o": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "_out": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "_in5__out_0": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "sampleIn_stage1_i": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "coeffIn_stage1_i": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "sampleIn_stage1": [ + "3:80:36" + ], + "_sampleIn_stage1_add_accumIn_stage1_carry": [ + "3:80:36" + ], + "accumIn_stage1_o": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "accumIn_stage2_i": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "_in4__out_0": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "_in5__out_1": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "accumIn_stage0_o": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "accumIn_stage1_i": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "sampleIn_stage0": [ + "3:75:36" + ], + "coeffIn_stage0_o": [ + "3:75:36" + ], + "stall": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "coeffIn_stage1_o": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "coeffIn_stage2_i": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "16'h0": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "1'h1": [ + "3:66:18", + "1:147:17", + "2:208:7" + ] + }, + "instances": { + "comb_stage2": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "mux": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "ff_sampleIn": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "mux_0": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "mux_1": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "ff_coeffIn": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "comb_stage1": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "add": [ + "3:80:36" + ], + "mux_2": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "ff_accumIn": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "mux_3": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "comb_stage0": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "multiply": [ + "3:75:36" + ], + "mux_4": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "not_": [ + "3:63:20", + "1:147:17", + "2:208:7" + ] + } + } + }, + "ports": { + "sampleIn": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "logic_type": { + "width": 16 + } + }, + "coeffIn": { + "direction": "input", + "bits": [ + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33 + ], + "logic_type": { + "width": 16 + } + }, + "accumIn": { + "direction": "input", + "bits": [ + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49 + ], + "logic_type": { + "width": 16 + } + }, + "clk": { + "direction": "input", + "bits": [ + 50 + ], + "logic_type": { + "width": 1 + } + }, + "reset": { + "direction": "input", + "bits": [ + 51 + ], + "logic_type": { + "width": 1 + } + }, + "enable": { + "direction": "input", + "bits": [ + 52 + ], + "logic_type": { + "width": 1 + } + }, + "result": { + "direction": "output", + "bits": [ + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68 + ], + "logic_type": { + "width": 16 + } + } + }, + "cells": { + "comb_stage2": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "sampleIn_stage2_i": "input", + "coeffIn_stage2_i": "input", + "accumIn_stage2_i": "input", + "result": "output", + "coeffIn_stage2_o": "output", + "accumIn_stage2_o": "output" + }, + "connections": { + "sampleIn_stage2_i": [ + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84 + ], + "coeffIn_stage2_i": [ + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309 + ], + "accumIn_stage2_i": [ + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277 + ], + "result": [ + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68 + ], + "coeffIn_stage2_o": [ + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341 + ], + "accumIn_stage2_o": [ + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357 + ] + } + }, + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 101 + ], + "A": [ + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325 + ], + "B": [ + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84 + ], + "Y": [ + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373 + ] + } + }, + "ff_sampleIn": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "_in4__out": "input", + "_in5__out": "input", + "reset": "input", + "clk": "input", + "sampleIn_stage1_i": "output", + "sampleIn_stage2_i": "output" + }, + "connections": { + "_in4__out": [ + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422 + ], + "_in5__out": [ + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373 + ], + "reset": [ + 51 + ], + "clk": [ + 50 + ], + "sampleIn_stage1_i": [ + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100 + ], + "sampleIn_stage2_i": [ + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 101 + ], + "A": [ + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261 + ], + "B": [ + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100 + ], + "Y": [ + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422 + ] + } + }, + "mux_1": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 101 + ], + "A": [ + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245 + ], + "B": [ + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117 + ], + "Y": [ + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438 + ] + } + }, + "ff_coeffIn": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "reset": "input", + "_out": "input", + "_in5__out_0": "input", + "clk": "input", + "coeffIn_stage1_i": "output", + "coeffIn_stage2_i": "output" + }, + "connections": { + "reset": [ + 51 + ], + "_out": [ + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438 + ], + "_in5__out_0": [ + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487 + ], + "clk": [ + 50 + ], + "coeffIn_stage1_i": [ + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117 + ], + "coeffIn_stage2_i": [ + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309 + ] + } + }, + "comb_stage1": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "sampleIn_stage1_i": "input", + "coeffIn_stage1_i": "input", + "accumIn_stage1_i": "input", + "macSum": "input", + "sampleIn_stage1": "output", + "coeffIn_stage1_o": "output", + "accumIn_stage1_o": "output", + "sampleIn_stage1_o": "output" + }, + "connections": { + "sampleIn_stage1_i": [ + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100 + ], + "coeffIn_stage1_i": [ + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117 + ], + "accumIn_stage1_i": [ + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181 + ], + "macSum": [ + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149 + ], + "sampleIn_stage1": [ + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133 + ], + "coeffIn_stage1_o": [ + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293 + ], + "accumIn_stage1_o": [ + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165 + ], + "sampleIn_stage1_o": [ + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325 + ] + } + }, + "add": { + "hide_name": 0, + "type": "$add", + "parameters": { + "A_WIDTH": 16, + "B_WIDTH": 16, + "Y_WIDTH": 17 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133 + ], + "B": [ + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165 + ], + "Y": [ + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 488 + ] + } + }, + "mux_2": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 101 + ], + "A": [ + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165 + ], + "B": [ + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277 + ], + "Y": [ + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504 + ] + } + }, + "ff_accumIn": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "reset": "input", + "_in4__out_0": "input", + "_in5__out_1": "input", + "clk": "input", + "accumIn_stage1_i": "output", + "accumIn_stage2_i": "output" + }, + "connections": { + "reset": [ + 51 + ], + "_in4__out_0": [ + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553 + ], + "_in5__out_1": [ + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504 + ], + "clk": [ + 50 + ], + "accumIn_stage1_i": [ + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181 + ], + "accumIn_stage2_i": [ + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277 + ] + } + }, + "mux_3": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 101 + ], + "A": [ + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197 + ], + "B": [ + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181 + ], + "Y": [ + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553 + ] + } + }, + "comb_stage0": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "sampleIn": "input", + "coeffIn": "input", + "accumIn": "input", + "product": "input", + "sampleIn_stage0": "output", + "coeffIn_stage0_o": "output", + "accumIn_stage0_o": "output", + "sampleIn_stage0_o": "output" + }, + "connections": { + "sampleIn": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "coeffIn": [ + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33 + ], + "accumIn": [ + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49 + ], + "product": [ + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213 + ], + "sampleIn_stage0": [ + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229 + ], + "coeffIn_stage0_o": [ + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245 + ], + "accumIn_stage0_o": [ + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197 + ], + "sampleIn_stage0_o": [ + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261 + ] + } + }, + "multiply": { + "hide_name": 0, + "type": "$mul", + "parameters": { + "A_WIDTH": 16, + "B_WIDTH": 16, + "Y_WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229 + ], + "B": [ + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245 + ], + "Y": [ + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213 + ] + } + }, + "mux_4": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 101 + ], + "A": [ + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293 + ], + "B": [ + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309 + ], + "Y": [ + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487 + ] + } + }, + "not_": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 52 + ], + "Y": [ + 101 + ] + } + } + }, + "netnames": { + "sampleIn": { + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "coeffIn": { + "bits": [ + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "accumIn": { + "bits": [ + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "clk": { + "bits": [ + 50 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "reset": { + "bits": [ + 51 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "enable": { + "bits": [ + 52 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "result": { + "bits": [ + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "sampleIn_stage2_i": { + "bits": [ + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "sampleIn_stage1_i": { + "bits": [ + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "stall": { + "bits": [ + 101 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "coeffIn_stage1_i": { + "bits": [ + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "sampleIn_stage1": { + "bits": [ + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "macSum": { + "bits": [ + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "accumIn_stage1_o": { + "bits": [ + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "accumIn_stage1_i": { + "bits": [ + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "accumIn_stage0_o": { + "bits": [ + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "product": { + "bits": [ + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "sampleIn_stage0": { + "bits": [ + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "coeffIn_stage0_o": { + "bits": [ + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "sampleIn_stage0_o": { + "bits": [ + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "accumIn_stage2_i": { + "bits": [ + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "coeffIn_stage1_o": { + "bits": [ + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "coeffIn_stage2_i": { + "bits": [ + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "sampleIn_stage1_o": { + "bits": [ + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "coeffIn_stage2_o": { + "bits": [ + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "accumIn_stage2_o": { + "bits": [ + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_in5__out": { + "bits": [ + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_in4__out": { + "bits": [ + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_out": { + "bits": [ + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_in5__out_0": { + "bits": [ + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_sampleIn_stage1_add_accumIn_stage1_carry": { + "bits": [ + 488 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "_in5__out_1": { + "bits": [ + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_in4__out_0": { + "bits": [ + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + } + } + }, + "FilterChannel_T3_W16": { + "attributes": { + "src": "generated", + "rohd.src_trace": { + "signals": { + "sampleIn": [ + "4:96:26", + "1:75:9", + "2:208:7" + ], + "validIn": [ + "4:96:26", + "1:75:9", + "2:208:7" + ], + "clk": [ + "1:81:11", + "2:208:7" + ], + "reset": [ + "1:82:13", + "2:208:7" + ], + "enable": [ + "1:83:14", + "2:208:7" + ], + "dataOut": [ + "4:113:22", + "1:75:9", + "2:208:7" + ], + "validOut": [ + "4:113:22", + "1:75:9", + "2:208:7" + ], + "validPipe": [ + "1:199:23", + "2:208:7" + ], + "outputReady": [ + "1:200:46", + "2:208:7" + ], + "lastTapD2": [ + "1:184:23", + "2:208:7" + ], + "lastTapD1": [ + "1:183:23", + "2:208:7" + ], + "outputReg": [ + "1:185:23", + "2:208:7" + ], + "lastTap": [ + "1:166:63", + "2:208:7" + ], + "tapCounter": [ + "1:90:24", + "2:208:7" + ], + "atFirstTap": [ + "1:92:53", + "2:208:7" + ], + "shiftEn": [ + "1:93:21", + "2:208:7" + ], + "nextTap0": [ + "1:101:23", + "2:208:7" + ], + "delayLine": [ + "1:97:23", + "2:208:7" + ], + "delayLine[0]": [ + "1:97:23", + "2:208:7" + ], + "delayLine[1]": [ + "1:97:23", + "2:208:7" + ], + "nextTap1": [ + "1:101:23", + "2:208:7" + ], + "nextTap2": [ + "1:101:23", + "2:208:7" + ], + "delayLine[2]": [ + "1:97:23", + "2:208:7" + ], + "tapMux2": [ + "1:130:12", + "2:208:7" + ], + "accumReg": [ + "1:134:22", + "2:208:7" + ], + "accumFeedback": [ + "1:137:27", + "2:208:7" + ], + "coeffArray": [ + "1:111:24", + "2:208:7" + ], + "coeffArray[0]": [ + "1:111:24", + "2:208:7" + ], + "coeffArray[1]": [ + "1:111:24", + "2:208:7" + ], + "coeffArray[2]": [ + "1:111:24", + "2:208:7" + ], + "tapSelect2": [ + "1:128:55", + "2:208:7" + ], + "tapMux1": [ + "1:130:12", + "2:208:7" + ], + "tapSelect1": [ + "1:128:55", + "2:208:7" + ], + "enableAndValid": [ + "1:94:35", + "2:208:7" + ], + "_in7__tapCounter_add_const_1": [ + "1:167:5", + "2:208:7" + ], + "coeffIn": [ + "3:57:15", + "1:147:17", + "2:208:7" + ], + "result": [ + "1:159:17", + "2:208:7" + ], + "_tapCounter_add_const_1_carry": [ + "1:172:35", + "2:208:7" + ], + "16'h1": [ + "1:113:33", + "2:208:7" + ], + "16'hfffe": [ + "1:113:33", + "2:208:7" + ], + "1'h1": [ + "1:213:7", + "2:208:7" + ], + "16'h0": [ + "1:216:19", + "2:208:7" + ], + "1'h0": [ + "1:203:5", + "2:208:7" + ], + "2'h0": [ + "1:167:5", + "2:208:7" + ], + "2'h2": [ + "1:128:25", + "2:208:7" + ], + "2'h1": [ + "1:128:25", + "2:208:7" + ] + }, + "instances": { + "combinational": [ + "1:212:5", + "2:208:7" + ], + "sequential": [ + "1:203:5", + "2:208:7" + ], + "and_": [ + "1:200:36", + "2:208:7" + ], + "sequential_0": [ + "1:188:5", + "2:208:7" + ], + "sequential_1": [ + "1:167:5", + "2:208:7" + ], + "equals": [ + "1:92:20", + "2:208:7" + ], + "and__0": [ + "1:94:59", + "2:208:7" + ], + "mux": [ + "1:102:18", + "2:208:7" + ], + "flipflop": [ + "1:104:32", + "2:208:7" + ], + "flipflop_0": [ + "1:104:32", + "2:208:7" + ], + "mux_0": [ + "1:102:18", + "2:208:7" + ], + "mux_1": [ + "1:102:18", + "2:208:7" + ], + "flipflop_1": [ + "1:104:32", + "2:208:7" + ], + "mux_2": [ + "1:129:24", + "2:208:7" + ], + "mac": [ + "3:55:9", + "1:147:17", + "2:208:7" + ], + "flipflop_2": [ + "1:159:17", + "2:208:7" + ], + "combinational_0": [ + "1:138:5", + "2:208:7" + ], + "coeffBank": [ + "0:44:9", + "1:116:23", + "2:208:7" + ], + "equals_0": [ + "1:128:22", + "2:208:7" + ], + "mux_3": [ + "1:129:24", + "2:208:7" + ], + "equals_1": [ + "1:128:22", + "2:208:7" + ], + "and__1": [ + "1:94:24", + "2:208:7" + ], + "equals_2": [ + "1:166:20", + "2:208:7" + ], + "add": [ + "1:172:35", + "2:208:7" + ] + } + } + }, + "ports": { + "sampleIn": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "logic_type": { + "width": 16 + } + }, + "validIn": { + "direction": "input", + "bits": [ + 18 + ], + "logic_type": { + "width": 1 + } + }, + "clk": { + "direction": "input", + "bits": [ + 19 + ], + "logic_type": { + "width": 1 + } + }, + "reset": { + "direction": "input", + "bits": [ + 20 + ], + "logic_type": { + "width": 1 + } + }, + "enable": { + "direction": "input", + "bits": [ + 21 + ], + "logic_type": { + "width": 1 + } + }, + "dataOut": { + "direction": "output", + "bits": [ + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ], + "logic_type": { + "width": 16 + } + }, + "validOut": { + "direction": "output", + "bits": [ + 38 + ], + "logic_type": { + "width": 1 + } + } + }, + "cells": { + "combinational": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "validPipe": "input", + "outputReg": "input", + "dataOut": "output", + "validOut": "output" + }, + "connections": { + "validPipe": [ + 39 + ], + "outputReg": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ], + "dataOut": [ + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ], + "validOut": [ + 38 + ] + } + }, + "sequential": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "reset": "input", + "enable": "input", + "outputReady": "input", + "clk": "input", + "validPipe": "output" + }, + "connections": { + "reset": [ + 20 + ], + "enable": [ + 21 + ], + "outputReady": [ + 40 + ], + "clk": [ + 19 + ], + "validPipe": [ + 39 + ] + } + }, + "and_": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 41 + ], + "B": [ + 21 + ], + "Y": [ + 40 + ] + } + }, + "sequential_0": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "reset": "input", + "lastTap": "input", + "lastTapD1": "input", + "lastTapD2": "input", + "accumReg": "input", + "clk": "input", + "lastTapD1__out9_lastTapD1": "output", + "lastTapD2__out10_lastTapD2": "output", + "outputReg": "output" + }, + "connections": { + "reset": [ + 20 + ], + "lastTap": [ + 59 + ], + "lastTapD1": [ + 42 + ], + "lastTapD2": [ + 41 + ], + "accumReg": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "clk": [ + 19 + ], + "lastTapD1__out9_lastTapD1": [ + 42 + ], + "lastTapD2__out10_lastTapD2": [ + 41 + ], + "outputReg": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ] + } + }, + "sequential_1": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "_in7__tapCounter_add_const_1": "input", + "reset": "input", + "enable": "input", + "lastTap": "input", + "clk": "input", + "tapCounter": "output" + }, + "connections": { + "_in7__tapCounter_add_const_1": [ + 415, + 416 + ], + "reset": [ + 20 + ], + "enable": [ + 21 + ], + "lastTap": [ + 59 + ], + "clk": [ + 19 + ], + "tapCounter": [ + 60, + 61 + ] + } + }, + "equals": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 420, + 421 + ], + "Y": [ + 62 + ] + } + }, + "and__0": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 370 + ], + "B": [ + 62 + ], + "Y": [ + 63 + ] + } + }, + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 63 + ], + "A": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "B": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "Y": [ + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79 + ] + } + }, + "flipflop": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79 + ], + "Q": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "SRST": [ + 20 + ] + } + }, + "flipflop_0": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175 + ], + "Q": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "SRST": [ + 20 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 63 + ], + "A": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "B": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "Y": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175 + ] + } + }, + "mux_1": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 63 + ], + "A": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "B": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "Y": [ + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191 + ] + } + }, + "flipflop_1": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191 + ], + "Q": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "SRST": [ + 20 + ] + } + }, + "mux_2": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 352 + ], + "A": [ + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368 + ], + "B": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "Y": [ + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223 + ] + } + }, + "mac": { + "hide_name": 0, + "type": "MacUnit_W16", + "parameters": {}, + "attributes": {}, + "port_directions": { + "sampleIn": "input", + "coeffIn": "input", + "accumIn": "input", + "clk": "input", + "reset": "input", + "enable": "input", + "result": "output" + }, + "connections": { + "sampleIn": [ + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223 + ], + "coeffIn": [ + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437 + ], + "accumIn": [ + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255 + ], + "clk": [ + 19 + ], + "reset": [ + 20 + ], + "enable": [ + 21 + ], + "result": [ + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453 + ] + } + }, + "flipflop_2": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453 + ], + "Q": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "SRST": [ + 20 + ] + } + }, + "combinational_0": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "atFirstTap": "input", + "accumReg": "input", + "accumFeedback": "output" + }, + "connections": { + "atFirstTap": [ + 62 + ], + "accumReg": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "accumFeedback": [ + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255 + ] + } + }, + "array_concat_coeffBank_coeffArray": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 16, + "IN1_WIDTH": 16, + "IN2_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arrayConcat", + "port_directions": { + "[15:0]": "input", + "[31:16]": "input", + "[47:32]": "input", + "Y": "output" + }, + "connections": { + "[15:0]": [ + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687 + ], + "[31:16]": [ + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703 + ], + "[47:32]": [ + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719 + ], + "Y": [ + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623 + ] + } + }, + "coeffBank": { + "hide_name": 0, + "type": "CoeffBank_T3_W16", + "parameters": {}, + "attributes": {}, + "port_directions": { + "tapIndex": "input", + "coeffArray": "input", + "coeffOut": "output" + }, + "connections": { + "tapIndex": [ + 60, + 61 + ], + "coeffArray": [ + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623 + ], + "coeffOut": [ + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437 + ] + } + }, + "equals_0": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 519, + 520 + ], + "Y": [ + 352 + ] + } + }, + "mux_3": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 369 + ], + "A": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "B": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "Y": [ + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368 + ] + } + }, + "equals_1": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 521, + 522 + ], + "Y": [ + 369 + ] + } + }, + "and__1": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 21 + ], + "B": [ + 18 + ], + "Y": [ + 370 + ] + } + }, + "equals_2": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 523, + 524 + ], + "Y": [ + 59 + ] + } + }, + "add": { + "hide_name": 0, + "type": "$add", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 525, + 526 + ], + "Y": [ + 415, + 416, + 527 + ] + } + }, + "array_concat": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 16, + "IN1_WIDTH": 16, + "IN2_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arrayConcat", + "port_directions": { + "[15:0]": "input", + "[31:16]": "input", + "[47:32]": "input", + "Y": "output" + }, + "connections": { + "[15:0]": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "[31:16]": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "[47:32]": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "Y": [ + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671 + ] + } + }, + "array_concat_0": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 16, + "IN1_WIDTH": 16, + "IN2_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arrayConcat", + "port_directions": { + "[15:0]": "input", + "[31:16]": "input", + "[47:32]": "input", + "Y": "output" + }, + "connections": { + "[15:0]": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ], + "[31:16]": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ], + "[47:32]": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "Y": [ + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719 + ] + } + }, + "const_0_2_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h0": "output" + }, + "connections": { + "2'h0": [ + 420, + 421 + ] + } + }, + "const_1_2_h2": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h2": "output" + }, + "connections": { + "2'h2": [ + 519, + 520 + ] + } + }, + "const_2_2_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h1": "output" + }, + "connections": { + "2'h1": [ + 521, + 522 + ] + } + }, + "const_3_2_h2": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h2": "output" + }, + "connections": { + "2'h2": [ + 523, + 524 + ] + } + }, + "const_4_2_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h1": "output" + }, + "connections": { + "2'h1": [ + 525, + 526 + ] + } + }, + "const_5_16_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "16'h1": "output" + }, + "connections": { + "16'h1": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ] + } + }, + "const_6_16_hfffe": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "16'hfffe": "output" + }, + "connections": { + "16'hfffe": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ] + } + }, + "const_7_16_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "16'h1": "output" + }, + "connections": { + "16'h1": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ] + } + } + }, + "netnames": { + "sampleIn": { + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "validIn": { + "bits": [ + 18 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "clk": { + "bits": [ + 19 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "reset": { + "bits": [ + 20 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "enable": { + "bits": [ + 21 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "dataOut": { + "bits": [ + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "validOut": { + "bits": [ + 38 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "validPipe": { + "bits": [ + 39 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "outputReady": { + "bits": [ + 40 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "lastTapD2": { + "bits": [ + 41 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "lastTapD1": { + "bits": [ + 42 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "outputReg": { + "bits": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "lastTap": { + "bits": [ + 59 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapCounter": { + "bits": [ + 60, + 61 + ], + "logic_type": { + "width": 2 + }, + "attributes": { + "preserved_name": 1 + } + }, + "atFirstTap": { + "bits": [ + 62 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "shiftEn": { + "bits": [ + 63 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "nextTap0": { + "bits": [ + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "delayLine_0_": { + "bits": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "delayLine_1_": { + "bits": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "nextTap1": { + "bits": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "nextTap2": { + "bits": [ + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "delayLine_2_": { + "bits": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapMux2": { + "bits": [ + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "accumReg": { + "bits": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "accumFeedback": { + "bits": [ + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray_0_": { + "bits": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray": { + "bits": [ + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719 + ], + "logic_type": { + "width": 48, + "arrayDims": [ + 3 + ], + "elementWidth": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray_1_": { + "bits": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray_2_": { + "bits": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapSelect2": { + "bits": [ + 352 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapMux1": { + "bits": [ + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapSelect1": { + "bits": [ + 369 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "enableAndValid": { + "bits": [ + 370 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "_in7__tapCounter_add_const_1": { + "bits": [ + 415, + 416 + ], + "logic_type": { + "width": 2 + }, + "attributes": {} + }, + "coeffIn": { + "bits": [ + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "result": { + "bits": [ + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_tapCounter_add_const_1_carry": { + "bits": [ + 527 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "const_0_2_h0": { + "bits": [ + 420, + 421 + ], + "attributes": { + "computed": 1 + } + }, + "const_1_2_h2": { + "bits": [ + 519, + 520 + ], + "attributes": { + "computed": 1 + } + }, + "const_2_2_h1": { + "bits": [ + 521, + 522 + ], + "attributes": { + "computed": 1 + } + }, + "const_3_2_h2": { + "bits": [ + 523, + 524 + ], + "attributes": { + "computed": 1 + } + }, + "const_4_2_h1": { + "bits": [ + 525, + 526 + ], + "attributes": { + "computed": 1 + } + }, + "const_5_16_h1": { + "bits": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ], + "attributes": { + "computed": 1 + } + }, + "const_6_16_hfffe": { + "bits": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ], + "attributes": { + "computed": 1 + } + }, + "const_7_16_h1": { + "bits": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "attributes": { + "computed": 1 + } + }, + "array_concat_coeffBank_coeffArray_Y": { + "bits": [ + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623 + ], + "hide_name": 1, + "attributes": {} + }, + "array_concat_Y": { + "bits": [ + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671 + ], + "hide_name": 1, + "attributes": {} + } + } + }, + "FilterController": { + "attributes": { + "src": "generated", + "rohd.src_trace": { + "signals": { + "clk": [ + "5:84:11", + "2:189:24" + ], + "reset": [ + "5:85:13", + "2:189:24" + ], + "start": [ + "5:86:13", + "2:189:24" + ], + "inputValid": [ + "5:87:18", + "2:189:24" + ], + "inputDone": [ + "5:88:17", + "2:189:24" + ], + "filterEnable": [ + "5:90:26", + "2:189:24" + ], + "loadingPhase": [ + "5:91:26", + "2:189:24" + ], + "doneFlag": [ + "5:92:22", + "2:189:24" + ], + "state": [ + "5:93:19", + "2:189:24" + ], + "currentState": [ + "6:124:13", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "isDraining": [ + "5:166:24", + "2:189:24" + ], + "drainCount": [ + "5:96:24", + "2:189:24" + ], + "drainDone": [ + "5:98:53", + "2:189:24" + ], + "nextState": [ + "6:126:13", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "FilterState_idle": [ + "6:142:28", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "FilterState_loading": [ + "6:142:28", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "FilterState_running": [ + "6:142:28", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "FilterState_draining": [ + "6:142:28", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "FilterState_done": [ + "6:142:28", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "_in4__drainCount_add_const_1": [ + "5:169:5", + "2:189:24" + ], + "_drainCount_add_const_1_carry": [ + "5:171:33", + "2:189:24" + ], + "3'h0": [ + "6:141:23", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "3'h1": [ + "6:141:23", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "3'h2": [ + "6:141:23", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "3'h3": [ + "6:141:23", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "3'h4": [ + "6:141:23", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "1'h0": [ + "5:111:26", + "2:189:24" + ], + "1'h1": [ + "6:146:29", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "0'h0": [ + "5:161:32", + "2:189:24" + ], + "8'h0": [ + "5:169:5", + "2:189:24" + ], + "8'h6": [ + "5:98:23", + "2:189:24" + ], + "8'h1": [ + "5:171:35", + "2:189:24" + ] + }, + "instances": { + "combinational": [ + "6:135:5", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "swizzle": [ + "7:23:44", + "5:161:32", + "2:189:24" + ], + "equals": [ + "5:167:37", + "2:189:24" + ], + "sequential": [ + "5:169:5", + "2:189:24" + ], + "equals_0": [ + "5:98:20", + "2:189:24" + ], + "add": [ + "5:171:33", + "2:189:24" + ], + "sequential_0": [ + "6:177:16", + "6:106:13", + "5:100:12", + "2:189:24" + ] + } + } + }, + "ports": { + "clk": { + "direction": "input", + "bits": [ + 2 + ], + "logic_type": { + "width": 1 + } + }, + "reset": { + "direction": "input", + "bits": [ + 3 + ], + "logic_type": { + "width": 1 + } + }, + "start": { + "direction": "input", + "bits": [ + 4 + ], + "logic_type": { + "width": 1 + } + }, + "inputValid": { + "direction": "input", + "bits": [ + 5 + ], + "logic_type": { + "width": 1 + } + }, + "inputDone": { + "direction": "input", + "bits": [ + 6 + ], + "logic_type": { + "width": 1 + } + }, + "filterEnable": { + "direction": "output", + "bits": [ + 7 + ], + "logic_type": { + "width": 1 + } + }, + "loadingPhase": { + "direction": "output", + "bits": [ + 8 + ], + "logic_type": { + "width": 1 + } + }, + "doneFlag": { + "direction": "output", + "bits": [ + 9 + ], + "logic_type": { + "width": 1 + } + }, + "state": { + "direction": "output", + "bits": [ + 10, + 11, + 12 + ], + "logic_type": { + "width": 3 + } + } + }, + "cells": { + "combinational": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "currentState": "input", + "FilterState_idle": "input", + "start": "input", + "FilterState_loading": "input", + "inputValid": "input", + "FilterState_running": "input", + "inputDone": "input", + "FilterState_draining": "input", + "drainDone": "input", + "FilterState_done": "input", + "filterEnable": "output", + "loadingPhase": "output", + "doneFlag": "output", + "nextState": "output" + }, + "connections": { + "currentState": [ + 13, + 14, + 15 + ], + "FilterState_idle": [ + 144, + 145, + 146 + ], + "start": [ + 4 + ], + "FilterState_loading": [ + 147, + 148, + 149 + ], + "inputValid": [ + 5 + ], + "FilterState_running": [ + 150, + 151, + 152 + ], + "inputDone": [ + 6 + ], + "FilterState_draining": [ + 153, + 154, + 155 + ], + "drainDone": [ + 25 + ], + "FilterState_done": [ + 156, + 157, + 158 + ], + "filterEnable": [ + 7 + ], + "loadingPhase": [ + 8 + ], + "doneFlag": [ + 9 + ], + "nextState": [ + 26, + 27, + 28 + ] + } + }, + "swizzle": { + "hide_name": 0, + "type": "$buf", + "parameters": { + "WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 13, + 14, + 15 + ], + "Y": [ + 10, + 11, + 12 + ] + } + }, + "equals": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 3, + "B_WIDTH": 3, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 13, + 14, + 15 + ], + "B": [ + 94, + 95, + 96 + ], + "Y": [ + 16 + ] + } + }, + "sequential": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "_in4__drainCount_add_const_1": "input", + "reset": "input", + "isDraining": "input", + "clk": "input", + "drainCount": "output" + }, + "connections": { + "_in4__drainCount_add_const_1": [ + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113 + ], + "reset": [ + 3 + ], + "isDraining": [ + 16 + ], + "clk": [ + 2 + ], + "drainCount": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ] + } + }, + "equals_0": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 8, + "B_WIDTH": 8, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "B": [ + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130 + ], + "Y": [ + 25 + ] + } + }, + "add": { + "hide_name": 0, + "type": "$add", + "parameters": { + "A_WIDTH": 8, + "B_WIDTH": 8, + "Y_WIDTH": 9 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "B": [ + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138 + ], + "Y": [ + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 139 + ] + } + }, + "sequential_0": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "reset": "input", + "nextState": "input", + "clk": "input", + "currentState": "output" + }, + "connections": { + "reset": [ + 3 + ], + "nextState": [ + 26, + 27, + 28 + ], + "clk": [ + 2 + ], + "currentState": [ + 13, + 14, + 15 + ] + } + }, + "const_0_3_h3": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "3'h3": "output" + }, + "connections": { + "3'h3": [ + 94, + 95, + 96 + ] + } + }, + "const_1_8_h6": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "8'h6": "output" + }, + "connections": { + "8'h6": [ + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130 + ] + } + }, + "const_2_8_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "8'h1": "output" + }, + "connections": { + "8'h1": [ + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138 + ] + } + }, + "const_3_3_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "3'h0": "output" + }, + "connections": { + "3'h0": [ + 144, + 145, + 146 + ] + } + }, + "const_4_3_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "3'h1": "output" + }, + "connections": { + "3'h1": [ + 147, + 148, + 149 + ] + } + }, + "const_5_3_h2": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "3'h2": "output" + }, + "connections": { + "3'h2": [ + 150, + 151, + 152 + ] + } + }, + "const_6_3_h3": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "3'h3": "output" + }, + "connections": { + "3'h3": [ + 153, + 154, + 155 + ] + } + }, + "const_7_3_h4": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "3'h4": "output" + }, + "connections": { + "3'h4": [ + 156, + 157, + 158 + ] + } + } + }, + "netnames": { + "clk": { + "bits": [ + 2 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "reset": { + "bits": [ + 3 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "start": { + "bits": [ + 4 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "inputValid": { + "bits": [ + 5 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "inputDone": { + "bits": [ + 6 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "filterEnable": { + "bits": [ + 7 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "loadingPhase": { + "bits": [ + 8 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "doneFlag": { + "bits": [ + 9 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "state": { + "bits": [ + 10, + 11, + 12 + ], + "logic_type": { + "width": 3 + }, + "attributes": {} + }, + "currentState": { + "bits": [ + 13, + 14, + 15 + ], + "logic_type": { + "width": 3 + }, + "attributes": { + "preserved_name": 1 + } + }, + "isDraining": { + "bits": [ + 16 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "drainCount": { + "bits": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "logic_type": { + "width": 8 + }, + "attributes": { + "preserved_name": 1 + } + }, + "drainDone": { + "bits": [ + 25 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "nextState": { + "bits": [ + 26, + 27, + 28 + ], + "logic_type": { + "width": 3 + }, + "attributes": { + "preserved_name": 1 + } + }, + "FilterState_idle": { + "bits": [ + 144, + 145, + 146 + ], + "logic_type": { + "width": 3 + }, + "attributes": { + "preserved_name": 1 + } + }, + "FilterState_loading": { + "bits": [ + 147, + 148, + 149 + ], + "logic_type": { + "width": 3 + }, + "attributes": { + "preserved_name": 1 + } + }, + "FilterState_running": { + "bits": [ + 150, + 151, + 152 + ], + "logic_type": { + "width": 3 + }, + "attributes": { + "preserved_name": 1 + } + }, + "FilterState_draining": { + "bits": [ + 153, + 154, + 155 + ], + "logic_type": { + "width": 3 + }, + "attributes": { + "preserved_name": 1 + } + }, + "FilterState_done": { + "bits": [ + 156, + 157, + 158 + ], + "logic_type": { + "width": 3 + }, + "attributes": { + "preserved_name": 1 + } + }, + "_in4__drainCount_add_const_1": { + "bits": [ + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113 + ], + "logic_type": { + "width": 8 + }, + "attributes": {} + }, + "_drainCount_add_const_1_carry": { + "bits": [ + 139 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "const_0_3_h3": { + "bits": [ + 94, + 95, + 96 + ], + "attributes": { + "computed": 1 + } + }, + "const_1_8_h6": { + "bits": [ + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130 + ], + "attributes": { + "computed": 1 + } + }, + "const_2_8_h1": { + "bits": [ + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138 + ], + "attributes": { + "computed": 1 + } + }, + "const_3_3_h0": { + "bits": [ + 144, + 145, + 146 + ], + "attributes": { + "computed": 1 + } + }, + "const_4_3_h1": { + "bits": [ + 147, + 148, + 149 + ], + "attributes": { + "computed": 1 + } + }, + "const_5_3_h2": { + "bits": [ + 150, + 151, + 152 + ], + "attributes": { + "computed": 1 + } + }, + "const_6_3_h3": { + "bits": [ + 153, + 154, + 155 + ], + "attributes": { + "computed": 1 + } + }, + "const_7_3_h4": { + "bits": [ + 156, + 157, + 158 + ], + "attributes": { + "computed": 1 + } + } + } + }, + "FilterChannel_T3_W16_0": { + "attributes": { + "src": "generated", + "rohd.src_trace": { + "signals": { + "sampleIn": [ + "4:96:26", + "1:75:9", + "2:208:7" + ], + "validIn": [ + "4:96:26", + "1:75:9", + "2:208:7" + ], + "clk": [ + "1:81:11", + "2:208:7" + ], + "reset": [ + "1:82:13", + "2:208:7" + ], + "enable": [ + "1:83:14", + "2:208:7" + ], + "dataOut": [ + "4:113:22", + "1:75:9", + "2:208:7" + ], + "validOut": [ + "4:113:22", + "1:75:9", + "2:208:7" + ], + "validPipe": [ + "1:199:23", + "2:208:7" + ], + "outputReady": [ + "1:200:46", + "2:208:7" + ], + "lastTapD2": [ + "1:184:23", + "2:208:7" + ], + "lastTapD1": [ + "1:183:23", + "2:208:7" + ], + "outputReg": [ + "1:185:23", + "2:208:7" + ], + "lastTap": [ + "1:166:63", + "2:208:7" + ], + "tapCounter": [ + "1:90:24", + "2:208:7" + ], + "atFirstTap": [ + "1:92:53", + "2:208:7" + ], + "shiftEn": [ + "1:93:21", + "2:208:7" + ], + "nextTap0": [ + "1:101:23", + "2:208:7" + ], + "delayLine": [ + "1:97:23", + "2:208:7" + ], + "delayLine[0]": [ + "1:97:23", + "2:208:7" + ], + "delayLine[1]": [ + "1:97:23", + "2:208:7" + ], + "nextTap1": [ + "1:101:23", + "2:208:7" + ], + "nextTap2": [ + "1:101:23", + "2:208:7" + ], + "delayLine[2]": [ + "1:97:23", + "2:208:7" + ], + "tapMux2": [ + "1:130:12", + "2:208:7" + ], + "accumReg": [ + "1:134:22", + "2:208:7" + ], + "accumFeedback": [ + "1:137:27", + "2:208:7" + ], + "coeffArray": [ + "1:111:24", + "2:208:7" + ], + "coeffArray[0]": [ + "1:111:24", + "2:208:7" + ], + "coeffArray[1]": [ + "1:111:24", + "2:208:7" + ], + "coeffArray[2]": [ + "1:111:24", + "2:208:7" + ], + "tapSelect2": [ + "1:128:55", + "2:208:7" + ], + "tapMux1": [ + "1:130:12", + "2:208:7" + ], + "tapSelect1": [ + "1:128:55", + "2:208:7" + ], + "enableAndValid": [ + "1:94:35", + "2:208:7" + ], + "_in7__tapCounter_add_const_1": [ + "1:167:5", + "2:208:7" + ], + "coeffIn": [ + "3:57:15", + "1:147:17", + "2:208:7" + ], + "result": [ + "1:159:17", + "2:208:7" + ], + "_tapCounter_add_const_1_carry": [ + "1:172:35", + "2:208:7" + ], + "16'h1": [ + "1:113:33", + "2:208:7" + ], + "16'h2": [ + "1:113:33", + "2:208:7" + ], + "1'h1": [ + "1:213:7", + "2:208:7" + ], + "16'h0": [ + "1:216:19", + "2:208:7" + ], + "1'h0": [ + "1:203:5", + "2:208:7" + ], + "2'h0": [ + "1:167:5", + "2:208:7" + ], + "2'h2": [ + "1:128:25", + "2:208:7" + ], + "2'h1": [ + "1:128:25", + "2:208:7" + ] + }, + "instances": { + "combinational": [ + "1:212:5", + "2:208:7" + ], + "sequential": [ + "1:203:5", + "2:208:7" + ], + "and_": [ + "1:200:36", + "2:208:7" + ], + "sequential_0": [ + "1:188:5", + "2:208:7" + ], + "sequential_1": [ + "1:167:5", + "2:208:7" + ], + "equals": [ + "1:92:20", + "2:208:7" + ], + "and__0": [ + "1:94:59", + "2:208:7" + ], + "mux": [ + "1:102:18", + "2:208:7" + ], + "flipflop": [ + "1:104:32", + "2:208:7" + ], + "flipflop_0": [ + "1:104:32", + "2:208:7" + ], + "mux_0": [ + "1:102:18", + "2:208:7" + ], + "mux_1": [ + "1:102:18", + "2:208:7" + ], + "flipflop_1": [ + "1:104:32", + "2:208:7" + ], + "mux_2": [ + "1:129:24", + "2:208:7" + ], + "mac": [ + "3:55:9", + "1:147:17", + "2:208:7" + ], + "flipflop_2": [ + "1:159:17", + "2:208:7" + ], + "combinational_0": [ + "1:138:5", + "2:208:7" + ], + "coeffBank": [ + "0:44:9", + "1:116:23", + "2:208:7" + ], + "equals_0": [ + "1:128:22", + "2:208:7" + ], + "mux_3": [ + "1:129:24", + "2:208:7" + ], + "equals_1": [ + "1:128:22", + "2:208:7" + ], + "and__1": [ + "1:94:24", + "2:208:7" + ], + "equals_2": [ + "1:166:20", + "2:208:7" + ], + "add": [ + "1:172:35", + "2:208:7" + ] + } + } + }, + "ports": { + "sampleIn": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "logic_type": { + "width": 16 + } + }, + "validIn": { + "direction": "input", + "bits": [ + 18 + ], + "logic_type": { + "width": 1 + } + }, + "clk": { + "direction": "input", + "bits": [ + 19 + ], + "logic_type": { + "width": 1 + } + }, + "reset": { + "direction": "input", + "bits": [ + 20 + ], + "logic_type": { + "width": 1 + } + }, + "enable": { + "direction": "input", + "bits": [ + 21 + ], + "logic_type": { + "width": 1 + } + }, + "dataOut": { + "direction": "output", + "bits": [ + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ], + "logic_type": { + "width": 16 + } + }, + "validOut": { + "direction": "output", + "bits": [ + 38 + ], + "logic_type": { + "width": 1 + } + } + }, + "cells": { + "combinational": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "validPipe": "input", + "outputReg": "input", + "dataOut": "output", + "validOut": "output" + }, + "connections": { + "validPipe": [ + 39 + ], + "outputReg": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ], + "dataOut": [ + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ], + "validOut": [ + 38 + ] + } + }, + "sequential": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "reset": "input", + "enable": "input", + "outputReady": "input", + "clk": "input", + "validPipe": "output" + }, + "connections": { + "reset": [ + 20 + ], + "enable": [ + 21 + ], + "outputReady": [ + 40 + ], + "clk": [ + 19 + ], + "validPipe": [ + 39 + ] + } + }, + "and_": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 41 + ], + "B": [ + 21 + ], + "Y": [ + 40 + ] + } + }, + "sequential_0": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "reset": "input", + "lastTap": "input", + "lastTapD1": "input", + "lastTapD2": "input", + "accumReg": "input", + "clk": "input", + "lastTapD1__out9_lastTapD1": "output", + "lastTapD2__out10_lastTapD2": "output", + "outputReg": "output" + }, + "connections": { + "reset": [ + 20 + ], + "lastTap": [ + 59 + ], + "lastTapD1": [ + 42 + ], + "lastTapD2": [ + 41 + ], + "accumReg": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "clk": [ + 19 + ], + "lastTapD1__out9_lastTapD1": [ + 42 + ], + "lastTapD2__out10_lastTapD2": [ + 41 + ], + "outputReg": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ] + } + }, + "sequential_1": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "_in7__tapCounter_add_const_1": "input", + "reset": "input", + "enable": "input", + "lastTap": "input", + "clk": "input", + "tapCounter": "output" + }, + "connections": { + "_in7__tapCounter_add_const_1": [ + 415, + 416 + ], + "reset": [ + 20 + ], + "enable": [ + 21 + ], + "lastTap": [ + 59 + ], + "clk": [ + 19 + ], + "tapCounter": [ + 60, + 61 + ] + } + }, + "equals": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 420, + 421 + ], + "Y": [ + 62 + ] + } + }, + "and__0": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 370 + ], + "B": [ + 62 + ], + "Y": [ + 63 + ] + } + }, + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 63 + ], + "A": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "B": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "Y": [ + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79 + ] + } + }, + "flipflop": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79 + ], + "Q": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "SRST": [ + 20 + ] + } + }, + "flipflop_0": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175 + ], + "Q": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "SRST": [ + 20 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 63 + ], + "A": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "B": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "Y": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175 + ] + } + }, + "mux_1": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 63 + ], + "A": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "B": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "Y": [ + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191 + ] + } + }, + "flipflop_1": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191 + ], + "Q": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "SRST": [ + 20 + ] + } + }, + "mux_2": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 352 + ], + "A": [ + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368 + ], + "B": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "Y": [ + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223 + ] + } + }, + "mac": { + "hide_name": 0, + "type": "MacUnit_W16", + "parameters": {}, + "attributes": {}, + "port_directions": { + "sampleIn": "input", + "coeffIn": "input", + "accumIn": "input", + "clk": "input", + "reset": "input", + "enable": "input", + "result": "output" + }, + "connections": { + "sampleIn": [ + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223 + ], + "coeffIn": [ + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437 + ], + "accumIn": [ + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255 + ], + "clk": [ + 19 + ], + "reset": [ + 20 + ], + "enable": [ + 21 + ], + "result": [ + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453 + ] + } + }, + "flipflop_2": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453 + ], + "Q": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "SRST": [ + 20 + ] + } + }, + "combinational_0": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "atFirstTap": "input", + "accumReg": "input", + "accumFeedback": "output" + }, + "connections": { + "atFirstTap": [ + 62 + ], + "accumReg": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "accumFeedback": [ + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255 + ] + } + }, + "array_concat_coeffBank_coeffArray": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 16, + "IN1_WIDTH": 16, + "IN2_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arrayConcat", + "port_directions": { + "[15:0]": "input", + "[31:16]": "input", + "[47:32]": "input", + "Y": "output" + }, + "connections": { + "[15:0]": [ + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687 + ], + "[31:16]": [ + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703 + ], + "[47:32]": [ + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719 + ], + "Y": [ + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623 + ] + } + }, + "coeffBank": { + "hide_name": 0, + "type": "CoeffBank_T3_W16", + "parameters": {}, + "attributes": {}, + "port_directions": { + "tapIndex": "input", + "coeffArray": "input", + "coeffOut": "output" + }, + "connections": { + "tapIndex": [ + 60, + 61 + ], + "coeffArray": [ + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623 + ], + "coeffOut": [ + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437 + ] + } + }, + "equals_0": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 519, + 520 + ], + "Y": [ + 352 + ] + } + }, + "mux_3": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 369 + ], + "A": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "B": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "Y": [ + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368 + ] + } + }, + "equals_1": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 521, + 522 + ], + "Y": [ + 369 + ] + } + }, + "and__1": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 21 + ], + "B": [ + 18 + ], + "Y": [ + 370 + ] + } + }, + "equals_2": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 523, + 524 + ], + "Y": [ + 59 + ] + } + }, + "add": { + "hide_name": 0, + "type": "$add", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 525, + 526 + ], + "Y": [ + 415, + 416, + 527 + ] + } + }, + "array_concat": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 16, + "IN1_WIDTH": 16, + "IN2_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arrayConcat", + "port_directions": { + "[15:0]": "input", + "[31:16]": "input", + "[47:32]": "input", + "Y": "output" + }, + "connections": { + "[15:0]": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "[31:16]": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "[47:32]": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "Y": [ + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671 + ] + } + }, + "array_concat_0": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 16, + "IN1_WIDTH": 16, + "IN2_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arrayConcat", + "port_directions": { + "[15:0]": "input", + "[31:16]": "input", + "[47:32]": "input", + "Y": "output" + }, + "connections": { + "[15:0]": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ], + "[31:16]": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ], + "[47:32]": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "Y": [ + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719 + ] + } + }, + "const_0_2_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h0": "output" + }, + "connections": { + "2'h0": [ + 420, + 421 + ] + } + }, + "const_1_2_h2": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h2": "output" + }, + "connections": { + "2'h2": [ + 519, + 520 + ] + } + }, + "const_2_2_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h1": "output" + }, + "connections": { + "2'h1": [ + 521, + 522 + ] + } + }, + "const_3_2_h2": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h2": "output" + }, + "connections": { + "2'h2": [ + 523, + 524 + ] + } + }, + "const_4_2_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h1": "output" + }, + "connections": { + "2'h1": [ + 525, + 526 + ] + } + }, + "const_5_16_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "16'h1": "output" + }, + "connections": { + "16'h1": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ] + } + }, + "const_6_16_h2": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "16'h2": "output" + }, + "connections": { + "16'h2": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ] + } + }, + "const_7_16_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "16'h1": "output" + }, + "connections": { + "16'h1": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ] + } + } + }, + "netnames": { + "sampleIn": { + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "validIn": { + "bits": [ + 18 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "clk": { + "bits": [ + 19 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "reset": { + "bits": [ + 20 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "enable": { + "bits": [ + 21 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "dataOut": { + "bits": [ + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "validOut": { + "bits": [ + 38 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "validPipe": { + "bits": [ + 39 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "outputReady": { + "bits": [ + 40 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "lastTapD2": { + "bits": [ + 41 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "lastTapD1": { + "bits": [ + 42 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "outputReg": { + "bits": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "lastTap": { + "bits": [ + 59 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapCounter": { + "bits": [ + 60, + 61 + ], + "logic_type": { + "width": 2 + }, + "attributes": { + "preserved_name": 1 + } + }, + "atFirstTap": { + "bits": [ + 62 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "shiftEn": { + "bits": [ + 63 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "nextTap0": { + "bits": [ + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "delayLine_0_": { + "bits": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "delayLine_1_": { + "bits": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "nextTap1": { + "bits": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "nextTap2": { + "bits": [ + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "delayLine_2_": { + "bits": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapMux2": { + "bits": [ + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "accumReg": { + "bits": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "accumFeedback": { + "bits": [ + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray_0_": { + "bits": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray": { + "bits": [ + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719 + ], + "logic_type": { + "width": 48, + "arrayDims": [ + 3 + ], + "elementWidth": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray_1_": { + "bits": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray_2_": { + "bits": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapSelect2": { + "bits": [ + 352 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapMux1": { + "bits": [ + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapSelect1": { + "bits": [ + 369 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "enableAndValid": { + "bits": [ + 370 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "_in7__tapCounter_add_const_1": { + "bits": [ + 415, + 416 + ], + "logic_type": { + "width": 2 + }, + "attributes": {} + }, + "coeffIn": { + "bits": [ + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "result": { + "bits": [ + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_tapCounter_add_const_1_carry": { + "bits": [ + 527 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "const_0_2_h0": { + "bits": [ + 420, + 421 + ], + "attributes": { + "computed": 1 + } + }, + "const_1_2_h2": { + "bits": [ + 519, + 520 + ], + "attributes": { + "computed": 1 + } + }, + "const_2_2_h1": { + "bits": [ + 521, + 522 + ], + "attributes": { + "computed": 1 + } + }, + "const_3_2_h2": { + "bits": [ + 523, + 524 + ], + "attributes": { + "computed": 1 + } + }, + "const_4_2_h1": { + "bits": [ + 525, + 526 + ], + "attributes": { + "computed": 1 + } + }, + "const_5_16_h1": { + "bits": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ], + "attributes": { + "computed": 1 + } + }, + "const_6_16_h2": { + "bits": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ], + "attributes": { + "computed": 1 + } + }, + "const_7_16_h1": { + "bits": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "attributes": { + "computed": 1 + } + }, + "array_concat_coeffBank_coeffArray_Y": { + "bits": [ + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623 + ], + "hide_name": 1, + "attributes": {} + }, + "array_concat_Y": { + "bits": [ + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671 + ], + "hide_name": 1, + "attributes": {} + } + } + }, + "FilterBank": { + "attributes": { + "src": "generated", + "top": 1, + "rohd.src_trace": { + "signals": { + "clk": [ + "2:168:11" + ], + "reset": [ + "2:169:13" + ], + "start": [ + "2:170:13" + ], + "inputDone": [ + "2:171:17" + ], + "sample0": [ + "8:47:54", + "2:176:19" + ], + "sample1": [ + "8:47:54", + "2:176:19" + ], + "channelOut": [ + "2:182:13" + ], + "validOut": [ + "2:183:22" + ], + "done": [ + "2:184:18" + ], + "state": [ + "2:185:19" + ], + "sample0_data": [ + "8:48:31", + "8:47:54", + "2:176:19" + ], + "sample0_valid": [ + "8:48:31", + "8:47:54", + "2:176:19" + ], + "sample1_data": [ + "8:48:31", + "8:47:54", + "2:176:19" + ], + "sample1_valid": [ + "8:48:31", + "8:47:54", + "2:176:19" + ], + "enable": [ + "1:83:14", + "2:208:7" + ], + "channelOut[0]": [ + "2:182:13" + ], + "channelOut[1]": [ + "2:182:13" + ] + }, + "instances": { + "ch0": [ + "1:72:8", + "2:208:7" + ], + "controller": [ + "5:83:9", + "2:189:24" + ], + "ch1": [ + "1:72:8", + "2:208:7" + ] + } + } + }, + "ports": { + "clk": { + "direction": "input", + "bits": [ + 2 + ], + "logic_type": { + "width": 1 + } + }, + "reset": { + "direction": "input", + "bits": [ + 3 + ], + "logic_type": { + "width": 1 + } + }, + "start": { + "direction": "input", + "bits": [ + 4 + ], + "logic_type": { + "width": 1 + } + }, + "inputDone": { + "direction": "input", + "bits": [ + 5 + ], + "logic_type": { + "width": 1 + } + }, + "sample0": { + "direction": "input", + "bits": [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22 + ], + "logic_type": { + "typeName": "FilterSample", + "fields": [ + { + "name": "data", + "width": 16, + "bits": [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21 + ] + }, + { + "name": "valid", + "width": 1, + "bits": [ + 22 + ] + } + ] + } + }, + "sample1": { + "direction": "input", + "bits": [ + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39 + ], + "logic_type": { + "typeName": "FilterSample", + "fields": [ + { + "name": "data", + "width": 16, + "bits": [ + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38 + ] + }, + { + "name": "valid", + "width": 1, + "bits": [ + 39 + ] + } + ] + } + }, + "channelOut": { + "direction": "output", + "bits": [ + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103 + ], + "logic_type": { + "width": 32, + "arrayDims": [ + 2 + ], + "elementWidth": 16 + } + }, + "validOut": { + "direction": "output", + "bits": [ + 136 + ], + "logic_type": { + "width": 1 + } + }, + "done": { + "direction": "output", + "bits": [ + 137 + ], + "logic_type": { + "width": 1 + } + }, + "state": { + "direction": "output", + "bits": [ + 138, + 139, + 140 + ], + "logic_type": { + "width": 3 + } + } + }, + "cells": { + "array_concat_output_6": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 16, + "IN1_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "outputArrayConcat", + "port_directions": { + "[15:0]": "input", + "[31:16]": "input", + "Y": "output" + }, + "connections": { + "[15:0]": [ + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55 + ], + "[31:16]": [ + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71 + ], + "Y": [ + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103 + ] + } + }, + "ch0": { + "hide_name": 0, + "type": "FilterChannel_T3_W16_0", + "parameters": {}, + "attributes": {}, + "port_directions": { + "sampleIn": "input", + "validIn": "input", + "clk": "input", + "reset": "input", + "enable": "input", + "dataOut": "output", + "validOut": "output" + }, + "connections": { + "sampleIn": [ + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156 + ], + "validIn": [ + 157 + ], + "clk": [ + 2 + ], + "reset": [ + 3 + ], + "enable": [ + 176 + ], + "dataOut": [ + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55 + ], + "validOut": [ + 136 + ] + } + }, + "controller": { + "hide_name": 0, + "type": "FilterController", + "parameters": {}, + "attributes": {}, + "port_directions": { + "clk": "input", + "reset": "input", + "start": "input", + "inputValid": "input", + "inputDone": "input", + "filterEnable": "output", + "loadingPhase": "output", + "doneFlag": "output", + "state": "output" + }, + "connections": { + "clk": [ + 2 + ], + "reset": [ + 3 + ], + "start": [ + 4 + ], + "inputValid": [ + 157 + ], + "inputDone": [ + 5 + ], + "filterEnable": [ + 176 + ], + "loadingPhase": [ + 177 + ], + "doneFlag": [ + 137 + ], + "state": [ + 138, + 139, + 140 + ] + } + }, + "ch1": { + "hide_name": 0, + "type": "FilterChannel_T3_W16", + "parameters": {}, + "attributes": {}, + "port_directions": { + "sampleIn": "input", + "validIn": "input", + "clk": "input", + "reset": "input", + "enable": "input", + "dataOut": "output", + "validOut": "output" + }, + "connections": { + "sampleIn": [ + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174 + ], + "validIn": [ + 175 + ], + "clk": [ + 2 + ], + "reset": [ + 3 + ], + "enable": [ + 176 + ], + "dataOut": [ + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71 + ], + "validOut": [ + 158 + ] + } + }, + "struct_unpack_0_sample0": { + "hide_name": 0, + "type": "$struct_unpack", + "parameters": { + "STRUCT_NAME": "sample0", + "FIELD_COUNT": 2, + "FIELD_0_NAME": "data", + "FIELD_0_OFFSET": 0, + "FIELD_0_WIDTH": 16, + "FIELD_1_NAME": "valid", + "FIELD_1_OFFSET": 16, + "FIELD_1_WIDTH": 1 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "structureUnpack", + "port_directions": { + "A": "input", + "data": "output", + "valid": "output" + }, + "connections": { + "A": [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22 + ], + "data": [ + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156 + ], + "valid": [ + 157 + ] + } + }, + "struct_unpack_1_sample1": { + "hide_name": 0, + "type": "$struct_unpack", + "parameters": { + "STRUCT_NAME": "sample1", + "FIELD_COUNT": 2, + "FIELD_0_NAME": "data", + "FIELD_0_OFFSET": 0, + "FIELD_0_WIDTH": 16, + "FIELD_1_NAME": "valid", + "FIELD_1_OFFSET": 16, + "FIELD_1_WIDTH": 1 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "structureUnpack", + "port_directions": { + "A": "input", + "data": "output", + "valid": "output" + }, + "connections": { + "A": [ + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39 + ], + "data": [ + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174 + ], + "valid": [ + 175 + ] + } + } + }, + "netnames": { + "clk": { + "bits": [ + 2 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "reset": { + "bits": [ + 3 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "start": { + "bits": [ + 4 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "inputDone": { + "bits": [ + 5 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "sample0": { + "bits": [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22 + ], + "logic_type": { + "typeName": "FilterSample", + "fields": [ + { + "name": "data", + "width": 16, + "bits": [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21 + ] + }, + { + "name": "valid", + "width": 1, + "bits": [ + 22 + ] + } + ] + }, + "attributes": {} + }, + "sample1": { + "bits": [ + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39 + ], + "logic_type": { + "typeName": "FilterSample", + "fields": [ + { + "name": "data", + "width": 16, + "bits": [ + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38 + ] + }, + { + "name": "valid", + "width": 1, + "bits": [ + 39 + ] + } + ] + }, + "attributes": {} + }, + "channelOut": { + "bits": [ + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103 + ], + "logic_type": { + "width": 32, + "arrayDims": [ + 2 + ], + "elementWidth": 16 + }, + "attributes": {} + }, + "validOut": { + "bits": [ + 136 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "done": { + "bits": [ + 137 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "state": { + "bits": [ + 138, + 139, + 140 + ], + "logic_type": { + "width": 3 + }, + "attributes": {} + }, + "channelOut_0_": { + "bits": [ + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "channelOut_1_": { + "bits": [ + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "sample0_data": { + "bits": [ + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "sample0_valid": { + "bits": [ + 157 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "sample1_data": { + "bits": [ + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "sample1_valid": { + "bits": [ + 175 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "enable": { + "bits": [ + 176 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "controller_loadingPhase": { + "bits": [ + 177 + ], + "hide_name": 1, + "attributes": {} + }, + "ch1_validOut": { + "bits": [ + 158 + ], + "hide_name": 1, + "attributes": {} + } + } + } + } +} \ No newline at end of file diff --git a/rohd_devtools_extension/assets/FilterBank.traced.flc.json b/rohd_devtools_extension/assets/FilterBank.traced.flc.json new file mode 100644 index 0000000000..299b88121e --- /dev/null +++ b/rohd_devtools_extension/assets/FilterBank.traced.flc.json @@ -0,0 +1,832 @@ +{ + "version": 6, + "files": [ + "example/filter_bank/filter_bank.dart", + "example/filter_bank/filter_sample.dart", + "example/filter_bank/filter_channel.dart", + "example/filter_bank/filter_controller.dart", + ".dart_tool/../lib/src/interfaces/interface.dart", + "example/filter_bank/mac_unit.dart", + "example/filter_bank/coeff_bank.dart", + ".dart_tool/../lib/src/finite_state_machine.dart", + ".dart_tool/../lib/src/swizzle.dart" + ], + "modules": { + "FilterBank": { + "outputFiles": { + "sv": [ + "././FilterBank.sv" + ] + }, + "tree": [ + [ + "0:168:11", + "clk@545:13" + ], + [ + "0:169:13", + "reset@546:13" + ], + [ + "0:170:13", + "start@547:13" + ], + [ + "0:171:17", + "inputDone@548:13" + ], + [ + "0:176:19", + [ + "1:47:54", + [ + "1:48:31", + "sample0_data@sv:571:8;sv:567:14~data", + "sample0_valid@sv:572:8;sv:568:7~valid", + "sample1_data@sv:573:8;sv:569:14~data", + "sample1_valid@sv:574:8;sv:570:7~valid" + ], + "sample0@549:20", + "sample1@550:20" + ] + ], + [ + "0:182:13", + "channelOut@551:26", + "channelOut[0]@575:126~channelOut_0", + "channelOut[1]@577:124~channelOut_1" + ], + [ + "0:183:22", + "validOut@sv:575:151;sv:552:14" + ], + [ + "0:184:18", + "done@sv:576:165;sv:553:14" + ], + [ + "0:185:19", + "state@sv:576:178;sv:554:20" + ], + [ + "0:208:7", + [ + "2:83:14", + "enable@sv:576:131;sv:566:7" + ], + [ + "2:72:8", + "*ch0@575:25", + "*ch1@577:23" + ] + ], + [ + "0:189:24", + [ + "3:83:9", + "*controller@576:19" + ] + ] + ] + }, + "FilterChannel_T3_W16": { + "outputFiles": { + "sv": [ + "././FilterBank.sv" + ] + }, + "tree": [ + [ + "0:208:7", + [ + "2:75:9", + [ + "4:96:26", + "sampleIn@409:20", + "validIn@410:13" + ], + [ + "4:113:22", + "dataOut@sv:450:1;sv:453:7;sv:414:21", + "validOut@sv:450:1;sv:458:3;sv:415:14" + ] + ], + [ + "2:81:11", + "clk@411:13" + ], + [ + "2:82:13", + "reset@412:13" + ], + [ + "2:83:14", + "enable@413:13" + ], + [ + "2:199:23", + "validPipe@sv:461:1;sv:464:7;sv:446:7" + ], + [ + "2:200:46", + "outputReady@sv:474:8;sv:437:7" + ], + [ + "2:184:23", + "lastTapD2@sv:475:1;sv:479:7;sv:433:7" + ], + [ + "2:183:23", + "lastTapD1@sv:475:1;sv:478:7;sv:432:7" + ], + [ + "2:185:23", + "outputReg@sv:475:1;sv:480:7;sv:438:14" + ], + [ + "2:166:63", + "lastTap@sv:538:8;sv:431:7" + ], + [ + "2:90:24", + "tapCounter@sv:492:1;sv:495:7;sv:441:13" + ], + [ + "2:92:53", + "atFirstTap@sv:512:8;sv:426:7" + ], + [ + "2:93:21", + "shiftEn@sv:513:8;sv:440:7" + ], + [ + "2:101:23", + "nextTap0@sv:514:8;sv:434:14", + "nextTap1@sv:517:8;sv:435:14", + "nextTap2@sv:518:8;sv:436:14" + ], + [ + "2:97:23", + "delayLine@429:19", + "delayLine[0]@515:1~delayLine_0", + "delayLine[1]@516:1~delayLine_1", + "delayLine[2]@519:1~delayLine_2" + ], + [ + "2:130:12", + "tapMux2@sv:520:8;sv:443:14", + "tapMux1@sv:535:8;sv:442:14" + ], + [ + "2:134:22", + "accumReg@sv:522:1;sv:522:36;sv:425:14" + ], + [ + "2:137:27", + "accumFeedback@sv:523:1;sv:526:7;sv:424:14" + ], + [ + "2:111:24", + "coeffArray@427:19", + "coeffArray[0]@447:1~coeffArray_0", + "coeffArray[1]@448:1~coeffArray_1", + "coeffArray[2]@449:1~coeffArray_2" + ], + [ + "2:128:55", + "tapSelect2@sv:534:8;sv:445:7", + "tapSelect1@sv:536:8;sv:444:7" + ], + [ + "2:94:35", + "enableAndValid@sv:537:8;sv:430:7" + ], + [ + "2:167:5", + "_in7__tapCounter_add_const_1@sv:539:1;sv:422:13", + "2'h0~const_0", + "1'h1~const_1", + "2'h0~const_0", + "1'h1~const_1", + "1'h1~const_1", + "2'h0~const_0", + "*sequential_1@492:5" + ], + [ + "2:147:17", + [ + "5:57:15", + "coeffIn@sv:533:85;sv:428:14" + ], + [ + "5:62:20", + "result@sv:521:127;sv:439:14" + ], + [ + "5:55:9", + "*mac@521:14" + ] + ], + [ + "2:172:35", + "_tapCounter_add_const_1_carry@sv:539:1;sv:423:7", + "2'h1~const_1", + "*add@539:1" + ], + [ + "2:113:33", + "16'h1~const_1", + "16'h2~const_2", + "16'h1~const_1" + ], + [ + "2:212:5", + "1'h1~const_1", + "16'h0~const_0", + "*combinational@450:5" + ], + [ + "2:203:5", + "1'h0~const_0", + "1'h1~const_1", + "*sequential@461:5" + ], + [ + "2:188:5", + "1'h0~const_0", + "1'h0~const_0", + "16'h0~const_0", + "1'h1~const_1", + "*sequential_0@475:5" + ], + [ + "2:92:20", + "2'h0~const_0", + "*equals@512:45" + ], + [ + "2:138:5", + "16'h0~const_0", + "1'h1~const_1", + "*combinational_0@523:5" + ], + [ + "2:128:22", + "2'h2~const_2", + "2'h1~const_1", + "*equals_0@534:45", + "*equals_1@536:45" + ], + [ + "2:166:20", + "2'h2~const_2", + "*equals_2@538:42" + ], + [ + "2:200:36", + "*and_@474:46" + ], + [ + "2:94:59", + "*and__0@513:51" + ], + [ + "2:102:18", + "*mux@514:58", + "*mux_0@517:62", + "*mux_1@518:62" + ], + [ + "2:104:32", + "*flipflop@515:94", + "*flipflop_0@516:94", + "*flipflop_1@519:94" + ], + [ + "2:129:24", + "*mux_2@520:59", + "*mux_3@535:64" + ], + [ + "2:159:17", + "*flipflop_2@522:84" + ], + [ + "2:116:23", + [ + "6:44:9", + "*coeffBank@533:19" + ] + ], + [ + "2:94:24", + "*and__1@537:47" + ] + ] + ] + }, + "Combinational": { + "tree": [ + [ + "0:208:7", + [ + "2:212:5", + "_in0_validPipe", + "_in1_outputReg", + "_in2_const_1", + "_in3_const_0", + "_out4_dataOut", + "_out5_validOut" + ] + ] + ] + }, + "Sequential": { + "tree": [ + [ + "0:208:7", + [ + "2:203:5", + "_in0_reset", + "_in1_const_0", + "_in2_const_1", + "_in3_enable", + "_in4_outputReady", + "_trigger0_clk", + "_out5_validPipe" + ] + ] + ] + }, + "And2Gate": { + "tree": [ + [ + "0:208:7", + [ + "2:200:36", + "_in0_lastTapD2", + "_in1_enable", + "_lastTapD2_and_enable" + ] + ] + ] + }, + "Equals": { + "tree": [ + [ + "0:208:7", + [ + "2:92:20", + "_in0_tapCounter", + "_in1_const_0", + "_tapCounter_equals_const_0" + ] + ] + ] + }, + "Mux": { + "tree": [ + [ + "0:208:7", + [ + "2:102:18", + "_control_shiftEn", + "_d0_delayLine_0", + "_d1_sampleIn", + "_out" + ] + ] + ] + }, + "FlipFlop": { + "tree": [ + [ + "0:208:7", + [ + "2:104:32", + "_clk", + "_d", + "_reset", + "_q", + "const_0", + "const_1", + "*sequential" + ] + ] + ] + }, + "MacUnit_W16": { + "outputFiles": { + "sv": [ + "././FilterBank.sv" + ] + }, + "tree": [ + [ + "0:208:7", + [ + "2:147:17", + [ + "5:56:16", + "sampleIn@28:20" + ], + [ + "5:57:15", + "coeffIn@29:20" + ], + [ + "5:58:15", + "accumIn@30:20" + ], + [ + "5:59:11", + "clk@31:13" + ], + [ + "5:60:13", + "reset@32:13" + ], + [ + "5:61:14", + "enable@33:13" + ], + [ + "5:62:20", + "result@sv:60:1;sv:62:3;sv:34:21" + ], + [ + "5:66:18", + "coeffIn_stage2_o@sv:60:1;sv:63:3;sv:50:14", + "accumIn_stage2_o@sv:60:1;sv:64:3;sv:45:14", + "sampleIn_stage1_o@sv:91:1;sv:96:3;sv:57:14", + "sampleIn_stage2_i@sv:67:1;sv:71:7;sv:58:14", + "_in4__out", + "_in5__out", + "sampleIn_stage0_o@sv:112:1;sv:117:3;sv:54:14", + "_out", + "_in5__out_0~_in5__out", + "sampleIn_stage1_i@sv:67:1;sv:70:7;sv:56:14", + "coeffIn_stage1_i@sv:79:1;sv:82:7;sv:47:14", + "accumIn_stage1_o@sv:91:1;sv:95:3;sv:43:14", + "accumIn_stage2_i@sv:100:1;sv:104:7;sv:44:14", + "_in4__out_0~_in4__out", + "_in5__out_1~_in5__out", + "accumIn_stage0_o@sv:112:1;sv:116:3;sv:41:14", + "accumIn_stage1_i@sv:100:1;sv:103:7;sv:42:14", + "coeffIn_stage0_o@sv:112:1;sv:115:3;sv:46:14", + "coeffIn_stage1_o@sv:91:1;sv:94:3;sv:48:14", + "coeffIn_stage2_i@sv:79:1;sv:83:7;sv:49:14", + "16'h0~const_0", + "16'h0~const_0", + "1'h1~const_1", + "16'h0~const_0", + "16'h0~const_0", + "1'h1~const_1", + "16'h0~const_0", + "16'h0~const_0", + "1'h1~const_1", + "*comb_stage2@60:5", + "*mux", + "*ff_sampleIn@67:5", + "*mux_0", + "*mux_1", + "*ff_coeffIn@79:5", + "*comb_stage1@91:5", + "*mux_2", + "*ff_accumIn@100:5", + "*mux_3", + "*comb_stage0@112:5", + "*mux_4" + ], + [ + "5:63:29", + "stall@sv:121:8;sv:59:7" + ], + [ + "5:63:20", + "*not_@121:29" + ] + ] + ], + [ + "5:80:54", + "macSum@sv:99:1;sv:51:14" + ], + [ + "5:75:54", + "product@sv:120:8;sv:52:14" + ], + [ + "5:80:22", + "sampleIn_stage1@sv:91:1;sv:93:3;sv:55:14" + ], + [ + "5:80:36", + "_sampleIn_stage1_add_accumIn_stage1_carry@sv:99:1;sv:40:7", + "*add@99:1" + ], + [ + "5:75:22", + "sampleIn_stage0@sv:112:1;sv:114:3;sv:53:14" + ], + [ + "5:75:36", + "*multiply@120:60" + ] + ] + }, + "Add": { + "tree": [ + [ + "0:208:7", + [ + "2:147:17", + [ + "5:66:18", + [ + "5:80:36", + "_in0_sampleIn_stage1", + "_in1_accumIn_stage1", + "_sampleIn_stage1_add_accumIn_stage1", + "_sampleIn_stage1_add_accumIn_stage1_carry" + ] + ] + ] + ] + ] + }, + "Multiply": { + "tree": [ + [ + "0:208:7", + [ + "2:147:17", + [ + "5:66:18", + [ + "5:75:36", + "_in0_sampleIn_stage0", + "_in1_coeffIn_stage0", + "_sampleIn_stage0_multiply_coeffIn_stage0" + ] + ] + ] + ] + ] + }, + "NotGate": { + "tree": [ + [ + "0:208:7", + [ + "2:147:17", + [ + "5:63:20", + "_enable", + "_enable_b" + ] + ] + ] + ] + }, + "CoeffBank_T3_W16": { + "outputFiles": { + "sv": [ + "././FilterBank.sv" + ] + }, + "tree": [ + [ + "0:208:7", + [ + "2:116:23", + [ + "6:46:16", + "tapIndex@8:19" + ], + [ + "6:47:24", + "coeffArray@9:25", + "coeffArray[0]~coeffArray_0", + "coeffArray[1]~coeffArray_1", + "coeffArray[2]~coeffArray_2" + ], + [ + "6:49:22", + "coeffOut@sv:19:8;sv:10:21" + ], + [ + "6:55:54", + "tapMatch0@sv:20:8;sv:16:7", + "tapMatch1@sv:21:8;sv:17:7", + "tapMatch2@sv:22:8;sv:18:7" + ], + [ + "6:54:18", + "_d0__out", + "_out", + "16'h0~const_0", + "*mux@19:118", + "*mux_0", + "*mux_1" + ], + [ + "6:55:18", + "2'h0~const_0", + "2'h1~const_1", + "2'h2~const_2", + "*equals@20:42", + "*equals_0@21:42", + "*equals_1@22:42" + ] + ] + ] + ] + }, + "FilterController": { + "outputFiles": { + "sv": [ + "././FilterBank.sv" + ] + }, + "tree": [ + [ + "0:189:24", + [ + "3:84:11", + "clk@263:13" + ], + [ + "3:85:13", + "reset@264:13" + ], + [ + "3:86:13", + "start@265:13" + ], + [ + "3:87:18", + "inputValid@266:13" + ], + [ + "3:88:17", + "inputDone@267:13" + ], + [ + "3:90:26", + "filterEnable@sv:295:1;sv:299:11;sv:268:14" + ], + [ + "3:91:26", + "loadingPhase@sv:295:1;sv:300:11;sv:269:14" + ], + [ + "3:92:22", + "doneFlag@sv:295:1;sv:301:11;sv:270:14" + ], + [ + "3:93:19", + "state@sv:375:8;sv:271:20" + ], + [ + "3:100:12", + [ + "7:106:13", + [ + "7:124:13", + "currentState@sv:394:1;sv:397:7;sv:285:13" + ], + [ + "7:126:13", + "nextState@sv:295:1;sv:304:19;sv:289:13" + ], + [ + "7:159:16", + [ + "7:142:28", + "FilterState_idle@sv:290:8;sv:280:13", + "FilterState_loading@sv:291:8;sv:281:13", + "FilterState_running@sv:292:8;sv:282:13", + "FilterState_draining@sv:293:8;sv:279:13", + "FilterState_done@sv:294:8;sv:278:13" + ], + [ + "7:141:23", + "3'h0~const_0", + "3'h1~const_1", + "3'h2~const_2", + "3'h3~const_3", + "3'h4~const_4" + ] + ], + [ + "7:135:5", + "1'h0~const_0", + "1'h0~const_0", + "1'h0~const_0", + "1'h1~const_1", + "3'h1~const_1", + "3'h0~const_0", + "1'h1~const_1", + "1'h1~const_1", + "1'h0~const_0", + "1'h1~const_1", + "3'h2~const_2", + "3'h1~const_1", + "1'h1~const_1", + "1'h0~const_0", + "1'h0~const_0", + "1'h1~const_1", + "3'h3~const_3", + "3'h2~const_2", + "1'h1~const_1", + "1'h0~const_0", + "1'h0~const_0", + "1'h1~const_1", + "3'h4~const_4", + "3'h3~const_3", + "1'h0~const_0", + "1'h0~const_0", + "1'h1~const_1", + "1'h1~const_1", + "3'h4~const_4", + "1'h0~const_0", + "1'h0~const_0", + "1'h0~const_0", + "*combinational@295:5" + ], + [ + "7:177:16", + "3'h0~const_0", + "1'h1~const_1", + "*sequential_0@394:5" + ] + ] + ], + [ + "3:166:24", + "isDraining@sv:376:8;sv:288:7" + ], + [ + "3:96:24", + "drainCount@sv:377:1;sv:380:7;sv:286:13" + ], + [ + "3:98:53", + "drainDone@sv:392:8;sv:287:7" + ], + [ + "3:169:5", + "_in4__drainCount_add_const_1@sv:393:1;sv:284:13", + "8'h0~const_0", + "1'h1~const_1", + "1'h1~const_1", + "8'h0~const_0", + "*sequential@377:5" + ], + [ + "3:171:33", + "_drainCount_add_const_1_carry@sv:393:1;sv:283:7", + "8'h1~const_1", + "*add@393:1" + ], + [ + "3:161:32", + [ + "8:23:44", + "0'h0~const_0", + "*swizzle@375:34" + ] + ], + [ + "3:167:37", + "3'h3~const_3", + "*equals@376:47" + ], + [ + "3:98:20", + "8'h6~const_6", + "*equals_0@392:44" + ] + ] + ] + }, + "Swizzle": { + "tree": [ + [ + "0:189:24", + [ + "3:161:32", + [ + "8:23:44", + "_in0", + "_in1", + "_swizzled" + ] + ] + ] + ] + } + }, + "packageRoot": "." +} \ No newline at end of file diff --git a/rohd_devtools_extension/assets/FilterBank.traced.rohd.json b/rohd_devtools_extension/assets/FilterBank.traced.rohd.json new file mode 100644 index 0000000000..e38e93b355 --- /dev/null +++ b/rohd_devtools_extension/assets/FilterBank.traced.rohd.json @@ -0,0 +1,11988 @@ +{ + "creator": "NetlistSynthesizer (rohd)", + "version": "0.0.2", + "files": [ + "example/filter_bank/coeff_bank.dart", + "example/filter_bank/filter_channel.dart", + "example/filter_bank/filter_bank.dart", + "example/filter_bank/mac_unit.dart", + ".dart_tool/../lib/src/interfaces/interface.dart", + "example/filter_bank/filter_controller.dart", + ".dart_tool/../lib/src/finite_state_machine.dart", + ".dart_tool/../lib/src/swizzle.dart", + "example/filter_bank/filter_sample.dart" + ], + "modules": { + "CoeffBank_T3_W16": { + "attributes": { + "src": "generated", + "rohd.src_trace": { + "signals": { + "tapIndex": [ + "0:46:16", + "1:116:23", + "2:208:7" + ], + "coeffArray": [ + "0:47:24", + "1:116:23", + "2:208:7" + ], + "coeffOut": [ + "0:49:22", + "1:116:23", + "2:208:7" + ], + "tapMatch0": [ + "0:55:54", + "1:116:23", + "2:208:7" + ], + "tapMatch1": [ + "0:55:54", + "1:116:23", + "2:208:7" + ], + "tapMatch2": [ + "0:55:54", + "1:116:23", + "2:208:7" + ], + "_d0__out": [ + "0:54:18", + "1:116:23", + "2:208:7" + ], + "_out": [ + "0:54:18", + "1:116:23", + "2:208:7" + ], + "coeffArray[0]": [ + "0:47:24", + "1:116:23", + "2:208:7" + ], + "2'h0": [ + "0:55:21", + "1:116:23", + "2:208:7" + ], + "coeffArray[1]": [ + "0:47:24", + "1:116:23", + "2:208:7" + ], + "2'h1": [ + "0:55:21", + "1:116:23", + "2:208:7" + ], + "16'h0": [ + "0:52:22", + "1:116:23", + "2:208:7" + ], + "coeffArray[2]": [ + "0:47:24", + "1:116:23", + "2:208:7" + ], + "2'h2": [ + "0:55:21", + "1:116:23", + "2:208:7" + ] + }, + "instances": { + "mux": [ + "0:54:18", + "1:116:23", + "2:208:7" + ], + "equals": [ + "0:55:18", + "1:116:23", + "2:208:7" + ], + "mux_0": [ + "0:54:18", + "1:116:23", + "2:208:7" + ], + "equals_0": [ + "0:55:18", + "1:116:23", + "2:208:7" + ], + "mux_1": [ + "0:54:18", + "1:116:23", + "2:208:7" + ], + "equals_1": [ + "0:55:18", + "1:116:23", + "2:208:7" + ] + } + } + }, + "ports": { + "tapIndex": { + "direction": "input", + "bits": [ + 2, + 3 + ], + "logic_type": { + "width": 2 + } + }, + "coeffArray": { + "direction": "input", + "bits": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51 + ], + "logic_type": { + "width": 48, + "arrayDims": [ + 3 + ], + "elementWidth": 16 + } + }, + "coeffOut": { + "direction": "output", + "bits": [ + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67 + ], + "logic_type": { + "width": 16 + } + } + }, + "cells": { + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 68 + ], + "A": [ + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86 + ], + "B": [ + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102 + ], + "Y": [ + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67 + ] + } + }, + "equals": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3 + ], + "B": [ + 103, + 104 + ], + "Y": [ + 68 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 69 + ], + "A": [ + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120 + ], + "B": [ + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136 + ], + "Y": [ + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86 + ] + } + }, + "equals_0": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3 + ], + "B": [ + 137, + 138 + ], + "Y": [ + 69 + ] + } + }, + "mux_1": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 70 + ], + "A": [ + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154 + ], + "B": [ + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170 + ], + "Y": [ + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120 + ] + } + }, + "equals_1": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3 + ], + "B": [ + 171, + 172 + ], + "Y": [ + 70 + ] + } + }, + "array_slice": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 48, + "Y_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arraySlice", + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51 + ], + "Y": [ + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102 + ] + } + }, + "array_slice_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 16, + "A_WIDTH": 48, + "Y_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arraySlice", + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51 + ], + "Y": [ + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136 + ] + } + }, + "array_slice_1": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 32, + "A_WIDTH": 48, + "Y_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arraySlice", + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51 + ], + "Y": [ + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170 + ] + } + }, + "const_0_2_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h0": "output" + }, + "connections": { + "2'h0": [ + 103, + 104 + ] + } + }, + "const_1_2_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h1": "output" + }, + "connections": { + "2'h1": [ + 137, + 138 + ] + } + }, + "const_2_16_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "16'h0": "output" + }, + "connections": { + "16'h0": [ + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154 + ] + } + }, + "const_3_2_h2": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h2": "output" + }, + "connections": { + "2'h2": [ + 171, + 172 + ] + } + } + }, + "netnames": { + "tapIndex": { + "bits": [ + 2, + 3 + ], + "logic_type": { + "width": 2 + }, + "attributes": {} + }, + "coeffArray": { + "bits": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51 + ], + "logic_type": { + "width": 48, + "arrayDims": [ + 3 + ], + "elementWidth": 16 + }, + "attributes": {} + }, + "coeffOut": { + "bits": [ + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "tapMatch0": { + "bits": [ + 68 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapMatch1": { + "bits": [ + 69 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapMatch2": { + "bits": [ + 70 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "_d0__out": { + "bits": [ + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "coeffArray_0_": { + "bits": [ + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "_out": { + "bits": [ + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "coeffArray_1_": { + "bits": [ + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray_2_": { + "bits": [ + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "const_0_2_h0": { + "bits": [ + 103, + 104 + ], + "attributes": { + "computed": 1 + } + }, + "const_1_2_h1": { + "bits": [ + 137, + 138 + ], + "attributes": { + "computed": 1 + } + }, + "const_2_16_h0": { + "bits": [ + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154 + ], + "attributes": { + "computed": 1 + } + }, + "const_3_2_h2": { + "bits": [ + 171, + 172 + ], + "attributes": { + "computed": 1 + } + } + } + }, + "MacUnit_W16": { + "attributes": { + "src": "generated", + "rohd.src_trace": { + "signals": { + "sampleIn": [ + "3:56:16", + "1:147:17", + "2:208:7" + ], + "coeffIn": [ + "3:57:15", + "1:147:17", + "2:208:7" + ], + "accumIn": [ + "3:58:15", + "1:147:17", + "2:208:7" + ], + "clk": [ + "3:59:11", + "1:147:17", + "2:208:7" + ], + "reset": [ + "3:60:13", + "1:147:17", + "2:208:7" + ], + "enable": [ + "3:61:14", + "1:147:17", + "2:208:7" + ], + "result": [ + "3:62:20", + "1:147:17", + "2:208:7" + ], + "macSum": [ + "3:80:54" + ], + "product": [ + "3:75:54" + ], + "coeffIn_stage2_o": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "accumIn_stage2_o": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "sampleIn_stage1_o": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "sampleIn_stage2_i": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "_in4__out": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "_in5__out": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "sampleIn_stage0_o": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "_out": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "_in5__out_0": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "sampleIn_stage1_i": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "coeffIn_stage1_i": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "sampleIn_stage1": [ + "3:80:36" + ], + "_sampleIn_stage1_add_accumIn_stage1_carry": [ + "3:80:36" + ], + "accumIn_stage1_o": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "accumIn_stage2_i": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "_in4__out_0": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "_in5__out_1": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "accumIn_stage0_o": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "accumIn_stage1_i": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "sampleIn_stage0": [ + "3:75:36" + ], + "coeffIn_stage0_o": [ + "3:75:36" + ], + "stall": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "coeffIn_stage1_o": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "coeffIn_stage2_i": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "16'h0": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "1'h1": [ + "3:66:18", + "1:147:17", + "2:208:7" + ] + }, + "instances": { + "comb_stage2": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "mux": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "ff_sampleIn": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "mux_0": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "mux_1": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "ff_coeffIn": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "comb_stage1": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "add": [ + "3:80:36" + ], + "mux_2": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "ff_accumIn": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "mux_3": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "comb_stage0": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "multiply": [ + "3:75:36" + ], + "mux_4": [ + "3:66:18", + "1:147:17", + "2:208:7" + ], + "not_": [ + "3:63:20", + "1:147:17", + "2:208:7" + ] + } + } + }, + "ports": { + "sampleIn": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "logic_type": { + "width": 16 + } + }, + "coeffIn": { + "direction": "input", + "bits": [ + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33 + ], + "logic_type": { + "width": 16 + } + }, + "accumIn": { + "direction": "input", + "bits": [ + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49 + ], + "logic_type": { + "width": 16 + } + }, + "clk": { + "direction": "input", + "bits": [ + 50 + ], + "logic_type": { + "width": 1 + } + }, + "reset": { + "direction": "input", + "bits": [ + 51 + ], + "logic_type": { + "width": 1 + } + }, + "enable": { + "direction": "input", + "bits": [ + 52 + ], + "logic_type": { + "width": 1 + } + }, + "result": { + "direction": "output", + "bits": [ + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68 + ], + "logic_type": { + "width": 16 + } + } + }, + "cells": { + "comb_stage2": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "sampleIn_stage2_i": "input", + "coeffIn_stage2_i": "input", + "accumIn_stage2_i": "input", + "result": "output", + "coeffIn_stage2_o": "output", + "accumIn_stage2_o": "output" + }, + "connections": { + "sampleIn_stage2_i": [ + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84 + ], + "coeffIn_stage2_i": [ + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309 + ], + "accumIn_stage2_i": [ + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277 + ], + "result": [ + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68 + ], + "coeffIn_stage2_o": [ + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341 + ], + "accumIn_stage2_o": [ + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357 + ] + } + }, + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 101 + ], + "A": [ + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325 + ], + "B": [ + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84 + ], + "Y": [ + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373 + ] + } + }, + "ff_sampleIn": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "_in4__out": "input", + "_in5__out": "input", + "reset": "input", + "clk": "input", + "sampleIn_stage1_i": "output", + "sampleIn_stage2_i": "output" + }, + "connections": { + "_in4__out": [ + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422 + ], + "_in5__out": [ + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373 + ], + "reset": [ + 51 + ], + "clk": [ + 50 + ], + "sampleIn_stage1_i": [ + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100 + ], + "sampleIn_stage2_i": [ + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 101 + ], + "A": [ + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261 + ], + "B": [ + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100 + ], + "Y": [ + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422 + ] + } + }, + "mux_1": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 101 + ], + "A": [ + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245 + ], + "B": [ + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117 + ], + "Y": [ + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438 + ] + } + }, + "ff_coeffIn": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "reset": "input", + "_out": "input", + "_in5__out_0": "input", + "clk": "input", + "coeffIn_stage1_i": "output", + "coeffIn_stage2_i": "output" + }, + "connections": { + "reset": [ + 51 + ], + "_out": [ + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438 + ], + "_in5__out_0": [ + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487 + ], + "clk": [ + 50 + ], + "coeffIn_stage1_i": [ + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117 + ], + "coeffIn_stage2_i": [ + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309 + ] + } + }, + "comb_stage1": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "sampleIn_stage1_i": "input", + "coeffIn_stage1_i": "input", + "accumIn_stage1_i": "input", + "macSum": "input", + "sampleIn_stage1": "output", + "coeffIn_stage1_o": "output", + "accumIn_stage1_o": "output", + "sampleIn_stage1_o": "output" + }, + "connections": { + "sampleIn_stage1_i": [ + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100 + ], + "coeffIn_stage1_i": [ + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117 + ], + "accumIn_stage1_i": [ + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181 + ], + "macSum": [ + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149 + ], + "sampleIn_stage1": [ + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133 + ], + "coeffIn_stage1_o": [ + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293 + ], + "accumIn_stage1_o": [ + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165 + ], + "sampleIn_stage1_o": [ + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325 + ] + } + }, + "add": { + "hide_name": 0, + "type": "$add", + "parameters": { + "A_WIDTH": 16, + "B_WIDTH": 16, + "Y_WIDTH": 17 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133 + ], + "B": [ + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165 + ], + "Y": [ + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 488 + ] + } + }, + "mux_2": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 101 + ], + "A": [ + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165 + ], + "B": [ + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277 + ], + "Y": [ + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504 + ] + } + }, + "ff_accumIn": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "reset": "input", + "_in4__out_0": "input", + "_in5__out_1": "input", + "clk": "input", + "accumIn_stage1_i": "output", + "accumIn_stage2_i": "output" + }, + "connections": { + "reset": [ + 51 + ], + "_in4__out_0": [ + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553 + ], + "_in5__out_1": [ + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504 + ], + "clk": [ + 50 + ], + "accumIn_stage1_i": [ + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181 + ], + "accumIn_stage2_i": [ + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277 + ] + } + }, + "mux_3": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 101 + ], + "A": [ + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197 + ], + "B": [ + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181 + ], + "Y": [ + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553 + ] + } + }, + "comb_stage0": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "sampleIn": "input", + "coeffIn": "input", + "accumIn": "input", + "product": "input", + "sampleIn_stage0": "output", + "coeffIn_stage0_o": "output", + "accumIn_stage0_o": "output", + "sampleIn_stage0_o": "output" + }, + "connections": { + "sampleIn": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "coeffIn": [ + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33 + ], + "accumIn": [ + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49 + ], + "product": [ + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213 + ], + "sampleIn_stage0": [ + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229 + ], + "coeffIn_stage0_o": [ + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245 + ], + "accumIn_stage0_o": [ + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197 + ], + "sampleIn_stage0_o": [ + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261 + ] + } + }, + "multiply": { + "hide_name": 0, + "type": "$mul", + "parameters": { + "A_WIDTH": 16, + "B_WIDTH": 16, + "Y_WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229 + ], + "B": [ + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245 + ], + "Y": [ + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213 + ] + } + }, + "mux_4": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 101 + ], + "A": [ + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293 + ], + "B": [ + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309 + ], + "Y": [ + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487 + ] + } + }, + "not_": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 52 + ], + "Y": [ + 101 + ] + } + } + }, + "netnames": { + "sampleIn": { + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "coeffIn": { + "bits": [ + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "accumIn": { + "bits": [ + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "clk": { + "bits": [ + 50 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "reset": { + "bits": [ + 51 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "enable": { + "bits": [ + 52 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "result": { + "bits": [ + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "sampleIn_stage2_i": { + "bits": [ + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "sampleIn_stage1_i": { + "bits": [ + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "stall": { + "bits": [ + 101 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "coeffIn_stage1_i": { + "bits": [ + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "sampleIn_stage1": { + "bits": [ + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "macSum": { + "bits": [ + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "accumIn_stage1_o": { + "bits": [ + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "accumIn_stage1_i": { + "bits": [ + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "accumIn_stage0_o": { + "bits": [ + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "product": { + "bits": [ + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "sampleIn_stage0": { + "bits": [ + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "coeffIn_stage0_o": { + "bits": [ + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "sampleIn_stage0_o": { + "bits": [ + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "accumIn_stage2_i": { + "bits": [ + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "coeffIn_stage1_o": { + "bits": [ + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "coeffIn_stage2_i": { + "bits": [ + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "sampleIn_stage1_o": { + "bits": [ + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "coeffIn_stage2_o": { + "bits": [ + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "accumIn_stage2_o": { + "bits": [ + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_in5__out": { + "bits": [ + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_in4__out": { + "bits": [ + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_out": { + "bits": [ + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_in5__out_0": { + "bits": [ + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_sampleIn_stage1_add_accumIn_stage1_carry": { + "bits": [ + 488 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "_in5__out_1": { + "bits": [ + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_in4__out_0": { + "bits": [ + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + } + } + }, + "FilterChannel_T3_W16": { + "attributes": { + "src": "generated", + "rohd.src_trace": { + "signals": { + "sampleIn": [ + "4:96:26", + "1:75:9", + "2:208:7" + ], + "validIn": [ + "4:96:26", + "1:75:9", + "2:208:7" + ], + "clk": [ + "1:81:11", + "2:208:7" + ], + "reset": [ + "1:82:13", + "2:208:7" + ], + "enable": [ + "1:83:14", + "2:208:7" + ], + "dataOut": [ + "4:113:22", + "1:75:9", + "2:208:7" + ], + "validOut": [ + "4:113:22", + "1:75:9", + "2:208:7" + ], + "validPipe": [ + "1:199:23", + "2:208:7" + ], + "outputReady": [ + "1:200:46", + "2:208:7" + ], + "lastTapD2": [ + "1:184:23", + "2:208:7" + ], + "lastTapD1": [ + "1:183:23", + "2:208:7" + ], + "outputReg": [ + "1:185:23", + "2:208:7" + ], + "lastTap": [ + "1:166:63", + "2:208:7" + ], + "tapCounter": [ + "1:90:24", + "2:208:7" + ], + "atFirstTap": [ + "1:92:53", + "2:208:7" + ], + "shiftEn": [ + "1:93:21", + "2:208:7" + ], + "nextTap0": [ + "1:101:23", + "2:208:7" + ], + "delayLine": [ + "1:97:23", + "2:208:7" + ], + "delayLine[0]": [ + "1:97:23", + "2:208:7" + ], + "delayLine[1]": [ + "1:97:23", + "2:208:7" + ], + "nextTap1": [ + "1:101:23", + "2:208:7" + ], + "nextTap2": [ + "1:101:23", + "2:208:7" + ], + "delayLine[2]": [ + "1:97:23", + "2:208:7" + ], + "tapMux2": [ + "1:130:12", + "2:208:7" + ], + "accumReg": [ + "1:134:22", + "2:208:7" + ], + "accumFeedback": [ + "1:137:27", + "2:208:7" + ], + "coeffArray": [ + "1:111:24", + "2:208:7" + ], + "coeffArray[0]": [ + "1:111:24", + "2:208:7" + ], + "coeffArray[1]": [ + "1:111:24", + "2:208:7" + ], + "coeffArray[2]": [ + "1:111:24", + "2:208:7" + ], + "tapSelect2": [ + "1:128:55", + "2:208:7" + ], + "tapMux1": [ + "1:130:12", + "2:208:7" + ], + "tapSelect1": [ + "1:128:55", + "2:208:7" + ], + "enableAndValid": [ + "1:94:35", + "2:208:7" + ], + "_in7__tapCounter_add_const_1": [ + "1:167:5", + "2:208:7" + ], + "coeffIn": [ + "3:57:15", + "1:147:17", + "2:208:7" + ], + "result": [ + "1:159:17", + "2:208:7" + ], + "_tapCounter_add_const_1_carry": [ + "1:172:35", + "2:208:7" + ], + "16'h1": [ + "1:113:33", + "2:208:7" + ], + "16'hfffe": [ + "1:113:33", + "2:208:7" + ], + "1'h1": [ + "1:213:7", + "2:208:7" + ], + "16'h0": [ + "1:216:19", + "2:208:7" + ], + "1'h0": [ + "1:203:5", + "2:208:7" + ], + "2'h0": [ + "1:167:5", + "2:208:7" + ], + "2'h2": [ + "1:128:25", + "2:208:7" + ], + "2'h1": [ + "1:128:25", + "2:208:7" + ] + }, + "instances": { + "combinational": [ + "1:212:5", + "2:208:7" + ], + "sequential": [ + "1:203:5", + "2:208:7" + ], + "and_": [ + "1:200:36", + "2:208:7" + ], + "sequential_0": [ + "1:188:5", + "2:208:7" + ], + "sequential_1": [ + "1:167:5", + "2:208:7" + ], + "equals": [ + "1:92:20", + "2:208:7" + ], + "and__0": [ + "1:94:59", + "2:208:7" + ], + "mux": [ + "1:102:18", + "2:208:7" + ], + "flipflop": [ + "1:104:32", + "2:208:7" + ], + "flipflop_0": [ + "1:104:32", + "2:208:7" + ], + "mux_0": [ + "1:102:18", + "2:208:7" + ], + "mux_1": [ + "1:102:18", + "2:208:7" + ], + "flipflop_1": [ + "1:104:32", + "2:208:7" + ], + "mux_2": [ + "1:129:24", + "2:208:7" + ], + "mac": [ + "3:55:9", + "1:147:17", + "2:208:7" + ], + "flipflop_2": [ + "1:159:17", + "2:208:7" + ], + "combinational_0": [ + "1:138:5", + "2:208:7" + ], + "coeffBank": [ + "0:44:9", + "1:116:23", + "2:208:7" + ], + "equals_0": [ + "1:128:22", + "2:208:7" + ], + "mux_3": [ + "1:129:24", + "2:208:7" + ], + "equals_1": [ + "1:128:22", + "2:208:7" + ], + "and__1": [ + "1:94:24", + "2:208:7" + ], + "equals_2": [ + "1:166:20", + "2:208:7" + ], + "add": [ + "1:172:35", + "2:208:7" + ] + } + } + }, + "ports": { + "sampleIn": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "logic_type": { + "width": 16 + } + }, + "validIn": { + "direction": "input", + "bits": [ + 18 + ], + "logic_type": { + "width": 1 + } + }, + "clk": { + "direction": "input", + "bits": [ + 19 + ], + "logic_type": { + "width": 1 + } + }, + "reset": { + "direction": "input", + "bits": [ + 20 + ], + "logic_type": { + "width": 1 + } + }, + "enable": { + "direction": "input", + "bits": [ + 21 + ], + "logic_type": { + "width": 1 + } + }, + "dataOut": { + "direction": "output", + "bits": [ + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ], + "logic_type": { + "width": 16 + } + }, + "validOut": { + "direction": "output", + "bits": [ + 38 + ], + "logic_type": { + "width": 1 + } + } + }, + "cells": { + "combinational": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "validPipe": "input", + "outputReg": "input", + "dataOut": "output", + "validOut": "output" + }, + "connections": { + "validPipe": [ + 39 + ], + "outputReg": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ], + "dataOut": [ + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ], + "validOut": [ + 38 + ] + } + }, + "sequential": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "reset": "input", + "enable": "input", + "outputReady": "input", + "clk": "input", + "validPipe": "output" + }, + "connections": { + "reset": [ + 20 + ], + "enable": [ + 21 + ], + "outputReady": [ + 40 + ], + "clk": [ + 19 + ], + "validPipe": [ + 39 + ] + } + }, + "and_": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 41 + ], + "B": [ + 21 + ], + "Y": [ + 40 + ] + } + }, + "sequential_0": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "reset": "input", + "lastTap": "input", + "lastTapD1": "input", + "lastTapD2": "input", + "accumReg": "input", + "clk": "input", + "lastTapD1__out9_lastTapD1": "output", + "lastTapD2__out10_lastTapD2": "output", + "outputReg": "output" + }, + "connections": { + "reset": [ + 20 + ], + "lastTap": [ + 59 + ], + "lastTapD1": [ + 42 + ], + "lastTapD2": [ + 41 + ], + "accumReg": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "clk": [ + 19 + ], + "lastTapD1__out9_lastTapD1": [ + 42 + ], + "lastTapD2__out10_lastTapD2": [ + 41 + ], + "outputReg": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ] + } + }, + "sequential_1": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "_in7__tapCounter_add_const_1": "input", + "reset": "input", + "enable": "input", + "lastTap": "input", + "clk": "input", + "tapCounter": "output" + }, + "connections": { + "_in7__tapCounter_add_const_1": [ + 415, + 416 + ], + "reset": [ + 20 + ], + "enable": [ + 21 + ], + "lastTap": [ + 59 + ], + "clk": [ + 19 + ], + "tapCounter": [ + 60, + 61 + ] + } + }, + "equals": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 420, + 421 + ], + "Y": [ + 62 + ] + } + }, + "and__0": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 370 + ], + "B": [ + 62 + ], + "Y": [ + 63 + ] + } + }, + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 63 + ], + "A": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "B": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "Y": [ + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79 + ] + } + }, + "flipflop": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79 + ], + "Q": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "SRST": [ + 20 + ] + } + }, + "flipflop_0": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175 + ], + "Q": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "SRST": [ + 20 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 63 + ], + "A": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "B": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "Y": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175 + ] + } + }, + "mux_1": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 63 + ], + "A": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "B": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "Y": [ + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191 + ] + } + }, + "flipflop_1": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191 + ], + "Q": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "SRST": [ + 20 + ] + } + }, + "mux_2": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 352 + ], + "A": [ + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368 + ], + "B": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "Y": [ + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223 + ] + } + }, + "mac": { + "hide_name": 0, + "type": "MacUnit_W16", + "parameters": {}, + "attributes": {}, + "port_directions": { + "sampleIn": "input", + "coeffIn": "input", + "accumIn": "input", + "clk": "input", + "reset": "input", + "enable": "input", + "result": "output" + }, + "connections": { + "sampleIn": [ + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223 + ], + "coeffIn": [ + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437 + ], + "accumIn": [ + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255 + ], + "clk": [ + 19 + ], + "reset": [ + 20 + ], + "enable": [ + 21 + ], + "result": [ + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453 + ] + } + }, + "flipflop_2": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453 + ], + "Q": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "SRST": [ + 20 + ] + } + }, + "combinational_0": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "atFirstTap": "input", + "accumReg": "input", + "accumFeedback": "output" + }, + "connections": { + "atFirstTap": [ + 62 + ], + "accumReg": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "accumFeedback": [ + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255 + ] + } + }, + "array_concat_coeffBank_coeffArray": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 16, + "IN1_WIDTH": 16, + "IN2_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arrayConcat", + "port_directions": { + "[15:0]": "input", + "[31:16]": "input", + "[47:32]": "input", + "Y": "output" + }, + "connections": { + "[15:0]": [ + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687 + ], + "[31:16]": [ + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703 + ], + "[47:32]": [ + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719 + ], + "Y": [ + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623 + ] + } + }, + "coeffBank": { + "hide_name": 0, + "type": "CoeffBank_T3_W16", + "parameters": {}, + "attributes": {}, + "port_directions": { + "tapIndex": "input", + "coeffArray": "input", + "coeffOut": "output" + }, + "connections": { + "tapIndex": [ + 60, + 61 + ], + "coeffArray": [ + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623 + ], + "coeffOut": [ + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437 + ] + } + }, + "equals_0": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 519, + 520 + ], + "Y": [ + 352 + ] + } + }, + "mux_3": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 369 + ], + "A": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "B": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "Y": [ + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368 + ] + } + }, + "equals_1": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 521, + 522 + ], + "Y": [ + 369 + ] + } + }, + "and__1": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 21 + ], + "B": [ + 18 + ], + "Y": [ + 370 + ] + } + }, + "equals_2": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 523, + 524 + ], + "Y": [ + 59 + ] + } + }, + "add": { + "hide_name": 0, + "type": "$add", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 525, + 526 + ], + "Y": [ + 415, + 416, + 527 + ] + } + }, + "array_concat": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 16, + "IN1_WIDTH": 16, + "IN2_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arrayConcat", + "port_directions": { + "[15:0]": "input", + "[31:16]": "input", + "[47:32]": "input", + "Y": "output" + }, + "connections": { + "[15:0]": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "[31:16]": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "[47:32]": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "Y": [ + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671 + ] + } + }, + "array_concat_0": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 16, + "IN1_WIDTH": 16, + "IN2_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arrayConcat", + "port_directions": { + "[15:0]": "input", + "[31:16]": "input", + "[47:32]": "input", + "Y": "output" + }, + "connections": { + "[15:0]": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ], + "[31:16]": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ], + "[47:32]": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "Y": [ + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719 + ] + } + }, + "const_0_2_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h0": "output" + }, + "connections": { + "2'h0": [ + 420, + 421 + ] + } + }, + "const_1_2_h2": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h2": "output" + }, + "connections": { + "2'h2": [ + 519, + 520 + ] + } + }, + "const_2_2_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h1": "output" + }, + "connections": { + "2'h1": [ + 521, + 522 + ] + } + }, + "const_3_2_h2": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h2": "output" + }, + "connections": { + "2'h2": [ + 523, + 524 + ] + } + }, + "const_4_2_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h1": "output" + }, + "connections": { + "2'h1": [ + 525, + 526 + ] + } + }, + "const_5_16_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "16'h1": "output" + }, + "connections": { + "16'h1": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ] + } + }, + "const_6_16_hfffe": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "16'hfffe": "output" + }, + "connections": { + "16'hfffe": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ] + } + }, + "const_7_16_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "16'h1": "output" + }, + "connections": { + "16'h1": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ] + } + } + }, + "netnames": { + "sampleIn": { + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "validIn": { + "bits": [ + 18 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "clk": { + "bits": [ + 19 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "reset": { + "bits": [ + 20 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "enable": { + "bits": [ + 21 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "dataOut": { + "bits": [ + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "validOut": { + "bits": [ + 38 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "validPipe": { + "bits": [ + 39 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "outputReady": { + "bits": [ + 40 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "lastTapD2": { + "bits": [ + 41 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "lastTapD1": { + "bits": [ + 42 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "outputReg": { + "bits": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "lastTap": { + "bits": [ + 59 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapCounter": { + "bits": [ + 60, + 61 + ], + "logic_type": { + "width": 2 + }, + "attributes": { + "preserved_name": 1 + } + }, + "atFirstTap": { + "bits": [ + 62 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "shiftEn": { + "bits": [ + 63 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "nextTap0": { + "bits": [ + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "delayLine_0_": { + "bits": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "delayLine_1_": { + "bits": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "nextTap1": { + "bits": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "nextTap2": { + "bits": [ + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "delayLine_2_": { + "bits": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapMux2": { + "bits": [ + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "accumReg": { + "bits": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "accumFeedback": { + "bits": [ + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray_0_": { + "bits": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray": { + "bits": [ + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719 + ], + "logic_type": { + "width": 48, + "arrayDims": [ + 3 + ], + "elementWidth": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray_1_": { + "bits": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray_2_": { + "bits": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapSelect2": { + "bits": [ + 352 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapMux1": { + "bits": [ + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapSelect1": { + "bits": [ + 369 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "enableAndValid": { + "bits": [ + 370 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "_in7__tapCounter_add_const_1": { + "bits": [ + 415, + 416 + ], + "logic_type": { + "width": 2 + }, + "attributes": {} + }, + "coeffIn": { + "bits": [ + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "result": { + "bits": [ + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_tapCounter_add_const_1_carry": { + "bits": [ + 527 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "const_0_2_h0": { + "bits": [ + 420, + 421 + ], + "attributes": { + "computed": 1 + } + }, + "const_1_2_h2": { + "bits": [ + 519, + 520 + ], + "attributes": { + "computed": 1 + } + }, + "const_2_2_h1": { + "bits": [ + 521, + 522 + ], + "attributes": { + "computed": 1 + } + }, + "const_3_2_h2": { + "bits": [ + 523, + 524 + ], + "attributes": { + "computed": 1 + } + }, + "const_4_2_h1": { + "bits": [ + 525, + 526 + ], + "attributes": { + "computed": 1 + } + }, + "const_5_16_h1": { + "bits": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ], + "attributes": { + "computed": 1 + } + }, + "const_6_16_hfffe": { + "bits": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ], + "attributes": { + "computed": 1 + } + }, + "const_7_16_h1": { + "bits": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "attributes": { + "computed": 1 + } + }, + "array_concat_coeffBank_coeffArray_Y": { + "bits": [ + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623 + ], + "hide_name": 1, + "attributes": {} + }, + "array_concat_Y": { + "bits": [ + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671 + ], + "hide_name": 1, + "attributes": {} + } + } + }, + "FilterController": { + "attributes": { + "src": "generated", + "rohd.src_trace": { + "signals": { + "clk": [ + "5:84:11", + "2:189:24" + ], + "reset": [ + "5:85:13", + "2:189:24" + ], + "start": [ + "5:86:13", + "2:189:24" + ], + "inputValid": [ + "5:87:18", + "2:189:24" + ], + "inputDone": [ + "5:88:17", + "2:189:24" + ], + "filterEnable": [ + "5:90:26", + "2:189:24" + ], + "loadingPhase": [ + "5:91:26", + "2:189:24" + ], + "doneFlag": [ + "5:92:22", + "2:189:24" + ], + "state": [ + "5:93:19", + "2:189:24" + ], + "currentState": [ + "6:124:13", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "isDraining": [ + "5:166:24", + "2:189:24" + ], + "drainCount": [ + "5:96:24", + "2:189:24" + ], + "drainDone": [ + "5:98:53", + "2:189:24" + ], + "nextState": [ + "6:126:13", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "FilterState_idle": [ + "6:142:28", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "FilterState_loading": [ + "6:142:28", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "FilterState_running": [ + "6:142:28", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "FilterState_draining": [ + "6:142:28", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "FilterState_done": [ + "6:142:28", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "_in4__drainCount_add_const_1": [ + "5:169:5", + "2:189:24" + ], + "_drainCount_add_const_1_carry": [ + "5:171:33", + "2:189:24" + ], + "3'h0": [ + "6:141:23", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "3'h1": [ + "6:141:23", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "3'h2": [ + "6:141:23", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "3'h3": [ + "6:141:23", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "3'h4": [ + "6:141:23", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "1'h0": [ + "5:111:26", + "2:189:24" + ], + "1'h1": [ + "6:146:29", + "6:159:16", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "0'h0": [ + "5:161:32", + "2:189:24" + ], + "8'h0": [ + "5:169:5", + "2:189:24" + ], + "8'h6": [ + "5:98:23", + "2:189:24" + ], + "8'h1": [ + "5:171:35", + "2:189:24" + ] + }, + "instances": { + "combinational": [ + "6:135:5", + "6:106:13", + "5:100:12", + "2:189:24" + ], + "swizzle": [ + "7:23:44", + "5:161:32", + "2:189:24" + ], + "equals": [ + "5:167:37", + "2:189:24" + ], + "sequential": [ + "5:169:5", + "2:189:24" + ], + "equals_0": [ + "5:98:20", + "2:189:24" + ], + "add": [ + "5:171:33", + "2:189:24" + ], + "sequential_0": [ + "6:177:16", + "6:106:13", + "5:100:12", + "2:189:24" + ] + } + } + }, + "ports": { + "clk": { + "direction": "input", + "bits": [ + 2 + ], + "logic_type": { + "width": 1 + } + }, + "reset": { + "direction": "input", + "bits": [ + 3 + ], + "logic_type": { + "width": 1 + } + }, + "start": { + "direction": "input", + "bits": [ + 4 + ], + "logic_type": { + "width": 1 + } + }, + "inputValid": { + "direction": "input", + "bits": [ + 5 + ], + "logic_type": { + "width": 1 + } + }, + "inputDone": { + "direction": "input", + "bits": [ + 6 + ], + "logic_type": { + "width": 1 + } + }, + "filterEnable": { + "direction": "output", + "bits": [ + 7 + ], + "logic_type": { + "width": 1 + } + }, + "loadingPhase": { + "direction": "output", + "bits": [ + 8 + ], + "logic_type": { + "width": 1 + } + }, + "doneFlag": { + "direction": "output", + "bits": [ + 9 + ], + "logic_type": { + "width": 1 + } + }, + "state": { + "direction": "output", + "bits": [ + 10, + 11, + 12 + ], + "logic_type": { + "width": 3 + } + } + }, + "cells": { + "combinational": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "currentState": "input", + "FilterState_idle": "input", + "start": "input", + "FilterState_loading": "input", + "inputValid": "input", + "FilterState_running": "input", + "inputDone": "input", + "FilterState_draining": "input", + "drainDone": "input", + "FilterState_done": "input", + "filterEnable": "output", + "loadingPhase": "output", + "doneFlag": "output", + "nextState": "output" + }, + "connections": { + "currentState": [ + 13, + 14, + 15 + ], + "FilterState_idle": [ + 144, + 145, + 146 + ], + "start": [ + 4 + ], + "FilterState_loading": [ + 147, + 148, + 149 + ], + "inputValid": [ + 5 + ], + "FilterState_running": [ + 150, + 151, + 152 + ], + "inputDone": [ + 6 + ], + "FilterState_draining": [ + 153, + 154, + 155 + ], + "drainDone": [ + 25 + ], + "FilterState_done": [ + 156, + 157, + 158 + ], + "filterEnable": [ + 7 + ], + "loadingPhase": [ + 8 + ], + "doneFlag": [ + 9 + ], + "nextState": [ + 26, + 27, + 28 + ] + } + }, + "swizzle": { + "hide_name": 0, + "type": "$buf", + "parameters": { + "WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 13, + 14, + 15 + ], + "Y": [ + 10, + 11, + 12 + ] + } + }, + "equals": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 3, + "B_WIDTH": 3, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 13, + 14, + 15 + ], + "B": [ + 94, + 95, + 96 + ], + "Y": [ + 16 + ] + } + }, + "sequential": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "_in4__drainCount_add_const_1": "input", + "reset": "input", + "isDraining": "input", + "clk": "input", + "drainCount": "output" + }, + "connections": { + "_in4__drainCount_add_const_1": [ + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113 + ], + "reset": [ + 3 + ], + "isDraining": [ + 16 + ], + "clk": [ + 2 + ], + "drainCount": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ] + } + }, + "equals_0": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 8, + "B_WIDTH": 8, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "B": [ + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130 + ], + "Y": [ + 25 + ] + } + }, + "add": { + "hide_name": 0, + "type": "$add", + "parameters": { + "A_WIDTH": 8, + "B_WIDTH": 8, + "Y_WIDTH": 9 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "B": [ + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138 + ], + "Y": [ + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 139 + ] + } + }, + "sequential_0": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "reset": "input", + "nextState": "input", + "clk": "input", + "currentState": "output" + }, + "connections": { + "reset": [ + 3 + ], + "nextState": [ + 26, + 27, + 28 + ], + "clk": [ + 2 + ], + "currentState": [ + 13, + 14, + 15 + ] + } + }, + "const_0_3_h3": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "3'h3": "output" + }, + "connections": { + "3'h3": [ + 94, + 95, + 96 + ] + } + }, + "const_1_8_h6": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "8'h6": "output" + }, + "connections": { + "8'h6": [ + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130 + ] + } + }, + "const_2_8_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "8'h1": "output" + }, + "connections": { + "8'h1": [ + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138 + ] + } + }, + "const_3_3_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "3'h0": "output" + }, + "connections": { + "3'h0": [ + 144, + 145, + 146 + ] + } + }, + "const_4_3_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "3'h1": "output" + }, + "connections": { + "3'h1": [ + 147, + 148, + 149 + ] + } + }, + "const_5_3_h2": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "3'h2": "output" + }, + "connections": { + "3'h2": [ + 150, + 151, + 152 + ] + } + }, + "const_6_3_h3": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "3'h3": "output" + }, + "connections": { + "3'h3": [ + 153, + 154, + 155 + ] + } + }, + "const_7_3_h4": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "3'h4": "output" + }, + "connections": { + "3'h4": [ + 156, + 157, + 158 + ] + } + } + }, + "netnames": { + "clk": { + "bits": [ + 2 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "reset": { + "bits": [ + 3 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "start": { + "bits": [ + 4 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "inputValid": { + "bits": [ + 5 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "inputDone": { + "bits": [ + 6 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "filterEnable": { + "bits": [ + 7 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "loadingPhase": { + "bits": [ + 8 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "doneFlag": { + "bits": [ + 9 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "state": { + "bits": [ + 10, + 11, + 12 + ], + "logic_type": { + "width": 3 + }, + "attributes": {} + }, + "currentState": { + "bits": [ + 13, + 14, + 15 + ], + "logic_type": { + "width": 3 + }, + "attributes": { + "preserved_name": 1 + } + }, + "isDraining": { + "bits": [ + 16 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "drainCount": { + "bits": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "logic_type": { + "width": 8 + }, + "attributes": { + "preserved_name": 1 + } + }, + "drainDone": { + "bits": [ + 25 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "nextState": { + "bits": [ + 26, + 27, + 28 + ], + "logic_type": { + "width": 3 + }, + "attributes": { + "preserved_name": 1 + } + }, + "FilterState_idle": { + "bits": [ + 144, + 145, + 146 + ], + "logic_type": { + "width": 3 + }, + "attributes": { + "preserved_name": 1 + } + }, + "FilterState_loading": { + "bits": [ + 147, + 148, + 149 + ], + "logic_type": { + "width": 3 + }, + "attributes": { + "preserved_name": 1 + } + }, + "FilterState_running": { + "bits": [ + 150, + 151, + 152 + ], + "logic_type": { + "width": 3 + }, + "attributes": { + "preserved_name": 1 + } + }, + "FilterState_draining": { + "bits": [ + 153, + 154, + 155 + ], + "logic_type": { + "width": 3 + }, + "attributes": { + "preserved_name": 1 + } + }, + "FilterState_done": { + "bits": [ + 156, + 157, + 158 + ], + "logic_type": { + "width": 3 + }, + "attributes": { + "preserved_name": 1 + } + }, + "_in4__drainCount_add_const_1": { + "bits": [ + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113 + ], + "logic_type": { + "width": 8 + }, + "attributes": {} + }, + "_drainCount_add_const_1_carry": { + "bits": [ + 139 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "const_0_3_h3": { + "bits": [ + 94, + 95, + 96 + ], + "attributes": { + "computed": 1 + } + }, + "const_1_8_h6": { + "bits": [ + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130 + ], + "attributes": { + "computed": 1 + } + }, + "const_2_8_h1": { + "bits": [ + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138 + ], + "attributes": { + "computed": 1 + } + }, + "const_3_3_h0": { + "bits": [ + 144, + 145, + 146 + ], + "attributes": { + "computed": 1 + } + }, + "const_4_3_h1": { + "bits": [ + 147, + 148, + 149 + ], + "attributes": { + "computed": 1 + } + }, + "const_5_3_h2": { + "bits": [ + 150, + 151, + 152 + ], + "attributes": { + "computed": 1 + } + }, + "const_6_3_h3": { + "bits": [ + 153, + 154, + 155 + ], + "attributes": { + "computed": 1 + } + }, + "const_7_3_h4": { + "bits": [ + 156, + 157, + 158 + ], + "attributes": { + "computed": 1 + } + } + } + }, + "FilterChannel_T3_W16_0": { + "attributes": { + "src": "generated", + "rohd.src_trace": { + "signals": { + "sampleIn": [ + "4:96:26", + "1:75:9", + "2:208:7" + ], + "validIn": [ + "4:96:26", + "1:75:9", + "2:208:7" + ], + "clk": [ + "1:81:11", + "2:208:7" + ], + "reset": [ + "1:82:13", + "2:208:7" + ], + "enable": [ + "1:83:14", + "2:208:7" + ], + "dataOut": [ + "4:113:22", + "1:75:9", + "2:208:7" + ], + "validOut": [ + "4:113:22", + "1:75:9", + "2:208:7" + ], + "validPipe": [ + "1:199:23", + "2:208:7" + ], + "outputReady": [ + "1:200:46", + "2:208:7" + ], + "lastTapD2": [ + "1:184:23", + "2:208:7" + ], + "lastTapD1": [ + "1:183:23", + "2:208:7" + ], + "outputReg": [ + "1:185:23", + "2:208:7" + ], + "lastTap": [ + "1:166:63", + "2:208:7" + ], + "tapCounter": [ + "1:90:24", + "2:208:7" + ], + "atFirstTap": [ + "1:92:53", + "2:208:7" + ], + "shiftEn": [ + "1:93:21", + "2:208:7" + ], + "nextTap0": [ + "1:101:23", + "2:208:7" + ], + "delayLine": [ + "1:97:23", + "2:208:7" + ], + "delayLine[0]": [ + "1:97:23", + "2:208:7" + ], + "delayLine[1]": [ + "1:97:23", + "2:208:7" + ], + "nextTap1": [ + "1:101:23", + "2:208:7" + ], + "nextTap2": [ + "1:101:23", + "2:208:7" + ], + "delayLine[2]": [ + "1:97:23", + "2:208:7" + ], + "tapMux2": [ + "1:130:12", + "2:208:7" + ], + "accumReg": [ + "1:134:22", + "2:208:7" + ], + "accumFeedback": [ + "1:137:27", + "2:208:7" + ], + "coeffArray": [ + "1:111:24", + "2:208:7" + ], + "coeffArray[0]": [ + "1:111:24", + "2:208:7" + ], + "coeffArray[1]": [ + "1:111:24", + "2:208:7" + ], + "coeffArray[2]": [ + "1:111:24", + "2:208:7" + ], + "tapSelect2": [ + "1:128:55", + "2:208:7" + ], + "tapMux1": [ + "1:130:12", + "2:208:7" + ], + "tapSelect1": [ + "1:128:55", + "2:208:7" + ], + "enableAndValid": [ + "1:94:35", + "2:208:7" + ], + "_in7__tapCounter_add_const_1": [ + "1:167:5", + "2:208:7" + ], + "coeffIn": [ + "3:57:15", + "1:147:17", + "2:208:7" + ], + "result": [ + "1:159:17", + "2:208:7" + ], + "_tapCounter_add_const_1_carry": [ + "1:172:35", + "2:208:7" + ], + "16'h1": [ + "1:113:33", + "2:208:7" + ], + "16'h2": [ + "1:113:33", + "2:208:7" + ], + "1'h1": [ + "1:213:7", + "2:208:7" + ], + "16'h0": [ + "1:216:19", + "2:208:7" + ], + "1'h0": [ + "1:203:5", + "2:208:7" + ], + "2'h0": [ + "1:167:5", + "2:208:7" + ], + "2'h2": [ + "1:128:25", + "2:208:7" + ], + "2'h1": [ + "1:128:25", + "2:208:7" + ] + }, + "instances": { + "combinational": [ + "1:212:5", + "2:208:7" + ], + "sequential": [ + "1:203:5", + "2:208:7" + ], + "and_": [ + "1:200:36", + "2:208:7" + ], + "sequential_0": [ + "1:188:5", + "2:208:7" + ], + "sequential_1": [ + "1:167:5", + "2:208:7" + ], + "equals": [ + "1:92:20", + "2:208:7" + ], + "and__0": [ + "1:94:59", + "2:208:7" + ], + "mux": [ + "1:102:18", + "2:208:7" + ], + "flipflop": [ + "1:104:32", + "2:208:7" + ], + "flipflop_0": [ + "1:104:32", + "2:208:7" + ], + "mux_0": [ + "1:102:18", + "2:208:7" + ], + "mux_1": [ + "1:102:18", + "2:208:7" + ], + "flipflop_1": [ + "1:104:32", + "2:208:7" + ], + "mux_2": [ + "1:129:24", + "2:208:7" + ], + "mac": [ + "3:55:9", + "1:147:17", + "2:208:7" + ], + "flipflop_2": [ + "1:159:17", + "2:208:7" + ], + "combinational_0": [ + "1:138:5", + "2:208:7" + ], + "coeffBank": [ + "0:44:9", + "1:116:23", + "2:208:7" + ], + "equals_0": [ + "1:128:22", + "2:208:7" + ], + "mux_3": [ + "1:129:24", + "2:208:7" + ], + "equals_1": [ + "1:128:22", + "2:208:7" + ], + "and__1": [ + "1:94:24", + "2:208:7" + ], + "equals_2": [ + "1:166:20", + "2:208:7" + ], + "add": [ + "1:172:35", + "2:208:7" + ] + } + } + }, + "ports": { + "sampleIn": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "logic_type": { + "width": 16 + } + }, + "validIn": { + "direction": "input", + "bits": [ + 18 + ], + "logic_type": { + "width": 1 + } + }, + "clk": { + "direction": "input", + "bits": [ + 19 + ], + "logic_type": { + "width": 1 + } + }, + "reset": { + "direction": "input", + "bits": [ + 20 + ], + "logic_type": { + "width": 1 + } + }, + "enable": { + "direction": "input", + "bits": [ + 21 + ], + "logic_type": { + "width": 1 + } + }, + "dataOut": { + "direction": "output", + "bits": [ + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ], + "logic_type": { + "width": 16 + } + }, + "validOut": { + "direction": "output", + "bits": [ + 38 + ], + "logic_type": { + "width": 1 + } + } + }, + "cells": { + "combinational": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "validPipe": "input", + "outputReg": "input", + "dataOut": "output", + "validOut": "output" + }, + "connections": { + "validPipe": [ + 39 + ], + "outputReg": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ], + "dataOut": [ + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ], + "validOut": [ + 38 + ] + } + }, + "sequential": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "reset": "input", + "enable": "input", + "outputReady": "input", + "clk": "input", + "validPipe": "output" + }, + "connections": { + "reset": [ + 20 + ], + "enable": [ + 21 + ], + "outputReady": [ + 40 + ], + "clk": [ + 19 + ], + "validPipe": [ + 39 + ] + } + }, + "and_": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 41 + ], + "B": [ + 21 + ], + "Y": [ + 40 + ] + } + }, + "sequential_0": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "reset": "input", + "lastTap": "input", + "lastTapD1": "input", + "lastTapD2": "input", + "accumReg": "input", + "clk": "input", + "lastTapD1__out9_lastTapD1": "output", + "lastTapD2__out10_lastTapD2": "output", + "outputReg": "output" + }, + "connections": { + "reset": [ + 20 + ], + "lastTap": [ + 59 + ], + "lastTapD1": [ + 42 + ], + "lastTapD2": [ + 41 + ], + "accumReg": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "clk": [ + 19 + ], + "lastTapD1__out9_lastTapD1": [ + 42 + ], + "lastTapD2__out10_lastTapD2": [ + 41 + ], + "outputReg": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ] + } + }, + "sequential_1": { + "hide_name": 0, + "type": "Sequential", + "parameters": {}, + "attributes": {}, + "port_directions": { + "_in7__tapCounter_add_const_1": "input", + "reset": "input", + "enable": "input", + "lastTap": "input", + "clk": "input", + "tapCounter": "output" + }, + "connections": { + "_in7__tapCounter_add_const_1": [ + 415, + 416 + ], + "reset": [ + 20 + ], + "enable": [ + 21 + ], + "lastTap": [ + 59 + ], + "clk": [ + 19 + ], + "tapCounter": [ + 60, + 61 + ] + } + }, + "equals": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 420, + 421 + ], + "Y": [ + 62 + ] + } + }, + "and__0": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 370 + ], + "B": [ + 62 + ], + "Y": [ + 63 + ] + } + }, + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 63 + ], + "A": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "B": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "Y": [ + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79 + ] + } + }, + "flipflop": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79 + ], + "Q": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "SRST": [ + 20 + ] + } + }, + "flipflop_0": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175 + ], + "Q": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "SRST": [ + 20 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 63 + ], + "A": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "B": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "Y": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175 + ] + } + }, + "mux_1": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 63 + ], + "A": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "B": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "Y": [ + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191 + ] + } + }, + "flipflop_1": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191 + ], + "Q": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "SRST": [ + 20 + ] + } + }, + "mux_2": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 352 + ], + "A": [ + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368 + ], + "B": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "Y": [ + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223 + ] + } + }, + "mac": { + "hide_name": 0, + "type": "MacUnit_W16", + "parameters": {}, + "attributes": {}, + "port_directions": { + "sampleIn": "input", + "coeffIn": "input", + "accumIn": "input", + "clk": "input", + "reset": "input", + "enable": "input", + "result": "output" + }, + "connections": { + "sampleIn": [ + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223 + ], + "coeffIn": [ + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437 + ], + "accumIn": [ + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255 + ], + "clk": [ + 19 + ], + "reset": [ + 20 + ], + "enable": [ + 21 + ], + "result": [ + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453 + ] + } + }, + "flipflop_2": { + "hide_name": 0, + "type": "$sdff", + "parameters": { + "WIDTH": 16, + "CLK_POLARITY": 1, + "SRST_POLARITY": 1, + "SRST_VALUE": "0000000000000000" + }, + "attributes": {}, + "port_directions": { + "CLK": "input", + "D": "input", + "Q": "output", + "SRST": "input" + }, + "connections": { + "CLK": [ + 19 + ], + "D": [ + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453 + ], + "Q": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "SRST": [ + 20 + ] + } + }, + "combinational_0": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "atFirstTap": "input", + "accumReg": "input", + "accumFeedback": "output" + }, + "connections": { + "atFirstTap": [ + 62 + ], + "accumReg": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "accumFeedback": [ + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255 + ] + } + }, + "array_concat_coeffBank_coeffArray": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 16, + "IN1_WIDTH": 16, + "IN2_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arrayConcat", + "port_directions": { + "[15:0]": "input", + "[31:16]": "input", + "[47:32]": "input", + "Y": "output" + }, + "connections": { + "[15:0]": [ + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687 + ], + "[31:16]": [ + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703 + ], + "[47:32]": [ + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719 + ], + "Y": [ + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623 + ] + } + }, + "coeffBank": { + "hide_name": 0, + "type": "CoeffBank_T3_W16", + "parameters": {}, + "attributes": {}, + "port_directions": { + "tapIndex": "input", + "coeffArray": "input", + "coeffOut": "output" + }, + "connections": { + "tapIndex": [ + 60, + 61 + ], + "coeffArray": [ + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623 + ], + "coeffOut": [ + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437 + ] + } + }, + "equals_0": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 519, + 520 + ], + "Y": [ + 352 + ] + } + }, + "mux_3": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 16 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 369 + ], + "A": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "B": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "Y": [ + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368 + ] + } + }, + "equals_1": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 521, + 522 + ], + "Y": [ + 369 + ] + } + }, + "and__1": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 21 + ], + "B": [ + 18 + ], + "Y": [ + 370 + ] + } + }, + "equals_2": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 523, + 524 + ], + "Y": [ + 59 + ] + } + }, + "add": { + "hide_name": 0, + "type": "$add", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61 + ], + "B": [ + 525, + 526 + ], + "Y": [ + 415, + 416, + 527 + ] + } + }, + "array_concat": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 16, + "IN1_WIDTH": 16, + "IN2_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arrayConcat", + "port_directions": { + "[15:0]": "input", + "[31:16]": "input", + "[47:32]": "input", + "Y": "output" + }, + "connections": { + "[15:0]": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "[31:16]": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "[47:32]": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "Y": [ + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671 + ] + } + }, + "array_concat_0": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 16, + "IN1_WIDTH": 16, + "IN2_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "arrayConcat", + "port_directions": { + "[15:0]": "input", + "[31:16]": "input", + "[47:32]": "input", + "Y": "output" + }, + "connections": { + "[15:0]": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ], + "[31:16]": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ], + "[47:32]": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "Y": [ + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719 + ] + } + }, + "const_0_2_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h0": "output" + }, + "connections": { + "2'h0": [ + 420, + 421 + ] + } + }, + "const_1_2_h2": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h2": "output" + }, + "connections": { + "2'h2": [ + 519, + 520 + ] + } + }, + "const_2_2_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h1": "output" + }, + "connections": { + "2'h1": [ + 521, + 522 + ] + } + }, + "const_3_2_h2": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h2": "output" + }, + "connections": { + "2'h2": [ + 523, + 524 + ] + } + }, + "const_4_2_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h1": "output" + }, + "connections": { + "2'h1": [ + 525, + 526 + ] + } + }, + "const_5_16_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "16'h1": "output" + }, + "connections": { + "16'h1": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ] + } + }, + "const_6_16_h2": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "16'h2": "output" + }, + "connections": { + "16'h2": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ] + } + }, + "const_7_16_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "16'h1": "output" + }, + "connections": { + "16'h1": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ] + } + } + }, + "netnames": { + "sampleIn": { + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "validIn": { + "bits": [ + 18 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "clk": { + "bits": [ + 19 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "reset": { + "bits": [ + 20 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "enable": { + "bits": [ + 21 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "dataOut": { + "bits": [ + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "validOut": { + "bits": [ + 38 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "validPipe": { + "bits": [ + 39 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "outputReady": { + "bits": [ + 40 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "lastTapD2": { + "bits": [ + 41 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "lastTapD1": { + "bits": [ + 42 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "outputReg": { + "bits": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "lastTap": { + "bits": [ + 59 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapCounter": { + "bits": [ + 60, + 61 + ], + "logic_type": { + "width": 2 + }, + "attributes": { + "preserved_name": 1 + } + }, + "atFirstTap": { + "bits": [ + 62 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "shiftEn": { + "bits": [ + 63 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "nextTap0": { + "bits": [ + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "delayLine_0_": { + "bits": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "delayLine_1_": { + "bits": [ + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "nextTap1": { + "bits": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "nextTap2": { + "bits": [ + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "delayLine_2_": { + "bits": [ + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapMux2": { + "bits": [ + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "accumReg": { + "bits": [ + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "accumFeedback": { + "bits": [ + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray_0_": { + "bits": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray": { + "bits": [ + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719 + ], + "logic_type": { + "width": 48, + "arrayDims": [ + 3 + ], + "elementWidth": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray_1_": { + "bits": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "coeffArray_2_": { + "bits": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapSelect2": { + "bits": [ + 352 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapMux1": { + "bits": [ + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "tapSelect1": { + "bits": [ + 369 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "enableAndValid": { + "bits": [ + 370 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "_in7__tapCounter_add_const_1": { + "bits": [ + 415, + 416 + ], + "logic_type": { + "width": 2 + }, + "attributes": {} + }, + "coeffIn": { + "bits": [ + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "result": { + "bits": [ + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453 + ], + "logic_type": { + "width": 16 + }, + "attributes": {} + }, + "_tapCounter_add_const_1_carry": { + "bits": [ + 527 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "const_0_2_h0": { + "bits": [ + 420, + 421 + ], + "attributes": { + "computed": 1 + } + }, + "const_1_2_h2": { + "bits": [ + 519, + 520 + ], + "attributes": { + "computed": 1 + } + }, + "const_2_2_h1": { + "bits": [ + 521, + 522 + ], + "attributes": { + "computed": 1 + } + }, + "const_3_2_h2": { + "bits": [ + 523, + 524 + ], + "attributes": { + "computed": 1 + } + }, + "const_4_2_h1": { + "bits": [ + 525, + 526 + ], + "attributes": { + "computed": 1 + } + }, + "const_5_16_h1": { + "bits": [ + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287 + ], + "attributes": { + "computed": 1 + } + }, + "const_6_16_h2": { + "bits": [ + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303 + ], + "attributes": { + "computed": 1 + } + }, + "const_7_16_h1": { + "bits": [ + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "attributes": { + "computed": 1 + } + }, + "array_concat_coeffBank_coeffArray_Y": { + "bits": [ + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623 + ], + "hide_name": 1, + "attributes": {} + }, + "array_concat_Y": { + "bits": [ + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671 + ], + "hide_name": 1, + "attributes": {} + } + } + }, + "FilterBank": { + "attributes": { + "src": "generated", + "top": 1, + "rohd.src_trace": { + "signals": { + "clk": [ + "2:168:11" + ], + "reset": [ + "2:169:13" + ], + "start": [ + "2:170:13" + ], + "inputDone": [ + "2:171:17" + ], + "sample0": [ + "8:47:54", + "2:176:19" + ], + "sample1": [ + "8:47:54", + "2:176:19" + ], + "channelOut": [ + "2:182:13" + ], + "validOut": [ + "2:183:22" + ], + "done": [ + "2:184:18" + ], + "state": [ + "2:185:19" + ], + "sample0_data": [ + "8:48:31", + "8:47:54", + "2:176:19" + ], + "sample0_valid": [ + "8:48:31", + "8:47:54", + "2:176:19" + ], + "sample1_data": [ + "8:48:31", + "8:47:54", + "2:176:19" + ], + "sample1_valid": [ + "8:48:31", + "8:47:54", + "2:176:19" + ], + "enable": [ + "1:83:14", + "2:208:7" + ], + "channelOut[0]": [ + "2:182:13" + ], + "channelOut[1]": [ + "2:182:13" + ] + }, + "instances": { + "ch0": [ + "1:72:8", + "2:208:7" + ], + "controller": [ + "5:83:9", + "2:189:24" + ], + "ch1": [ + "1:72:8", + "2:208:7" + ] + } + } + }, + "ports": { + "clk": { + "direction": "input", + "bits": [ + 2 + ], + "logic_type": { + "width": 1 + } + }, + "reset": { + "direction": "input", + "bits": [ + 3 + ], + "logic_type": { + "width": 1 + } + }, + "start": { + "direction": "input", + "bits": [ + 4 + ], + "logic_type": { + "width": 1 + } + }, + "inputDone": { + "direction": "input", + "bits": [ + 5 + ], + "logic_type": { + "width": 1 + } + }, + "sample0": { + "direction": "input", + "bits": [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22 + ], + "logic_type": { + "typeName": "FilterSample", + "fields": [ + { + "name": "data", + "width": 16, + "bits": [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21 + ] + }, + { + "name": "valid", + "width": 1, + "bits": [ + 22 + ] + } + ] + } + }, + "sample1": { + "direction": "input", + "bits": [ + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39 + ], + "logic_type": { + "typeName": "FilterSample", + "fields": [ + { + "name": "data", + "width": 16, + "bits": [ + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38 + ] + }, + { + "name": "valid", + "width": 1, + "bits": [ + 39 + ] + } + ] + } + }, + "channelOut": { + "direction": "output", + "bits": [ + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103 + ], + "logic_type": { + "width": 32, + "arrayDims": [ + 2 + ], + "elementWidth": 16 + } + }, + "validOut": { + "direction": "output", + "bits": [ + 136 + ], + "logic_type": { + "width": 1 + } + }, + "done": { + "direction": "output", + "bits": [ + 137 + ], + "logic_type": { + "width": 1 + } + }, + "state": { + "direction": "output", + "bits": [ + 138, + 139, + 140 + ], + "logic_type": { + "width": 3 + } + } + }, + "cells": { + "array_concat_output_6": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 16, + "IN1_WIDTH": 16 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "outputArrayConcat", + "port_directions": { + "[15:0]": "input", + "[31:16]": "input", + "Y": "output" + }, + "connections": { + "[15:0]": [ + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55 + ], + "[31:16]": [ + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71 + ], + "Y": [ + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103 + ] + } + }, + "ch0": { + "hide_name": 0, + "type": "FilterChannel_T3_W16_0", + "parameters": {}, + "attributes": {}, + "port_directions": { + "sampleIn": "input", + "validIn": "input", + "clk": "input", + "reset": "input", + "enable": "input", + "dataOut": "output", + "validOut": "output" + }, + "connections": { + "sampleIn": [ + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156 + ], + "validIn": [ + 157 + ], + "clk": [ + 2 + ], + "reset": [ + 3 + ], + "enable": [ + 176 + ], + "dataOut": [ + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55 + ], + "validOut": [ + 136 + ] + } + }, + "controller": { + "hide_name": 0, + "type": "FilterController", + "parameters": {}, + "attributes": {}, + "port_directions": { + "clk": "input", + "reset": "input", + "start": "input", + "inputValid": "input", + "inputDone": "input", + "filterEnable": "output", + "loadingPhase": "output", + "doneFlag": "output", + "state": "output" + }, + "connections": { + "clk": [ + 2 + ], + "reset": [ + 3 + ], + "start": [ + 4 + ], + "inputValid": [ + 157 + ], + "inputDone": [ + 5 + ], + "filterEnable": [ + 176 + ], + "loadingPhase": [ + 177 + ], + "doneFlag": [ + 137 + ], + "state": [ + 138, + 139, + 140 + ] + } + }, + "ch1": { + "hide_name": 0, + "type": "FilterChannel_T3_W16", + "parameters": {}, + "attributes": {}, + "port_directions": { + "sampleIn": "input", + "validIn": "input", + "clk": "input", + "reset": "input", + "enable": "input", + "dataOut": "output", + "validOut": "output" + }, + "connections": { + "sampleIn": [ + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174 + ], + "validIn": [ + 175 + ], + "clk": [ + 2 + ], + "reset": [ + 3 + ], + "enable": [ + 176 + ], + "dataOut": [ + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71 + ], + "validOut": [ + 158 + ] + } + }, + "struct_unpack_0_sample0": { + "hide_name": 0, + "type": "$struct_unpack", + "parameters": { + "STRUCT_NAME": "sample0", + "FIELD_COUNT": 2, + "FIELD_0_NAME": "data", + "FIELD_0_OFFSET": 0, + "FIELD_0_WIDTH": 16, + "FIELD_1_NAME": "valid", + "FIELD_1_OFFSET": 16, + "FIELD_1_WIDTH": 1 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "structureUnpack", + "port_directions": { + "A": "input", + "data": "output", + "valid": "output" + }, + "connections": { + "A": [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22 + ], + "data": [ + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156 + ], + "valid": [ + 157 + ] + } + }, + "struct_unpack_1_sample1": { + "hide_name": 0, + "type": "$struct_unpack", + "parameters": { + "STRUCT_NAME": "sample1", + "FIELD_COUNT": 2, + "FIELD_0_NAME": "data", + "FIELD_0_OFFSET": 0, + "FIELD_0_WIDTH": 16, + "FIELD_1_NAME": "valid", + "FIELD_1_OFFSET": 16, + "FIELD_1_WIDTH": 1 + }, + "attributes": {}, + "is_synthetic": true, + "synthetic_origin": "structureUnpack", + "port_directions": { + "A": "input", + "data": "output", + "valid": "output" + }, + "connections": { + "A": [ + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39 + ], + "data": [ + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174 + ], + "valid": [ + 175 + ] + } + } + }, + "netnames": { + "clk": { + "bits": [ + 2 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "reset": { + "bits": [ + 3 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "start": { + "bits": [ + 4 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "inputDone": { + "bits": [ + 5 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "sample0": { + "bits": [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22 + ], + "logic_type": { + "typeName": "FilterSample", + "fields": [ + { + "name": "data", + "width": 16, + "bits": [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21 + ] + }, + { + "name": "valid", + "width": 1, + "bits": [ + 22 + ] + } + ] + }, + "attributes": {} + }, + "sample1": { + "bits": [ + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39 + ], + "logic_type": { + "typeName": "FilterSample", + "fields": [ + { + "name": "data", + "width": 16, + "bits": [ + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38 + ] + }, + { + "name": "valid", + "width": 1, + "bits": [ + 39 + ] + } + ] + }, + "attributes": {} + }, + "channelOut": { + "bits": [ + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103 + ], + "logic_type": { + "width": 32, + "arrayDims": [ + 2 + ], + "elementWidth": 16 + }, + "attributes": {} + }, + "validOut": { + "bits": [ + 136 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "done": { + "bits": [ + 137 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "state": { + "bits": [ + 138, + 139, + 140 + ], + "logic_type": { + "width": 3 + }, + "attributes": {} + }, + "channelOut_0_": { + "bits": [ + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "channelOut_1_": { + "bits": [ + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "sample0_data": { + "bits": [ + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "sample0_valid": { + "bits": [ + 157 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "sample1_data": { + "bits": [ + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174 + ], + "logic_type": { + "width": 16 + }, + "attributes": { + "preserved_name": 1 + } + }, + "sample1_valid": { + "bits": [ + 175 + ], + "logic_type": { + "width": 1 + }, + "attributes": { + "preserved_name": 1 + } + }, + "enable": { + "bits": [ + 176 + ], + "logic_type": { + "width": 1 + }, + "attributes": {} + }, + "controller_loadingPhase": { + "bits": [ + 177 + ], + "hide_name": 1, + "attributes": {} + }, + "ch1_validOut": { + "bits": [ + 158 + ], + "hide_name": 1, + "attributes": {} + } + } + } + } +} \ No newline at end of file diff --git a/rohd_devtools_extension/assets/TwoFPAdders.rohd.json b/rohd_devtools_extension/assets/TwoFPAdders.rohd.json new file mode 100644 index 0000000000..d9f0424005 --- /dev/null +++ b/rohd_devtools_extension/assets/TwoFPAdders.rohd.json @@ -0,0 +1,20045 @@ +{ + "creator": "NetlistSynthesizer (rohd)", + "modules": { + "PriorityEncodeNode_W2": { + "attributes": { + "src": "generated" + }, + "ports": { + "seq": { + "direction": "input", + "bits": [ + 2, + 3 + ] + }, + "ret": { + "direction": "output", + "bits": [ + 4, + 5 + ] + } + }, + "cells": { + "combinational": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "_in3__swizzled": "input", + "_in5__swizzled": "input", + "_out6_ret": "output", + "seq": "input" + }, + "connections": { + "_in3__swizzled": [ + 10, + 11 + ], + "_in5__swizzled": [ + 13, + 14 + ], + "_out6_ret": [ + 4, + 5 + ], + "seq": [ + 2, + 3 + ] + } + } + }, + "netnames": { + "seq": { + "bits": [ + 2, + 3 + ], + "attributes": {} + }, + "ret": { + "bits": [ + 4, + 5 + ], + "attributes": {} + }, + "leftLeafLead": { + "bits": [ + 6 + ], + "attributes": {} + }, + "rightLeafLead": { + "bits": [ + 9 + ], + "attributes": {} + }, + "_in3__swizzled": { + "bits": [ + 10, + 11 + ], + "attributes": {} + }, + "_in5__swizzled": { + "bits": [ + 13, + 14 + ], + "attributes": {} + } + } + }, + "NativeAdder_W5": { + "attributes": { + "src": "generated" + }, + "ports": { + "a": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6 + ] + }, + "b": { + "direction": "input", + "bits": [ + 7, + 8, + 9, + 10, + 11 + ] + }, + "carryIn": { + "direction": "input", + "bits": [ + 12 + ] + }, + "sum": { + "direction": "output", + "bits": [ + 13, + 14, + 15, + 16, + 17, + 18 + ] + } + }, + "cells": { + "add": { + "hide_name": 0, + "type": "Add", + "parameters": {}, + "attributes": {}, + "port_directions": { + "_in0_aExtended_plus_bExtended": "input", + "_in1_carryInExtended": "input", + "_aExtended_plus_bExtended_add_carryInExtended": "output", + "_aExtended_plus_bExtended_add_carryInExtended_carry": "output" + }, + "connections": { + "_in0_aExtended_plus_bExtended": [ + 19, + 20, + 21, + 22, + 23, + 24 + ], + "_in1_carryInExtended": [ + 25, + 26, + 27, + 28, + 29, + 30 + ], + "_aExtended_plus_bExtended_add_carryInExtended": [ + 13, + 14, + 15, + 16, + 17, + 18 + ], + "_aExtended_plus_bExtended_add_carryInExtended_carry": [ + 31 + ] + } + }, + "add_0": { + "hide_name": 0, + "type": "$add", + "parameters": { + "A_WIDTH": 6, + "B_WIDTH": 6, + "Y_WIDTH": 6 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output", + "CO": "output" + }, + "connections": { + "A": [ + 32, + 33, + 34, + 35, + 36, + 37 + ], + "B": [ + 38, + 39, + 40, + 41, + 42, + 43 + ], + "Y": [ + 19, + 20, + 21, + 22, + 23, + 24 + ], + "CO": [ + 44 + ] + } + }, + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 5, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6 + ], + "B": [ + 45 + ], + "Y": [ + 32, + 33, + 34, + 35, + 36, + 37 + ] + } + }, + "swizzle_0": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 5, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 7, + 8, + 9, + 10, + 11 + ], + "B": [ + 46 + ], + "Y": [ + 38, + 39, + 40, + 41, + 42, + 43 + ] + } + }, + "swizzle_1": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 12 + ], + "B": [ + 47, + 48, + 49, + 50, + 51 + ], + "Y": [ + 25, + 26, + 27, + 28, + 29, + 30 + ] + } + }, + "const_0_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 45 + ] + } + }, + "const_1_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 46 + ] + } + }, + "const_2_5_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "5'h0": "output" + }, + "connections": { + "5'h0": [ + 47, + 48, + 49, + 50, + 51 + ] + } + } + }, + "netnames": { + "a": { + "bits": [ + 2, + 3, + 4, + 5, + 6 + ], + "attributes": {} + }, + "b": { + "bits": [ + 7, + 8, + 9, + 10, + 11 + ], + "attributes": {} + }, + "carryIn": { + "bits": [ + 12 + ], + "attributes": {} + }, + "sum": { + "bits": [ + 13, + 14, + 15, + 16, + 17, + 18 + ], + "attributes": {} + }, + "aExtended_plus_bExtended": { + "bits": [ + 19, + 20, + 21, + 22, + 23, + 24 + ], + "attributes": {} + }, + "carryInExtended": { + "bits": [ + 25, + 26, + 27, + 28, + 29, + 30 + ], + "attributes": {} + }, + "_aExtended_plus_bExtended_add_carryInExtended_carry": { + "bits": [ + 31 + ], + "attributes": {} + }, + "aExtended": { + "bits": [ + 32, + 33, + 34, + 35, + 36, + 37 + ], + "attributes": {} + }, + "bExtended": { + "bits": [ + 38, + 39, + 40, + 41, + 42, + 43 + ], + "attributes": {} + }, + "_aExtended_add_bExtended_carry": { + "bits": [ + 44 + ], + "attributes": {} + }, + "const_0_1_h0": { + "bits": [ + 45 + ], + "attributes": {} + }, + "const_1_1_h0": { + "bits": [ + 46 + ], + "attributes": {} + }, + "const_2_5_h0": { + "bits": [ + 47, + 48, + 49, + 50, + 51 + ], + "attributes": {} + } + } + }, + "KoggeStone": { + "attributes": { + "src": "generated" + }, + "ports": { + "i0": { + "direction": "input", + "bits": [ + 2 + ] + }, + "i1": { + "direction": "input", + "bits": [ + 3 + ] + }, + "i2": { + "direction": "input", + "bits": [ + 4 + ] + }, + "i3": { + "direction": "input", + "bits": [ + 5 + ] + }, + "o0": { + "direction": "output", + "bits": [ + 12 + ] + }, + "o1": { + "direction": "output", + "bits": [ + 7 + ] + }, + "o2": { + "direction": "output", + "bits": [ + 8 + ] + }, + "o3": { + "direction": "output", + "bits": [ + 9 + ] + } + }, + "cells": { + "and_": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 10 + ], + "B": [ + 7 + ], + "Y": [ + 9 + ] + } + }, + "and__0": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 5 + ], + "B": [ + 4 + ], + "Y": [ + 10 + ] + } + }, + "and__1": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 3 + ], + "B": [ + 2 + ], + "Y": [ + 7 + ] + } + }, + "and__2": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 11 + ], + "B": [ + 2 + ], + "Y": [ + 8 + ] + } + }, + "and__3": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 4 + ], + "B": [ + 3 + ], + "Y": [ + 11 + ] + } + }, + "passthrough_buf_0": { + "hide_name": 0, + "type": "$buf", + "parameters": { + "WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2 + ], + "Y": [ + 12 + ] + } + } + }, + "netnames": { + "i0": { + "bits": [ + 2 + ], + "attributes": {} + }, + "i1": { + "bits": [ + 3 + ], + "attributes": {} + }, + "i2": { + "bits": [ + 4 + ], + "attributes": {} + }, + "i3": { + "bits": [ + 5 + ], + "attributes": {} + }, + "o0": { + "bits": [ + 12 + ], + "attributes": {} + }, + "o1": { + "bits": [ + 7 + ], + "attributes": {} + }, + "o2": { + "bits": [ + 8 + ], + "attributes": {} + }, + "o3": { + "bits": [ + 9 + ], + "attributes": {} + }, + "ks_skip1_i3": { + "bits": [ + 10 + ], + "attributes": {} + }, + "ks_skip1_i2": { + "bits": [ + 11 + ], + "attributes": {} + } + } + }, + "PriorityEncodeNode_W1": { + "attributes": { + "src": "generated" + }, + "ports": { + "seq": { + "direction": "input", + "bits": [ + 2 + ] + }, + "ret": { + "direction": "output", + "bits": [ + 3 + ] + } + }, + "cells": { + "not_": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2 + ], + "Y": [ + 3 + ] + } + } + }, + "netnames": { + "seq": { + "bits": [ + 2 + ], + "attributes": {} + }, + "ret": { + "bits": [ + 3 + ], + "attributes": {} + } + } + }, + "PriorityEncodeNode_W4": { + "attributes": { + "src": "generated" + }, + "ports": { + "seq": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5 + ] + }, + "ret": { + "direction": "output", + "bits": [ + 6, + 7, + 8 + ] + } + }, + "cells": { + "combinational": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "_in0__leftLead_and_rightLead": "input", + "_in1_lr": "input", + "_in2__leftLead_b": "input", + "_in3_zl": "input", + "_in5_rhs": "input", + "_out6_ret": "output" + }, + "connections": { + "_in0__leftLead_and_rightLead": [ + 9 + ], + "_in1_lr": [ + 10, + 11, + 12 + ], + "_in2__leftLead_b": [ + 13 + ], + "_in3_zl": [ + 14, + 15, + 16 + ], + "_in5_rhs": [ + 35, + 36, + 37 + ], + "_out6_ret": [ + 6, + 7, + 8 + ] + } + }, + "and_": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 21 + ], + "B": [ + 22 + ], + "Y": [ + 9 + ] + } + }, + "not_": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 21 + ], + "Y": [ + 13 + ] + } + }, + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 1, + "A_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 23, + 24 + ], + "Y": [ + 21 + ] + } + }, + "left": { + "hide_name": 0, + "type": "PriorityEncodeNode_W2", + "parameters": {}, + "attributes": {}, + "port_directions": { + "seq": "input", + "ret": "output" + }, + "connections": { + "seq": [ + 25, + 26 + ], + "ret": [ + 23, + 24 + ] + } + }, + "bussubset_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 4, + "Y_WIDTH": 2 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5 + ], + "Y": [ + 25, + 26 + ] + } + }, + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 23, + 24 + ], + "B": [ + 27 + ], + "Y": [ + 14, + 15, + 16 + ] + } + }, + "bussubset_1": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 1, + "A_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 28, + 29 + ], + "Y": [ + 22 + ] + } + }, + "right": { + "hide_name": 0, + "type": "PriorityEncodeNode_W2", + "parameters": {}, + "attributes": {}, + "port_directions": { + "seq": "input", + "ret": "output" + }, + "connections": { + "seq": [ + 30, + 31 + ], + "ret": [ + 28, + 29 + ] + } + }, + "bussubset_2": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 2, + "A_WIDTH": 4, + "Y_WIDTH": 2 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5 + ], + "Y": [ + 30, + 31 + ] + } + }, + "bussubset_3": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 2, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 28, + 29 + ], + "Y": [ + 32 + ] + } + }, + "swizzle_0": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 1, + "IN1_WIDTH": 1, + "IN2_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "[0]": "input", + "[1]": "input", + "[2]": "input", + "Y": "output" + }, + "connections": { + "[0]": [ + 32 + ], + "[1]": [ + 33 + ], + "[2]": [ + 34 + ], + "Y": [ + 35, + 36, + 37 + ] + } + }, + "const_0_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 27 + ] + } + }, + "const_1_1_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h1": "output" + }, + "connections": { + "1'h1": [ + 33 + ] + } + }, + "const_2_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 34 + ] + } + } + }, + "netnames": { + "seq": { + "bits": [ + 2, + 3, + 4, + 5 + ], + "attributes": {} + }, + "ret": { + "bits": [ + 6, + 7, + 8 + ], + "attributes": {} + }, + "_in0__leftLead_and_rightLead": { + "bits": [ + 9 + ], + "attributes": {} + }, + "lr": { + "bits": [ + 10, + 11, + 12 + ], + "attributes": {} + }, + "_in2__leftLead_b": { + "bits": [ + 13 + ], + "attributes": {} + }, + "zl": { + "bits": [ + 14, + 15, + 16 + ], + "attributes": {} + }, + "rhs": { + "bits": [ + 35, + 36, + 37 + ], + "attributes": {} + }, + "leftLead": { + "bits": [ + 21 + ], + "attributes": {} + }, + "rightLead": { + "bits": [ + 22 + ], + "attributes": {} + }, + "ret_0": { + "bits": [ + 23, + 24 + ], + "attributes": {} + }, + "seq_0": { + "bits": [ + 25, + 26 + ], + "attributes": {} + }, + "ret_1": { + "bits": [ + 28, + 29 + ], + "attributes": {} + }, + "seq_1": { + "bits": [ + 30, + 31 + ], + "attributes": {} + }, + "_in0": { + "bits": [ + 32 + ], + "attributes": {} + }, + "zo_right": { + "bits": [ + 35, + 36, + 37 + ], + "attributes": {} + }, + "const_0_1_h0": { + "bits": [ + 27 + ], + "attributes": {} + }, + "const_1_1_h1": { + "bits": [ + 33 + ], + "attributes": {} + }, + "const_2_1_h0": { + "bits": [ + 34 + ], + "attributes": {} + } + } + }, + "KoggeStone_0": { + "attributes": { + "src": "generated" + }, + "ports": { + "i0": { + "direction": "input", + "bits": [ + 2 + ] + }, + "i1": { + "direction": "input", + "bits": [ + 3 + ] + }, + "i2": { + "direction": "input", + "bits": [ + 4 + ] + }, + "i3": { + "direction": "input", + "bits": [ + 5 + ] + }, + "i4": { + "direction": "input", + "bits": [ + 6 + ] + }, + "o0": { + "direction": "output", + "bits": [ + 16 + ] + }, + "o1": { + "direction": "output", + "bits": [ + 8 + ] + }, + "o2": { + "direction": "output", + "bits": [ + 9 + ] + }, + "o3": { + "direction": "output", + "bits": [ + 10 + ] + }, + "o4": { + "direction": "output", + "bits": [ + 11 + ] + } + }, + "cells": { + "and_": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 12 + ], + "B": [ + 8 + ], + "Y": [ + 10 + ] + } + }, + "and__0": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 5 + ], + "B": [ + 4 + ], + "Y": [ + 12 + ] + } + }, + "and__1": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 3 + ], + "B": [ + 2 + ], + "Y": [ + 8 + ] + } + }, + "and__2": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 13 + ], + "B": [ + 2 + ], + "Y": [ + 9 + ] + } + }, + "and__3": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 14 + ], + "B": [ + 13 + ], + "Y": [ + 15 + ] + } + }, + "and__4": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 15 + ], + "B": [ + 2 + ], + "Y": [ + 11 + ] + } + }, + "and__5": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 6 + ], + "B": [ + 5 + ], + "Y": [ + 14 + ] + } + }, + "and__6": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 4 + ], + "B": [ + 3 + ], + "Y": [ + 13 + ] + } + }, + "passthrough_buf_0": { + "hide_name": 0, + "type": "$buf", + "parameters": { + "WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2 + ], + "Y": [ + 16 + ] + } + } + }, + "netnames": { + "i0": { + "bits": [ + 2 + ], + "attributes": {} + }, + "i1": { + "bits": [ + 3 + ], + "attributes": {} + }, + "i2": { + "bits": [ + 4 + ], + "attributes": {} + }, + "i3": { + "bits": [ + 5 + ], + "attributes": {} + }, + "i4": { + "bits": [ + 6 + ], + "attributes": {} + }, + "o0": { + "bits": [ + 16 + ], + "attributes": {} + }, + "o1": { + "bits": [ + 8 + ], + "attributes": {} + }, + "o2": { + "bits": [ + 9 + ], + "attributes": {} + }, + "o3": { + "bits": [ + 10 + ], + "attributes": {} + }, + "o4": { + "bits": [ + 11 + ], + "attributes": {} + }, + "ks_skip1_i3": { + "bits": [ + 12 + ], + "attributes": {} + }, + "ks_skip1_i2": { + "bits": [ + 13 + ], + "attributes": {} + }, + "ks_skip1_i4": { + "bits": [ + 14 + ], + "attributes": {} + }, + "ks_skip2_i4": { + "bits": [ + 15 + ], + "attributes": {} + } + } + }, + "OnesComplementAdder_W5": { + "attributes": { + "src": "generated" + }, + "ports": { + "a": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6 + ] + }, + "b": { + "direction": "input", + "bits": [ + 7, + 8, + 9, + 10, + 11 + ] + }, + "carryIn": { + "direction": "input", + "bits": [ + 12 + ] + }, + "subtractIn": { + "direction": "input", + "bits": [ + 13 + ] + }, + "sum": { + "direction": "output", + "bits": [ + 14, + 15, + 16, + 17, + 18, + 19 + ] + }, + "endAroundCarry": { + "direction": "output", + "bits": [ + 20 + ] + }, + "sign": { + "direction": "output", + "bits": [ + 21 + ] + } + }, + "cells": { + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 6 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 13 + ], + "A": [ + 22, + 23, + 24, + 25, + 26, + 27 + ], + "B": [ + 28, + 29, + 30, + 31, + 32, + 33 + ], + "Y": [ + 14, + 15, + 16, + 17, + 18, + 19 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 13 + ], + "A": [ + 7, + 8, + 9, + 10, + 11 + ], + "B": [ + 34, + 35, + 36, + 37, + 38 + ], + "Y": [ + 39, + 40, + 41, + 42, + 43 + ] + } + }, + "native_adder": { + "hide_name": 0, + "type": "NativeAdder_W5", + "parameters": {}, + "attributes": {}, + "port_directions": { + "a": "input", + "b": "input", + "carryIn": "input", + "sum": "output" + }, + "connections": { + "a": [ + 2, + 3, + 4, + 5, + 6 + ], + "b": [ + 39, + 40, + 41, + 42, + 43 + ], + "carryIn": [ + 12 + ], + "sum": [ + 22, + 23, + 24, + 25, + 26, + 27 + ] + } + }, + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 5, + "A_WIDTH": 6, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 22, + 23, + 24, + 25, + 26, + 27 + ], + "Y": [ + 20 + ] + } + }, + "bussubset_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 5, + "A_WIDTH": 6, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 22, + 23, + 24, + 25, + 26, + 27 + ], + "Y": [ + 44 + ] + } + }, + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 5, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 45, + 46, + 47, + 48, + 49 + ], + "B": [ + 44 + ], + "Y": [ + 28, + 29, + 30, + 31, + 32, + 33 + ] + } + }, + "mux_1": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 50 + ], + "A": [ + 51, + 52, + 53, + 54, + 55 + ], + "B": [ + 56, + 57, + 58, + 59, + 60 + ], + "Y": [ + 45, + 46, + 47, + 48, + 49 + ] + } + }, + "not_": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 5, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 56, + 57, + 58, + 59, + 60 + ], + "Y": [ + 51, + 52, + 53, + 54, + 55 + ] + } + }, + "bussubset_1": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 6, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 22, + 23, + 24, + 25, + 26, + 27 + ], + "Y": [ + 56, + 57, + 58, + 59, + 60 + ] + } + }, + "not__0": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 44 + ], + "Y": [ + 61 + ] + } + }, + "mux_2": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 13 + ], + "A": [ + 62 + ], + "B": [ + 61 + ], + "Y": [ + 21 + ] + } + }, + "not__1": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 5, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 7, + 8, + 9, + 10, + 11 + ], + "Y": [ + 34, + 35, + 36, + 37, + 38 + ] + } + }, + "const_0_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 50 + ] + } + }, + "const_1_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 62 + ] + } + } + }, + "netnames": { + "a": { + "bits": [ + 2, + 3, + 4, + 5, + 6 + ], + "attributes": {} + }, + "b": { + "bits": [ + 7, + 8, + 9, + 10, + 11 + ], + "attributes": {} + }, + "carryIn": { + "bits": [ + 12 + ], + "attributes": {} + }, + "subtractIn": { + "bits": [ + 13 + ], + "attributes": {} + }, + "sum": { + "bits": [ + 14, + 15, + 16, + 17, + 18, + 19 + ], + "attributes": {} + }, + "endAroundCarry": { + "bits": [ + 20 + ], + "attributes": {} + }, + "sign": { + "bits": [ + 21 + ], + "attributes": {} + }, + "adderSum": { + "bits": [ + 22, + 23, + 24, + 25, + 26, + 27 + ], + "attributes": {} + }, + "_d1__swizzled": { + "bits": [ + 28, + 29, + 30, + 31, + 32, + 33 + ], + "attributes": {} + }, + "_d1__b_b": { + "bits": [ + 34, + 35, + 36, + 37, + 38 + ], + "attributes": {} + }, + "b_0": { + "bits": [ + 39, + 40, + 41, + 42, + 43 + ], + "attributes": {} + }, + "endaround": { + "bits": [ + 44 + ], + "attributes": {} + }, + "_in0": { + "bits": [ + 45, + 46, + 47, + 48, + 49 + ], + "attributes": {} + }, + "_d0__magnitude_b": { + "bits": [ + 51, + 52, + 53, + 54, + 55 + ], + "attributes": {} + }, + "magnitude": { + "bits": [ + 56, + 57, + 58, + 59, + 60 + ], + "attributes": {} + }, + "_d1__endaround_b": { + "bits": [ + 61 + ], + "attributes": {} + }, + "const_0_1_h0": { + "bits": [ + 50 + ], + "attributes": {} + }, + "const_1_1_h0": { + "bits": [ + 62 + ], + "attributes": {} + } + } + }, + "ParallelPrefixIncr_W4": { + "attributes": { + "src": "generated" + }, + "ports": { + "inp": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5 + ] + }, + "out": { + "direction": "output", + "bits": [ + 6, + 7, + 8, + 9 + ] + } + }, + "cells": { + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 1, + "IN1_WIDTH": 1, + "IN2_WIDTH": 1, + "IN3_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "[0]": "input", + "[1]": "input", + "[2]": "input", + "[3]": "input", + "Y": "output" + }, + "connections": { + "[0]": [ + 10 + ], + "[1]": [ + 11 + ], + "[2]": [ + 12 + ], + "[3]": [ + 13 + ], + "Y": [ + 6, + 7, + 8, + 9 + ] + } + }, + "not_": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 14 + ], + "Y": [ + 10 + ] + } + }, + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5 + ], + "Y": [ + 14 + ] + } + }, + "xor_": { + "hide_name": 0, + "type": "$xor", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 15 + ], + "B": [ + 16 + ], + "Y": [ + 11 + ] + } + }, + "bussubset_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 1, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5 + ], + "Y": [ + 15 + ] + } + }, + "kogge_stone": { + "hide_name": 0, + "type": "KoggeStone", + "parameters": {}, + "attributes": {}, + "port_directions": { + "i0": "input", + "i1": "input", + "i2": "input", + "i3": "input", + "o0": "output", + "o1": "output", + "o2": "output", + "o3": "output" + }, + "connections": { + "i0": [ + 17 + ], + "i1": [ + 18 + ], + "i2": [ + 19 + ], + "i3": [ + 20 + ], + "o0": [ + 16 + ], + "o1": [ + 21 + ], + "o2": [ + 22 + ], + "o3": [ + 23 + ] + } + }, + "bussubset_1": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5 + ], + "Y": [ + 17 + ] + } + }, + "bussubset_2": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 1, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5 + ], + "Y": [ + 18 + ] + } + }, + "bussubset_3": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 2, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5 + ], + "Y": [ + 19 + ] + } + }, + "bussubset_4": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5 + ], + "Y": [ + 20 + ] + } + }, + "xor__0": { + "hide_name": 0, + "type": "$xor", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 24 + ], + "B": [ + 21 + ], + "Y": [ + 12 + ] + } + }, + "bussubset_5": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 2, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5 + ], + "Y": [ + 24 + ] + } + }, + "xor__1": { + "hide_name": 0, + "type": "$xor", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 25 + ], + "B": [ + 22 + ], + "Y": [ + 13 + ] + } + }, + "bussubset_6": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5 + ], + "Y": [ + 25 + ] + } + } + }, + "netnames": { + "inp": { + "bits": [ + 2, + 3, + 4, + 5 + ], + "attributes": {} + }, + "out": { + "bits": [ + 6, + 7, + 8, + 9 + ], + "attributes": {} + }, + "o_0": { + "bits": [ + 10 + ], + "attributes": {} + }, + "o_1": { + "bits": [ + 11 + ], + "attributes": {} + }, + "o_2": { + "bits": [ + 12 + ], + "attributes": {} + }, + "o_3": { + "bits": [ + 13 + ], + "attributes": {} + }, + "_subset_0_0_inp": { + "bits": [ + 14 + ], + "attributes": {} + }, + "_in0__subset_1_1_inp": { + "bits": [ + 15 + ], + "attributes": {} + }, + "o0": { + "bits": [ + 16 + ], + "attributes": {} + }, + "i0": { + "bits": [ + 17 + ], + "attributes": {} + }, + "i1": { + "bits": [ + 18 + ], + "attributes": {} + }, + "i2": { + "bits": [ + 19 + ], + "attributes": {} + }, + "i3": { + "bits": [ + 20 + ], + "attributes": {} + }, + "o1": { + "bits": [ + 21 + ], + "attributes": {} + }, + "o2": { + "bits": [ + 22 + ], + "attributes": {} + }, + "_in0__subset_2_2_inp": { + "bits": [ + 24 + ], + "attributes": {} + }, + "_in0__subset_3_3_inp": { + "bits": [ + 25 + ], + "attributes": {} + }, + "kogge_stone_o3": { + "bits": [ + 23 + ], + "attributes": {} + } + } + }, + "NativeAdder_W4": { + "attributes": { + "src": "generated" + }, + "ports": { + "a": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5 + ] + }, + "b": { + "direction": "input", + "bits": [ + 6, + 7, + 8, + 9 + ] + }, + "carryIn": { + "direction": "input", + "bits": [ + 10 + ] + }, + "sum": { + "direction": "output", + "bits": [ + 11, + 12, + 13, + 14, + 15 + ] + } + }, + "cells": { + "add": { + "hide_name": 0, + "type": "Add", + "parameters": {}, + "attributes": {}, + "port_directions": { + "_in0_aExtended_plus_bExtended": "input", + "_in1_carryInExtended": "input", + "_aExtended_plus_bExtended_add_carryInExtended": "output", + "_aExtended_plus_bExtended_add_carryInExtended_carry": "output" + }, + "connections": { + "_in0_aExtended_plus_bExtended": [ + 16, + 17, + 18, + 19, + 20 + ], + "_in1_carryInExtended": [ + 21, + 22, + 23, + 24, + 25 + ], + "_aExtended_plus_bExtended_add_carryInExtended": [ + 11, + 12, + 13, + 14, + 15 + ], + "_aExtended_plus_bExtended_add_carryInExtended_carry": [ + 26 + ] + } + }, + "add_0": { + "hide_name": 0, + "type": "$add", + "parameters": { + "A_WIDTH": 5, + "B_WIDTH": 5, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output", + "CO": "output" + }, + "connections": { + "A": [ + 27, + 28, + 29, + 30, + 31 + ], + "B": [ + 32, + 33, + 34, + 35, + 36 + ], + "Y": [ + 16, + 17, + 18, + 19, + 20 + ], + "CO": [ + 37 + ] + } + }, + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5 + ], + "B": [ + 38 + ], + "Y": [ + 27, + 28, + 29, + 30, + 31 + ] + } + }, + "swizzle_0": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 6, + 7, + 8, + 9 + ], + "B": [ + 39 + ], + "Y": [ + 32, + 33, + 34, + 35, + 36 + ] + } + }, + "swizzle_1": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 10 + ], + "B": [ + 40, + 41, + 42, + 43 + ], + "Y": [ + 21, + 22, + 23, + 24, + 25 + ] + } + }, + "const_0_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 38 + ] + } + }, + "const_1_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 39 + ] + } + }, + "const_2_4_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'h0": "output" + }, + "connections": { + "4'h0": [ + 40, + 41, + 42, + 43 + ] + } + } + }, + "netnames": { + "a": { + "bits": [ + 2, + 3, + 4, + 5 + ], + "attributes": {} + }, + "b": { + "bits": [ + 6, + 7, + 8, + 9 + ], + "attributes": {} + }, + "carryIn": { + "bits": [ + 10 + ], + "attributes": {} + }, + "sum": { + "bits": [ + 11, + 12, + 13, + 14, + 15 + ], + "attributes": {} + }, + "aExtended_plus_bExtended": { + "bits": [ + 16, + 17, + 18, + 19, + 20 + ], + "attributes": {} + }, + "carryInExtended": { + "bits": [ + 21, + 22, + 23, + 24, + 25 + ], + "attributes": {} + }, + "_aExtended_plus_bExtended_add_carryInExtended_carry": { + "bits": [ + 26 + ], + "attributes": {} + }, + "aExtended": { + "bits": [ + 27, + 28, + 29, + 30, + 31 + ], + "attributes": {} + }, + "bExtended": { + "bits": [ + 32, + 33, + 34, + 35, + 36 + ], + "attributes": {} + }, + "_aExtended_add_bExtended_carry": { + "bits": [ + 37 + ], + "attributes": {} + }, + "const_0_1_h0": { + "bits": [ + 38 + ], + "attributes": {} + }, + "const_1_1_h0": { + "bits": [ + 39 + ], + "attributes": {} + }, + "const_2_4_h0": { + "bits": [ + 40, + 41, + 42, + 43 + ], + "attributes": {} + } + } + }, + "PriorityEncodeNode_W5": { + "attributes": { + "src": "generated" + }, + "ports": { + "seq": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6 + ] + }, + "ret": { + "direction": "output", + "bits": [ + 7, + 8, + 9, + 10 + ] + } + }, + "cells": { + "combinational": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "_in0__leftLead_and_rightLead": "input", + "_in1_lr": "input", + "_in2__leftLead_b": "input", + "_in3_zl": "input", + "_in5_rhs": "input", + "_out6_ret": "output" + }, + "connections": { + "_in0__leftLead_and_rightLead": [ + 11 + ], + "_in1_lr": [ + 12, + 13, + 14, + 15 + ], + "_in2__leftLead_b": [ + 16 + ], + "_in3_zl": [ + 17, + 18, + 19, + 20 + ], + "_in5_rhs": [ + 47, + 48, + 49, + 50 + ], + "_out6_ret": [ + 7, + 8, + 9, + 10 + ] + } + }, + "and_": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 26 + ], + "B": [ + 27 + ], + "Y": [ + 11 + ] + } + }, + "not_": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 26 + ], + "Y": [ + 16 + ] + } + }, + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 2, + "A_WIDTH": 3, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 28, + 29, + 30 + ], + "Y": [ + 26 + ] + } + }, + "left": { + "hide_name": 0, + "type": "PriorityEncodeNode_W4", + "parameters": {}, + "attributes": {}, + "port_directions": { + "seq": "input", + "ret": "output" + }, + "connections": { + "seq": [ + 31, + 32, + 33, + 34 + ], + "ret": [ + 28, + 29, + 30 + ] + } + }, + "bussubset_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 5, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6 + ], + "Y": [ + 31, + 32, + 33, + 34 + ] + } + }, + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 3, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 28, + 29, + 30 + ], + "B": [ + 35 + ], + "Y": [ + 17, + 18, + 19, + 20 + ] + } + }, + "bussubset_1": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 2, + "A_WIDTH": 3, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 36, + 37, + 38 + ], + "Y": [ + 27 + ] + } + }, + "swizzle_0": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 2 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 39 + ], + "B": [ + 40, + 41 + ], + "Y": [ + 36, + 37, + 38 + ] + } + }, + "right": { + "hide_name": 0, + "type": "PriorityEncodeNode_W1", + "parameters": {}, + "attributes": {}, + "port_directions": { + "seq": "input", + "ret": "output" + }, + "connections": { + "seq": [ + 42 + ], + "ret": [ + 39 + ] + } + }, + "bussubset_2": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 4, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6 + ], + "Y": [ + 42 + ] + } + }, + "bussubset_3": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 3, + "Y_WIDTH": 2 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 36, + 37, + 38 + ], + "Y": [ + 43, + 44 + ] + } + }, + "swizzle_1": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 2, + "IN1_WIDTH": 1, + "IN2_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "[1:0]": "input", + "[2]": "input", + "[3]": "input", + "Y": "output" + }, + "connections": { + "[1:0]": [ + 43, + 44 + ], + "[2]": [ + 45 + ], + "[3]": [ + 46 + ], + "Y": [ + 47, + 48, + 49, + 50 + ] + } + }, + "const_0_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 35 + ] + } + }, + "const_1_2_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h0": "output" + }, + "connections": { + "2'h0": [ + 40, + 41 + ] + } + }, + "const_2_1_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h1": "output" + }, + "connections": { + "1'h1": [ + 45 + ] + } + }, + "const_3_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 46 + ] + } + } + }, + "netnames": { + "seq": { + "bits": [ + 2, + 3, + 4, + 5, + 6 + ], + "attributes": {} + }, + "ret": { + "bits": [ + 7, + 8, + 9, + 10 + ], + "attributes": {} + }, + "_in0__leftLead_and_rightLead": { + "bits": [ + 11 + ], + "attributes": {} + }, + "lr": { + "bits": [ + 12, + 13, + 14, + 15 + ], + "attributes": {} + }, + "_in2__leftLead_b": { + "bits": [ + 16 + ], + "attributes": {} + }, + "zl": { + "bits": [ + 17, + 18, + 19, + 20 + ], + "attributes": {} + }, + "rhs": { + "bits": [ + 47, + 48, + 49, + 50 + ], + "attributes": {} + }, + "leftLead": { + "bits": [ + 26 + ], + "attributes": {} + }, + "rightLead": { + "bits": [ + 27 + ], + "attributes": {} + }, + "ret_0": { + "bits": [ + 28, + 29, + 30 + ], + "attributes": {} + }, + "seq_0": { + "bits": [ + 31, + 32, + 33, + 34 + ], + "attributes": {} + }, + "_original__swizzled": { + "bits": [ + 36, + 37, + 38 + ], + "attributes": {} + }, + "ret_1": { + "bits": [ + 39 + ], + "attributes": {} + }, + "seq_1": { + "bits": [ + 42 + ], + "attributes": {} + }, + "_in0": { + "bits": [ + 43, + 44 + ], + "attributes": {} + }, + "zo_right": { + "bits": [ + 47, + 48, + 49, + 50 + ], + "attributes": {} + }, + "const_0_1_h0": { + "bits": [ + 35 + ], + "attributes": {} + }, + "const_1_2_h0": { + "bits": [ + 40, + 41 + ], + "attributes": {} + }, + "const_2_1_h1": { + "bits": [ + 45 + ], + "attributes": {} + }, + "const_3_1_h0": { + "bits": [ + 46 + ], + "attributes": {} + } + } + }, + "ParallelPrefixIncr_W5": { + "attributes": { + "src": "generated" + }, + "ports": { + "inp": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6 + ] + }, + "out": { + "direction": "output", + "bits": [ + 7, + 8, + 9, + 10, + 11 + ] + } + }, + "cells": { + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 1, + "IN1_WIDTH": 1, + "IN2_WIDTH": 1, + "IN3_WIDTH": 1, + "IN4_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "[0]": "input", + "[1]": "input", + "[2]": "input", + "[3]": "input", + "[4]": "input", + "Y": "output" + }, + "connections": { + "[0]": [ + 12 + ], + "[1]": [ + 13 + ], + "[2]": [ + 14 + ], + "[3]": [ + 15 + ], + "[4]": [ + 16 + ], + "Y": [ + 7, + 8, + 9, + 10, + 11 + ] + } + }, + "not_": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 17 + ], + "Y": [ + 12 + ] + } + }, + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6 + ], + "Y": [ + 17 + ] + } + }, + "xor_": { + "hide_name": 0, + "type": "$xor", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 18 + ], + "B": [ + 19 + ], + "Y": [ + 13 + ] + } + }, + "bussubset_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 1, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6 + ], + "Y": [ + 18 + ] + } + }, + "kogge_stone": { + "hide_name": 0, + "type": "KoggeStone_0", + "parameters": {}, + "attributes": {}, + "port_directions": { + "i0": "input", + "i1": "input", + "i2": "input", + "i3": "input", + "i4": "input", + "o0": "output", + "o1": "output", + "o2": "output", + "o3": "output", + "o4": "output" + }, + "connections": { + "i0": [ + 20 + ], + "i1": [ + 21 + ], + "i2": [ + 22 + ], + "i3": [ + 23 + ], + "i4": [ + 24 + ], + "o0": [ + 19 + ], + "o1": [ + 25 + ], + "o2": [ + 26 + ], + "o3": [ + 27 + ], + "o4": [ + 28 + ] + } + }, + "bussubset_1": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6 + ], + "Y": [ + 20 + ] + } + }, + "bussubset_2": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 1, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6 + ], + "Y": [ + 21 + ] + } + }, + "bussubset_3": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 2, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6 + ], + "Y": [ + 22 + ] + } + }, + "bussubset_4": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6 + ], + "Y": [ + 23 + ] + } + }, + "bussubset_5": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 4, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6 + ], + "Y": [ + 24 + ] + } + }, + "xor__0": { + "hide_name": 0, + "type": "$xor", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 29 + ], + "B": [ + 25 + ], + "Y": [ + 14 + ] + } + }, + "bussubset_6": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 2, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6 + ], + "Y": [ + 29 + ] + } + }, + "xor__1": { + "hide_name": 0, + "type": "$xor", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 30 + ], + "B": [ + 26 + ], + "Y": [ + 15 + ] + } + }, + "bussubset_7": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6 + ], + "Y": [ + 30 + ] + } + }, + "xor__2": { + "hide_name": 0, + "type": "$xor", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 31 + ], + "B": [ + 27 + ], + "Y": [ + 16 + ] + } + }, + "bussubset_8": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 4, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6 + ], + "Y": [ + 31 + ] + } + } + }, + "netnames": { + "inp": { + "bits": [ + 2, + 3, + 4, + 5, + 6 + ], + "attributes": {} + }, + "out": { + "bits": [ + 7, + 8, + 9, + 10, + 11 + ], + "attributes": {} + }, + "o_0": { + "bits": [ + 12 + ], + "attributes": {} + }, + "o_1": { + "bits": [ + 13 + ], + "attributes": {} + }, + "o_2": { + "bits": [ + 14 + ], + "attributes": {} + }, + "o_3": { + "bits": [ + 15 + ], + "attributes": {} + }, + "o_4": { + "bits": [ + 16 + ], + "attributes": {} + }, + "_subset_0_0_inp": { + "bits": [ + 17 + ], + "attributes": {} + }, + "_in0__subset_1_1_inp": { + "bits": [ + 18 + ], + "attributes": {} + }, + "o0": { + "bits": [ + 19 + ], + "attributes": {} + }, + "i0": { + "bits": [ + 20 + ], + "attributes": {} + }, + "i1": { + "bits": [ + 21 + ], + "attributes": {} + }, + "i2": { + "bits": [ + 22 + ], + "attributes": {} + }, + "i3": { + "bits": [ + 23 + ], + "attributes": {} + }, + "i4": { + "bits": [ + 24 + ], + "attributes": {} + }, + "o1": { + "bits": [ + 25 + ], + "attributes": {} + }, + "o2": { + "bits": [ + 26 + ], + "attributes": {} + }, + "o3": { + "bits": [ + 27 + ], + "attributes": {} + }, + "_in0__subset_2_2_inp": { + "bits": [ + 29 + ], + "attributes": {} + }, + "_in0__subset_3_3_inp": { + "bits": [ + 30 + ], + "attributes": {} + }, + "_in0__subset_4_4_inp": { + "bits": [ + 31 + ], + "attributes": {} + }, + "kogge_stone_o4": { + "bits": [ + 28 + ], + "attributes": {} + } + } + }, + "OnesComplementAdder_W5_0": { + "attributes": { + "src": "generated" + }, + "ports": { + "a": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6 + ] + }, + "b": { + "direction": "input", + "bits": [ + 7, + 8, + 9, + 10, + 11 + ] + }, + "sum": { + "direction": "output", + "bits": [ + 12, + 13, + 14, + 15, + 16, + 17 + ] + }, + "endAroundCarry": { + "direction": "output", + "bits": [ + 18 + ] + }, + "sign": { + "direction": "output", + "bits": [ + 19 + ] + } + }, + "cells": { + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 6 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 20 + ], + "A": [ + 21, + 22, + 23, + 24, + 25, + 26 + ], + "B": [ + 27, + 28, + 29, + 30, + 31, + 32 + ], + "Y": [ + 12, + 13, + 14, + 15, + 16, + 17 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 20 + ], + "A": [ + 7, + 8, + 9, + 10, + 11 + ], + "B": [ + 33, + 34, + 35, + 36, + 37 + ], + "Y": [ + 38, + 39, + 40, + 41, + 42 + ] + } + }, + "native_adder": { + "hide_name": 0, + "type": "NativeAdder_W5", + "parameters": {}, + "attributes": {}, + "port_directions": { + "a": "input", + "b": "input", + "carryIn": "input", + "sum": "output" + }, + "connections": { + "a": [ + 2, + 3, + 4, + 5, + 6 + ], + "b": [ + 38, + 39, + 40, + 41, + 42 + ], + "carryIn": [ + 43 + ], + "sum": [ + 21, + 22, + 23, + 24, + 25, + 26 + ] + } + }, + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 5, + "A_WIDTH": 6, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 21, + 22, + 23, + 24, + 25, + 26 + ], + "Y": [ + 18 + ] + } + }, + "bussubset_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 5, + "A_WIDTH": 6, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 21, + 22, + 23, + 24, + 25, + 26 + ], + "Y": [ + 44 + ] + } + }, + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 5, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 45, + 46, + 47, + 48, + 49 + ], + "B": [ + 44 + ], + "Y": [ + 27, + 28, + 29, + 30, + 31, + 32 + ] + } + }, + "mux_1": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 50 + ], + "A": [ + 51, + 52, + 53, + 54, + 55 + ], + "B": [ + 56, + 57, + 58, + 59, + 60 + ], + "Y": [ + 45, + 46, + 47, + 48, + 49 + ] + } + }, + "not_": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 5, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 56, + 57, + 58, + 59, + 60 + ], + "Y": [ + 51, + 52, + 53, + 54, + 55 + ] + } + }, + "bussubset_1": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 6, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 21, + 22, + 23, + 24, + 25, + 26 + ], + "Y": [ + 56, + 57, + 58, + 59, + 60 + ] + } + }, + "not__0": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 44 + ], + "Y": [ + 61 + ] + } + }, + "mux_2": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 20 + ], + "A": [ + 62 + ], + "B": [ + 61 + ], + "Y": [ + 19 + ] + } + }, + "not__1": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 5, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 7, + 8, + 9, + 10, + 11 + ], + "Y": [ + 33, + 34, + 35, + 36, + 37 + ] + } + }, + "const_0_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 20 + ] + } + }, + "const_1_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 43 + ] + } + }, + "const_2_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 50 + ] + } + }, + "const_3_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 62 + ] + } + } + }, + "netnames": { + "a": { + "bits": [ + 2, + 3, + 4, + 5, + 6 + ], + "attributes": {} + }, + "b": { + "bits": [ + 7, + 8, + 9, + 10, + 11 + ], + "attributes": {} + }, + "sum": { + "bits": [ + 12, + 13, + 14, + 15, + 16, + 17 + ], + "attributes": {} + }, + "endAroundCarry": { + "bits": [ + 18 + ], + "attributes": {} + }, + "sign": { + "bits": [ + 19 + ], + "attributes": {} + }, + "adderSum": { + "bits": [ + 21, + 22, + 23, + 24, + 25, + 26 + ], + "attributes": {} + }, + "_d1__swizzled": { + "bits": [ + 27, + 28, + 29, + 30, + 31, + 32 + ], + "attributes": {} + }, + "_d1__b_b": { + "bits": [ + 33, + 34, + 35, + 36, + 37 + ], + "attributes": {} + }, + "b_0": { + "bits": [ + 38, + 39, + 40, + 41, + 42 + ], + "attributes": {} + }, + "endaround": { + "bits": [ + 44 + ], + "attributes": {} + }, + "_in0": { + "bits": [ + 45, + 46, + 47, + 48, + 49 + ], + "attributes": {} + }, + "_d0__magnitude_b": { + "bits": [ + 51, + 52, + 53, + 54, + 55 + ], + "attributes": {} + }, + "magnitude": { + "bits": [ + 56, + 57, + 58, + 59, + 60 + ], + "attributes": {} + }, + "_d1__endaround_b": { + "bits": [ + 61 + ], + "attributes": {} + }, + "const_0_1_h0": { + "bits": [ + 20 + ], + "attributes": {} + }, + "const_1_1_h0": { + "bits": [ + 43 + ], + "attributes": {} + }, + "const_2_1_h0": { + "bits": [ + 50 + ], + "attributes": {} + }, + "const_3_1_h0": { + "bits": [ + 62 + ], + "attributes": {} + } + } + }, + "CarrySelectCompoundAdder_OnesComplementAdder_W5": { + "attributes": { + "src": "generated" + }, + "ports": { + "a": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6 + ] + }, + "b": { + "direction": "input", + "bits": [ + 7, + 8, + 9, + 10, + 11 + ] + }, + "subtractIn": { + "direction": "input", + "bits": [ + 12 + ] + }, + "sum": { + "direction": "output", + "bits": [ + 13, + 14, + 15, + 16, + 17, + 18 + ] + }, + "sumP1": { + "direction": "output", + "bits": [ + 19, + 20, + 21, + 22, + 23, + 24 + ] + } + }, + "cells": { + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 5, + "A_WIDTH": 6, + "Y_WIDTH": 6 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 25, + 26, + 27, + 28, + 29, + 30 + ], + "Y": [ + 13, + 14, + 15, + 16, + 17, + 18 + ] + } + }, + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 31 + ], + "B": [ + 32, + 33, + 34, + 35, + 36 + ], + "Y": [ + 25, + 26, + 27, + 28, + 29, + 30 + ] + } + }, + "bussubset_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 5, + "A_WIDTH": 6, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 37, + 38, + 39, + 40, + 41, + 42 + ], + "Y": [ + 31 + ] + } + }, + "ones_complement_adder": { + "hide_name": 0, + "type": "OnesComplementAdder_W5", + "parameters": {}, + "attributes": {}, + "port_directions": { + "a": "input", + "b": "input", + "carryIn": "input", + "subtractIn": "input", + "sum": "output", + "endAroundCarry": "output", + "sign": "output" + }, + "connections": { + "a": [ + 2, + 3, + 4, + 5, + 6 + ], + "b": [ + 7, + 8, + 9, + 10, + 11 + ], + "carryIn": [ + 43 + ], + "subtractIn": [ + 12 + ], + "sum": [ + 37, + 38, + 39, + 40, + 41, + 42 + ], + "endAroundCarry": [ + 44 + ], + "sign": [ + 45 + ] + } + }, + "bussubset_1": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 4, + "A_WIDTH": 6, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 37, + 38, + 39, + 40, + 41, + 42 + ], + "Y": [ + 32, + 33, + 34, + 35, + 36 + ] + } + }, + "bussubset_2": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 5, + "A_WIDTH": 6, + "Y_WIDTH": 6 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 46, + 47, + 48, + 49, + 50, + 51 + ], + "Y": [ + 19, + 20, + 21, + 22, + 23, + 24 + ] + } + }, + "swizzle_0": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 52 + ], + "B": [ + 53, + 54, + 55, + 56, + 57 + ], + "Y": [ + 46, + 47, + 48, + 49, + 50, + 51 + ] + } + }, + "bussubset_3": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 5, + "A_WIDTH": 6, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 58, + 59, + 60, + 61, + 62, + 63 + ], + "Y": [ + 52 + ] + } + }, + "ones_complement_adder_0": { + "hide_name": 0, + "type": "OnesComplementAdder_W5", + "parameters": {}, + "attributes": {}, + "port_directions": { + "a": "input", + "b": "input", + "carryIn": "input", + "subtractIn": "input", + "sum": "output", + "endAroundCarry": "output", + "sign": "output" + }, + "connections": { + "a": [ + 2, + 3, + 4, + 5, + 6 + ], + "b": [ + 7, + 8, + 9, + 10, + 11 + ], + "carryIn": [ + 64 + ], + "subtractIn": [ + 12 + ], + "sum": [ + 58, + 59, + 60, + 61, + 62, + 63 + ], + "endAroundCarry": [ + 65 + ], + "sign": [ + 66 + ] + } + }, + "bussubset_4": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 4, + "A_WIDTH": 6, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 58, + 59, + 60, + 61, + 62, + 63 + ], + "Y": [ + 53, + 54, + 55, + 56, + 57 + ] + } + }, + "const_0_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 43 + ] + } + }, + "const_1_1_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h1": "output" + }, + "connections": { + "1'h1": [ + 64 + ] + } + } + }, + "netnames": { + "a": { + "bits": [ + 2, + 3, + 4, + 5, + 6 + ], + "attributes": {} + }, + "b": { + "bits": [ + 7, + 8, + 9, + 10, + 11 + ], + "attributes": {} + }, + "subtractIn": { + "bits": [ + 12 + ], + "attributes": {} + }, + "sum": { + "bits": [ + 13, + 14, + 15, + 16, + 17, + 18 + ], + "attributes": {} + }, + "sumP1": { + "bits": [ + 19, + 20, + 21, + 22, + 23, + 24 + ], + "attributes": {} + }, + "sum_inner": { + "bits": [ + 25, + 26, + 27, + 28, + 29, + 30 + ], + "attributes": {} + }, + "block_0_adder0Msb": { + "bits": [ + 31 + ], + "attributes": {} + }, + "block_0_sum0Ary": { + "bits": [ + 32, + 33, + 34, + 35, + 36 + ], + "attributes": {} + }, + "sum_0": { + "bits": [ + 37, + 38, + 39, + 40, + 41, + 42 + ], + "attributes": {} + }, + "sumP1_inner": { + "bits": [ + 46, + 47, + 48, + 49, + 50, + 51 + ], + "attributes": {} + }, + "block_0_adder1Msb": { + "bits": [ + 52 + ], + "attributes": {} + }, + "block_0_sum1Ary": { + "bits": [ + 53, + 54, + 55, + 56, + 57 + ], + "attributes": {} + }, + "sum_1": { + "bits": [ + 58, + 59, + 60, + 61, + 62, + 63 + ], + "attributes": {} + }, + "const_0_1_h0": { + "bits": [ + 43 + ], + "attributes": {} + }, + "const_1_1_h1": { + "bits": [ + 64 + ], + "attributes": {} + }, + "ones_complement_adder_endAroundCarry": { + "bits": [ + 44 + ], + "attributes": {} + }, + "ones_complement_adder_sign": { + "bits": [ + 45 + ], + "attributes": {} + }, + "ones_complement_adder_0_endAroundCarry": { + "bits": [ + 65 + ], + "attributes": {} + }, + "ones_complement_adder_0_sign": { + "bits": [ + 66 + ], + "attributes": {} + } + } + }, + "OnesComplementAdder_W4": { + "attributes": { + "src": "generated" + }, + "ports": { + "a": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5 + ] + }, + "b": { + "direction": "input", + "bits": [ + 6, + 7, + 8, + 9 + ] + }, + "subtractIn": { + "direction": "input", + "bits": [ + 10 + ] + }, + "sum": { + "direction": "output", + "bits": [ + 11, + 12, + 13, + 14, + 15 + ] + }, + "sign": { + "direction": "output", + "bits": [ + 16 + ] + } + }, + "cells": { + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 10 + ], + "A": [ + 17, + 18, + 19, + 20, + 21 + ], + "B": [ + 22, + 23, + 24, + 25, + 26 + ], + "Y": [ + 11, + 12, + 13, + 14, + 15 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 10 + ], + "A": [ + 6, + 7, + 8, + 9 + ], + "B": [ + 27, + 28, + 29, + 30 + ], + "Y": [ + 31, + 32, + 33, + 34 + ] + } + }, + "native_adder": { + "hide_name": 0, + "type": "NativeAdder_W4", + "parameters": {}, + "attributes": {}, + "port_directions": { + "a": "input", + "b": "input", + "carryIn": "input", + "sum": "output" + }, + "connections": { + "a": [ + 2, + 3, + 4, + 5 + ], + "b": [ + 31, + 32, + 33, + 34 + ], + "carryIn": [ + 35 + ], + "sum": [ + 17, + 18, + 19, + 20, + 21 + ] + } + }, + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 4, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 17, + 18, + 19, + 20, + 21 + ], + "Y": [ + 36 + ] + } + }, + "mux_1": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 36 + ], + "A": [ + 37, + 38, + 39, + 40 + ], + "B": [ + 41, + 42, + 43, + 44 + ], + "Y": [ + 45, + 46, + 47, + 48 + ] + } + }, + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 45, + 46, + 47, + 48 + ], + "B": [ + 49 + ], + "Y": [ + 22, + 23, + 24, + 25, + 26 + ] + } + }, + "not_": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 4, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 50, + 51, + 52, + 53 + ], + "Y": [ + 37, + 38, + 39, + 40 + ] + } + }, + "parallel_prefix_incr": { + "hide_name": 0, + "type": "ParallelPrefixIncr_W4", + "parameters": {}, + "attributes": {}, + "port_directions": { + "inp": "input", + "out": "output" + }, + "connections": { + "inp": [ + 50, + 51, + 52, + 53 + ], + "out": [ + 41, + 42, + 43, + 44 + ] + } + }, + "bussubset_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 5, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 17, + 18, + 19, + 20, + 21 + ], + "Y": [ + 50, + 51, + 52, + 53 + ] + } + }, + "not__0": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 36 + ], + "Y": [ + 54 + ] + } + }, + "mux_2": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 10 + ], + "A": [ + 55 + ], + "B": [ + 54 + ], + "Y": [ + 16 + ] + } + }, + "not__1": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 4, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 6, + 7, + 8, + 9 + ], + "Y": [ + 27, + 28, + 29, + 30 + ] + } + }, + "const_0_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 35 + ] + } + }, + "const_1_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 49 + ] + } + }, + "const_2_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 55 + ] + } + } + }, + "netnames": { + "a": { + "bits": [ + 2, + 3, + 4, + 5 + ], + "attributes": {} + }, + "b": { + "bits": [ + 6, + 7, + 8, + 9 + ], + "attributes": {} + }, + "subtractIn": { + "bits": [ + 10 + ], + "attributes": {} + }, + "sum": { + "bits": [ + 11, + 12, + 13, + 14, + 15 + ], + "attributes": {} + }, + "sign": { + "bits": [ + 16 + ], + "attributes": {} + }, + "adderSum": { + "bits": [ + 17, + 18, + 19, + 20, + 21 + ], + "attributes": {} + }, + "_d1__swizzled": { + "bits": [ + 22, + 23, + 24, + 25, + 26 + ], + "attributes": {} + }, + "_d1__b_b": { + "bits": [ + 27, + 28, + 29, + 30 + ], + "attributes": {} + }, + "b_0": { + "bits": [ + 31, + 32, + 33, + 34 + ], + "attributes": {} + }, + "endaround": { + "bits": [ + 36 + ], + "attributes": {} + }, + "_d0__magnitude_b": { + "bits": [ + 37, + 38, + 39, + 40 + ], + "attributes": {} + }, + "magnitude_plus1": { + "bits": [ + 41, + 42, + 43, + 44 + ], + "attributes": {} + }, + "_in0": { + "bits": [ + 45, + 46, + 47, + 48 + ], + "attributes": {} + }, + "magnitude": { + "bits": [ + 50, + 51, + 52, + 53 + ], + "attributes": {} + }, + "_d1__endaround_b": { + "bits": [ + 54 + ], + "attributes": {} + }, + "const_0_1_h0": { + "bits": [ + 35 + ], + "attributes": {} + }, + "const_1_1_h0": { + "bits": [ + 49 + ], + "attributes": {} + }, + "const_2_1_h0": { + "bits": [ + 55 + ], + "attributes": {} + } + } + }, + "RecursiveModulePriorityEncoder_W5": { + "attributes": { + "src": "generated" + }, + "ports": { + "inp": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6 + ] + }, + "valid": { + "direction": "output", + "bits": [ + 7 + ] + }, + "out": { + "direction": "output", + "bits": [ + 8, + 9, + 10 + ] + } + }, + "cells": { + "lessthan": { + "hide_name": 0, + "type": "$lt", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 11, + 12, + 13, + 14 + ], + "B": [ + 15, + 16, + 17, + 18 + ], + "Y": [ + 7 + ] + } + }, + "priority_encode_node": { + "hide_name": 0, + "type": "PriorityEncodeNode_W5", + "parameters": {}, + "attributes": {}, + "port_directions": { + "seq": "input", + "ret": "output" + }, + "connections": { + "seq": [ + 2, + 3, + 4, + 5, + 6 + ], + "ret": [ + 11, + 12, + 13, + 14 + ] + } + }, + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 4, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 11, + 12, + 13, + 14 + ], + "Y": [ + 8, + 9, + 10 + ] + } + }, + "const_0_4_h5": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'h5": "output" + }, + "connections": { + "4'h5": [ + 15, + 16, + 17, + 18 + ] + } + } + }, + "netnames": { + "inp": { + "bits": [ + 2, + 3, + 4, + 5, + 6 + ], + "attributes": {} + }, + "valid": { + "bits": [ + 7 + ], + "attributes": {} + }, + "out": { + "bits": [ + 8, + 9, + 10 + ], + "attributes": {} + }, + "ret": { + "bits": [ + 11, + 12, + 13, + 14 + ], + "attributes": {} + }, + "const_0_4_h5": { + "bits": [ + 15, + 16, + 17, + 18 + ], + "attributes": {} + } + } + }, + "ParallelPrefixDecr_W4": { + "attributes": { + "src": "generated" + }, + "ports": { + "inp": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5 + ] + }, + "out": { + "direction": "output", + "bits": [ + 6, + 7, + 8, + 9 + ] + } + }, + "cells": { + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 1, + "IN1_WIDTH": 1, + "IN2_WIDTH": 1, + "IN3_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "[0]": "input", + "[1]": "input", + "[2]": "input", + "[3]": "input", + "Y": "output" + }, + "connections": { + "[0]": [ + 10 + ], + "[1]": [ + 11 + ], + "[2]": [ + 12 + ], + "[3]": [ + 13 + ], + "Y": [ + 6, + 7, + 8, + 9 + ] + } + }, + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 14, + 15, + 16, + 17 + ], + "Y": [ + 10 + ] + } + }, + "bussubset_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 14, + 15, + 16, + 17 + ], + "Y": [ + 18 + ] + } + }, + "kogge_stone": { + "hide_name": 0, + "type": "KoggeStone", + "parameters": {}, + "attributes": {}, + "port_directions": { + "i0": "input", + "i1": "input", + "i2": "input", + "i3": "input", + "o0": "output", + "o1": "output", + "o2": "output", + "o3": "output" + }, + "connections": { + "i0": [ + 18 + ], + "i1": [ + 19 + ], + "i2": [ + 20 + ], + "i3": [ + 21 + ], + "o0": [ + 22 + ], + "o1": [ + 23 + ], + "o2": [ + 24 + ], + "o3": [ + 25 + ] + } + }, + "xor_": { + "hide_name": 0, + "type": "$xor", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 26 + ], + "B": [ + 22 + ], + "Y": [ + 11 + ] + } + }, + "bussubset_1": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 1, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5 + ], + "Y": [ + 26 + ] + } + }, + "xor__0": { + "hide_name": 0, + "type": "$xor", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 27 + ], + "B": [ + 23 + ], + "Y": [ + 12 + ] + } + }, + "bussubset_2": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 2, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5 + ], + "Y": [ + 27 + ] + } + }, + "xor__1": { + "hide_name": 0, + "type": "$xor", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 28 + ], + "B": [ + 24 + ], + "Y": [ + 13 + ] + } + }, + "bussubset_3": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5 + ], + "Y": [ + 28 + ] + } + }, + "bussubset_4": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 1, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 14, + 15, + 16, + 17 + ], + "Y": [ + 19 + ] + } + }, + "bussubset_5": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 2, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 14, + 15, + 16, + 17 + ], + "Y": [ + 20 + ] + } + }, + "bussubset_6": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 14, + 15, + 16, + 17 + ], + "Y": [ + 21 + ] + } + }, + "not_": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 4, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5 + ], + "Y": [ + 14, + 15, + 16, + 17 + ] + } + } + }, + "netnames": { + "inp": { + "bits": [ + 2, + 3, + 4, + 5 + ], + "attributes": {} + }, + "out": { + "bits": [ + 6, + 7, + 8, + 9 + ], + "attributes": {} + }, + "o_0": { + "bits": [ + 10 + ], + "attributes": {} + }, + "o_1": { + "bits": [ + 11 + ], + "attributes": {} + }, + "o_2": { + "bits": [ + 12 + ], + "attributes": {} + }, + "o_3": { + "bits": [ + 13 + ], + "attributes": {} + }, + "complement": { + "bits": [ + 14, + 15, + 16, + 17 + ], + "attributes": {} + }, + "i0": { + "bits": [ + 18 + ], + "attributes": {} + }, + "i1": { + "bits": [ + 19 + ], + "attributes": {} + }, + "i2": { + "bits": [ + 20 + ], + "attributes": {} + }, + "i3": { + "bits": [ + 21 + ], + "attributes": {} + }, + "o0": { + "bits": [ + 22 + ], + "attributes": {} + }, + "o1": { + "bits": [ + 23 + ], + "attributes": {} + }, + "o2": { + "bits": [ + 24 + ], + "attributes": {} + }, + "_in0__subset_1_1_inp": { + "bits": [ + 26 + ], + "attributes": {} + }, + "_in0__subset_2_2_inp": { + "bits": [ + 27 + ], + "attributes": {} + }, + "_in0__subset_3_3_inp": { + "bits": [ + 28 + ], + "attributes": {} + }, + "kogge_stone_o3": { + "bits": [ + 25 + ], + "attributes": {} + } + } + }, + "FloatingPointSwap_W8": { + "attributes": { + "src": "generated" + }, + "ports": { + "a": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ] + }, + "b": { + "direction": "input", + "bits": [ + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ] + }, + "swap": { + "direction": "input", + "bits": [ + 18 + ] + }, + "outA": { + "direction": "output", + "bits": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ] + }, + "outB": { + "direction": "output", + "bits": [ + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34 + ] + } + }, + "cells": { + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 3, + "IN1_WIDTH": 4, + "IN2_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "[2:0]": "input", + "[6:3]": "input", + "[7]": "input", + "Y": "output" + }, + "connections": { + "[2:0]": [ + 35, + 36, + 37 + ], + "[6:3]": [ + 38, + 39, + 40, + 41 + ], + "[7]": [ + 42 + ], + "Y": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ] + } + }, + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 8, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50 + ], + "Y": [ + 38, + 39, + 40, + 41 + ] + } + }, + "bussubset_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 8, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50 + ], + "Y": [ + 35, + 36, + 37 + ] + } + }, + "bussubset_1": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 7, + "A_WIDTH": 8, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50 + ], + "Y": [ + 42 + ] + } + }, + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 8 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 18 + ], + "A": [ + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ], + "B": [ + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66 + ], + "Y": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 8 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 18 + ], + "A": [ + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66 + ], + "B": [ + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ], + "Y": [ + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74 + ] + } + }, + "bussubset_2": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 8, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74 + ], + "Y": [ + 75, + 76, + 77 + ] + } + }, + "bussubset_3": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 8, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74 + ], + "Y": [ + 78, + 79, + 80, + 81 + ] + } + }, + "swizzle_0": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 3, + "IN1_WIDTH": 4, + "IN2_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "[2:0]": "input", + "[6:3]": "input", + "[7]": "input", + "Y": "output" + }, + "connections": { + "[2:0]": [ + 75, + 76, + 77 + ], + "[6:3]": [ + 78, + 79, + 80, + 81 + ], + "[7]": [ + 82 + ], + "Y": [ + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34 + ] + } + }, + "bussubset_4": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 7, + "A_WIDTH": 8, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74 + ], + "Y": [ + 82 + ] + } + }, + "swizzle_1": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 3, + "IN1_WIDTH": 4, + "IN2_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "[2:0]": "input", + "[6:3]": "input", + "[7]": "input", + "Y": "output" + }, + "connections": { + "[2:0]": [ + 83, + 84, + 85 + ], + "[6:3]": [ + 86, + 87, + 88, + 89 + ], + "[7]": [ + 90 + ], + "Y": [ + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66 + ] + } + }, + "bussubset_5": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 8, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "Y": [ + 83, + 84, + 85 + ] + } + }, + "bussubset_6": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 7, + "A_WIDTH": 8, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "Y": [ + 90 + ] + } + }, + "bussubset_7": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 8, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "Y": [ + 86, + 87, + 88, + 89 + ] + } + }, + "swizzle_2": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 3, + "IN1_WIDTH": 4, + "IN2_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "[2:0]": "input", + "[6:3]": "input", + "[7]": "input", + "Y": "output" + }, + "connections": { + "[2:0]": [ + 91, + 92, + 93 + ], + "[6:3]": [ + 94, + 95, + 96, + 97 + ], + "[7]": [ + 98 + ], + "Y": [ + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ] + } + }, + "bussubset_8": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 8, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "Y": [ + 91, + 92, + 93 + ] + } + }, + "bussubset_9": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 7, + "A_WIDTH": 8, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "Y": [ + 98 + ] + } + }, + "bussubset_10": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 8, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "Y": [ + 94, + 95, + 96, + 97 + ] + } + } + }, + "netnames": { + "a": { + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "attributes": {} + }, + "b": { + "bits": [ + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "attributes": {} + }, + "swap": { + "bits": [ + 18 + ], + "attributes": {} + }, + "outA": { + "bits": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "attributes": {} + }, + "outB": { + "bits": [ + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34 + ], + "attributes": {} + }, + "swapOut1_mantissa": { + "bits": [ + 35, + 36, + 37 + ], + "attributes": {} + }, + "swapOut1_exponent": { + "bits": [ + 38, + 39, + 40, + 41 + ], + "attributes": {} + }, + "swapOut1_sign": { + "bits": [ + 42 + ], + "attributes": {} + }, + "swapOut1": { + "bits": [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50 + ], + "attributes": {} + }, + "swapIn1_a": { + "bits": [ + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ], + "attributes": {} + }, + "swapIn2_b": { + "bits": [ + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66 + ], + "attributes": {} + }, + "swapOut2": { + "bits": [ + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74 + ], + "attributes": {} + }, + "swapOut2_mantissa": { + "bits": [ + 75, + 76, + 77 + ], + "attributes": {} + }, + "swapOut2_exponent": { + "bits": [ + 78, + 79, + 80, + 81 + ], + "attributes": {} + }, + "swapOut2_sign": { + "bits": [ + 82 + ], + "attributes": {} + }, + "swapIn2_b_mantissa": { + "bits": [ + 83, + 84, + 85 + ], + "attributes": {} + }, + "swapIn2_b_exponent": { + "bits": [ + 86, + 87, + 88, + 89 + ], + "attributes": {} + }, + "swapIn2_b_sign": { + "bits": [ + 90 + ], + "attributes": {} + }, + "swapIn1_a_mantissa": { + "bits": [ + 91, + 92, + 93 + ], + "attributes": {} + }, + "swapIn1_a_exponent": { + "bits": [ + 94, + 95, + 96, + 97 + ], + "attributes": {} + }, + "swapIn1_a_sign": { + "bits": [ + 98 + ], + "attributes": {} + } + } + }, + "OnesComplementAdder_W4_0": { + "attributes": { + "src": "generated" + }, + "ports": { + "a": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5 + ] + }, + "b": { + "direction": "input", + "bits": [ + 6, + 7, + 8, + 9 + ] + }, + "sum": { + "direction": "output", + "bits": [ + 10, + 11, + 12, + 13, + 14 + ] + }, + "sign": { + "direction": "output", + "bits": [ + 15 + ] + } + }, + "cells": { + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 16 + ], + "A": [ + 17, + 18, + 19, + 20, + 21 + ], + "B": [ + 22, + 23, + 24, + 25, + 26 + ], + "Y": [ + 10, + 11, + 12, + 13, + 14 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 16 + ], + "A": [ + 6, + 7, + 8, + 9 + ], + "B": [ + 27, + 28, + 29, + 30 + ], + "Y": [ + 31, + 32, + 33, + 34 + ] + } + }, + "native_adder": { + "hide_name": 0, + "type": "NativeAdder_W4", + "parameters": {}, + "attributes": {}, + "port_directions": { + "a": "input", + "b": "input", + "carryIn": "input", + "sum": "output" + }, + "connections": { + "a": [ + 2, + 3, + 4, + 5 + ], + "b": [ + 31, + 32, + 33, + 34 + ], + "carryIn": [ + 35 + ], + "sum": [ + 17, + 18, + 19, + 20, + 21 + ] + } + }, + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 4, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 17, + 18, + 19, + 20, + 21 + ], + "Y": [ + 36 + ] + } + }, + "mux_1": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 36 + ], + "A": [ + 37, + 38, + 39, + 40 + ], + "B": [ + 41, + 42, + 43, + 44 + ], + "Y": [ + 45, + 46, + 47, + 48 + ] + } + }, + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 45, + 46, + 47, + 48 + ], + "B": [ + 49 + ], + "Y": [ + 22, + 23, + 24, + 25, + 26 + ] + } + }, + "not_": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 4, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 50, + 51, + 52, + 53 + ], + "Y": [ + 37, + 38, + 39, + 40 + ] + } + }, + "parallel_prefix_incr": { + "hide_name": 0, + "type": "ParallelPrefixIncr_W4", + "parameters": {}, + "attributes": {}, + "port_directions": { + "inp": "input", + "out": "output" + }, + "connections": { + "inp": [ + 50, + 51, + 52, + 53 + ], + "out": [ + 41, + 42, + 43, + 44 + ] + } + }, + "bussubset_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 5, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 17, + 18, + 19, + 20, + 21 + ], + "Y": [ + 50, + 51, + 52, + 53 + ] + } + }, + "not__0": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 36 + ], + "Y": [ + 54 + ] + } + }, + "mux_2": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 16 + ], + "A": [ + 55 + ], + "B": [ + 54 + ], + "Y": [ + 15 + ] + } + }, + "not__1": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 4, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 6, + 7, + 8, + 9 + ], + "Y": [ + 27, + 28, + 29, + 30 + ] + } + }, + "const_0_1_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h1": "output" + }, + "connections": { + "1'h1": [ + 16 + ] + } + }, + "const_1_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 35 + ] + } + }, + "const_2_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 49 + ] + } + }, + "const_3_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 55 + ] + } + } + }, + "netnames": { + "a": { + "bits": [ + 2, + 3, + 4, + 5 + ], + "attributes": {} + }, + "b": { + "bits": [ + 6, + 7, + 8, + 9 + ], + "attributes": {} + }, + "sum": { + "bits": [ + 10, + 11, + 12, + 13, + 14 + ], + "attributes": {} + }, + "sign": { + "bits": [ + 15 + ], + "attributes": {} + }, + "adderSum": { + "bits": [ + 17, + 18, + 19, + 20, + 21 + ], + "attributes": {} + }, + "_d1__swizzled": { + "bits": [ + 22, + 23, + 24, + 25, + 26 + ], + "attributes": {} + }, + "_d1__b_b": { + "bits": [ + 27, + 28, + 29, + 30 + ], + "attributes": {} + }, + "b_0": { + "bits": [ + 31, + 32, + 33, + 34 + ], + "attributes": {} + }, + "endaround": { + "bits": [ + 36 + ], + "attributes": {} + }, + "_d0__magnitude_b": { + "bits": [ + 37, + 38, + 39, + 40 + ], + "attributes": {} + }, + "magnitude_plus1": { + "bits": [ + 41, + 42, + 43, + 44 + ], + "attributes": {} + }, + "_in0": { + "bits": [ + 45, + 46, + 47, + 48 + ], + "attributes": {} + }, + "magnitude": { + "bits": [ + 50, + 51, + 52, + 53 + ], + "attributes": {} + }, + "_d1__endaround_b": { + "bits": [ + 54 + ], + "attributes": {} + }, + "const_0_1_h1": { + "bits": [ + 16 + ], + "attributes": {} + }, + "const_1_1_h0": { + "bits": [ + 35 + ], + "attributes": {} + }, + "const_2_1_h0": { + "bits": [ + 49 + ], + "attributes": {} + }, + "const_3_1_h0": { + "bits": [ + 55 + ], + "attributes": {} + } + } + }, + "NativeAdder_W6": { + "attributes": { + "src": "generated" + }, + "ports": { + "a": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7 + ] + }, + "b": { + "direction": "input", + "bits": [ + 8, + 9, + 10, + 11, + 12, + 13 + ] + }, + "sum": { + "direction": "output", + "bits": [ + 14, + 15, + 16, + 17, + 18, + 19, + 20 + ] + } + }, + "cells": { + "add": { + "hide_name": 0, + "type": "$add", + "parameters": { + "A_WIDTH": 7, + "B_WIDTH": 7, + "Y_WIDTH": 7 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output", + "CO": "output" + }, + "connections": { + "A": [ + 21, + 22, + 23, + 24, + 25, + 26, + 27 + ], + "B": [ + 28, + 29, + 30, + 31, + 32, + 33, + 34 + ], + "Y": [ + 14, + 15, + 16, + 17, + 18, + 19, + 20 + ], + "CO": [ + 35 + ] + } + }, + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 6, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6, + 7 + ], + "B": [ + 36 + ], + "Y": [ + 21, + 22, + 23, + 24, + 25, + 26, + 27 + ] + } + }, + "swizzle_0": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 6, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 8, + 9, + 10, + 11, + 12, + 13 + ], + "B": [ + 37 + ], + "Y": [ + 28, + 29, + 30, + 31, + 32, + 33, + 34 + ] + } + }, + "const_0_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 36 + ] + } + }, + "const_1_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 37 + ] + } + } + }, + "netnames": { + "a": { + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7 + ], + "attributes": {} + }, + "b": { + "bits": [ + 8, + 9, + 10, + 11, + 12, + 13 + ], + "attributes": {} + }, + "sum": { + "bits": [ + 14, + 15, + 16, + 17, + 18, + 19, + 20 + ], + "attributes": {} + }, + "aExtended": { + "bits": [ + 21, + 22, + 23, + 24, + 25, + 26, + 27 + ], + "attributes": {} + }, + "bExtended": { + "bits": [ + 28, + 29, + 30, + 31, + 32, + 33, + 34 + ], + "attributes": {} + }, + "_aExtended_add_bExtended_carry": { + "bits": [ + 35 + ], + "attributes": {} + }, + "const_0_1_h0": { + "bits": [ + 36 + ], + "attributes": {} + }, + "const_1_1_h0": { + "bits": [ + 37 + ], + "attributes": {} + } + } + }, + "OnesComplementAdder_W5_1": { + "attributes": { + "src": "generated" + }, + "ports": { + "a": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6 + ] + }, + "b": { + "direction": "input", + "bits": [ + 7, + 8, + 9, + 10, + 11 + ] + }, + "subtractIn": { + "direction": "input", + "bits": [ + 12 + ] + }, + "sum": { + "direction": "output", + "bits": [ + 13, + 14, + 15, + 16, + 17, + 18 + ] + }, + "sign": { + "direction": "output", + "bits": [ + 19 + ] + } + }, + "cells": { + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 6 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 12 + ], + "A": [ + 20, + 21, + 22, + 23, + 24, + 25 + ], + "B": [ + 26, + 27, + 28, + 29, + 30, + 31 + ], + "Y": [ + 13, + 14, + 15, + 16, + 17, + 18 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 12 + ], + "A": [ + 7, + 8, + 9, + 10, + 11 + ], + "B": [ + 32, + 33, + 34, + 35, + 36 + ], + "Y": [ + 37, + 38, + 39, + 40, + 41 + ] + } + }, + "native_adder": { + "hide_name": 0, + "type": "NativeAdder_W5", + "parameters": {}, + "attributes": {}, + "port_directions": { + "a": "input", + "b": "input", + "carryIn": "input", + "sum": "output" + }, + "connections": { + "a": [ + 2, + 3, + 4, + 5, + 6 + ], + "b": [ + 37, + 38, + 39, + 40, + 41 + ], + "carryIn": [ + 42 + ], + "sum": [ + 20, + 21, + 22, + 23, + 24, + 25 + ] + } + }, + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 5, + "A_WIDTH": 6, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 20, + 21, + 22, + 23, + 24, + 25 + ], + "Y": [ + 43 + ] + } + }, + "mux_1": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 43 + ], + "A": [ + 44, + 45, + 46, + 47, + 48 + ], + "B": [ + 49, + 50, + 51, + 52, + 53 + ], + "Y": [ + 54, + 55, + 56, + 57, + 58 + ] + } + }, + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 5, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 54, + 55, + 56, + 57, + 58 + ], + "B": [ + 59 + ], + "Y": [ + 26, + 27, + 28, + 29, + 30, + 31 + ] + } + }, + "not_": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 5, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 60, + 61, + 62, + 63, + 64 + ], + "Y": [ + 44, + 45, + 46, + 47, + 48 + ] + } + }, + "parallel_prefix_incr": { + "hide_name": 0, + "type": "ParallelPrefixIncr_W5", + "parameters": {}, + "attributes": {}, + "port_directions": { + "inp": "input", + "out": "output" + }, + "connections": { + "inp": [ + 60, + 61, + 62, + 63, + 64 + ], + "out": [ + 49, + 50, + 51, + 52, + 53 + ] + } + }, + "bussubset_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 6, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 20, + 21, + 22, + 23, + 24, + 25 + ], + "Y": [ + 60, + 61, + 62, + 63, + 64 + ] + } + }, + "not__0": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 43 + ], + "Y": [ + 65 + ] + } + }, + "mux_2": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 12 + ], + "A": [ + 66 + ], + "B": [ + 65 + ], + "Y": [ + 19 + ] + } + }, + "not__1": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 5, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 7, + 8, + 9, + 10, + 11 + ], + "Y": [ + 32, + 33, + 34, + 35, + 36 + ] + } + }, + "const_0_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 42 + ] + } + }, + "const_1_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 59 + ] + } + }, + "const_2_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 66 + ] + } + } + }, + "netnames": { + "a": { + "bits": [ + 2, + 3, + 4, + 5, + 6 + ], + "attributes": {} + }, + "b": { + "bits": [ + 7, + 8, + 9, + 10, + 11 + ], + "attributes": {} + }, + "subtractIn": { + "bits": [ + 12 + ], + "attributes": {} + }, + "sum": { + "bits": [ + 13, + 14, + 15, + 16, + 17, + 18 + ], + "attributes": {} + }, + "sign": { + "bits": [ + 19 + ], + "attributes": {} + }, + "adderSum": { + "bits": [ + 20, + 21, + 22, + 23, + 24, + 25 + ], + "attributes": {} + }, + "_d1__swizzled": { + "bits": [ + 26, + 27, + 28, + 29, + 30, + 31 + ], + "attributes": {} + }, + "_d1__b_b": { + "bits": [ + 32, + 33, + 34, + 35, + 36 + ], + "attributes": {} + }, + "b_0": { + "bits": [ + 37, + 38, + 39, + 40, + 41 + ], + "attributes": {} + }, + "endaround": { + "bits": [ + 43 + ], + "attributes": {} + }, + "_d0__magnitude_b": { + "bits": [ + 44, + 45, + 46, + 47, + 48 + ], + "attributes": {} + }, + "magnitude_plus1": { + "bits": [ + 49, + 50, + 51, + 52, + 53 + ], + "attributes": {} + }, + "_in0": { + "bits": [ + 54, + 55, + 56, + 57, + 58 + ], + "attributes": {} + }, + "magnitude": { + "bits": [ + 60, + 61, + 62, + 63, + 64 + ], + "attributes": {} + }, + "_d1__endaround_b": { + "bits": [ + 65 + ], + "attributes": {} + }, + "const_0_1_h0": { + "bits": [ + 42 + ], + "attributes": {} + }, + "const_1_1_h0": { + "bits": [ + 59 + ], + "attributes": {} + }, + "const_2_1_h0": { + "bits": [ + 66 + ], + "attributes": {} + } + } + }, + "CarrySelectOnesComplementCompoundAdder_W5": { + "attributes": { + "src": "generated" + }, + "ports": { + "a": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6 + ] + }, + "b": { + "direction": "input", + "bits": [ + 7, + 8, + 9, + 10, + 11 + ] + }, + "subtractIn": { + "direction": "input", + "bits": [ + 12 + ] + }, + "sum": { + "direction": "output", + "bits": [ + 13, + 14, + 15, + 16, + 17, + 18 + ] + }, + "sumP1": { + "direction": "output", + "bits": [ + 19, + 20, + 21, + 22, + 23, + 24 + ] + }, + "carryOut": { + "direction": "output", + "bits": [ + 25 + ] + }, + "carryOutP1": { + "direction": "output", + "bits": [ + 26 + ] + }, + "sign": { + "direction": "output", + "bits": [ + 27 + ] + }, + "signP1": { + "direction": "output", + "bits": [ + 28 + ] + } + }, + "cells": { + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 6 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 29 + ], + "A": [ + 30, + 31, + 32, + 33, + 34, + 35 + ], + "B": [ + 36, + 37, + 38, + 39, + 40, + 41 + ], + "Y": [ + 13, + 14, + 15, + 16, + 17, + 18 + ] + } + }, + "and_": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 12 + ], + "B": [ + 42 + ], + "Y": [ + 29 + ] + } + }, + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 5, + "A_WIDTH": 6, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 30, + 31, + 32, + 33, + 34, + 35 + ], + "Y": [ + 42 + ] + } + }, + "cs_compound_adder": { + "hide_name": 0, + "type": "CarrySelectCompoundAdder_OnesComplementAdder_W5", + "parameters": {}, + "attributes": {}, + "port_directions": { + "a": "input", + "b": "input", + "subtractIn": "input", + "sum": "output", + "sumP1": "output" + }, + "connections": { + "a": [ + 2, + 3, + 4, + 5, + 6 + ], + "b": [ + 7, + 8, + 9, + 10, + 11 + ], + "subtractIn": [ + 12 + ], + "sum": [ + 30, + 31, + 32, + 33, + 34, + 35 + ], + "sumP1": [ + 43, + 44, + 45, + 46, + 47, + 48 + ] + } + }, + "bussubset_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 5, + "A_WIDTH": 6, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 30, + 31, + 32, + 33, + 34, + 35 + ], + "Y": [ + 49 + ] + } + }, + "not_": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 49 + ], + "Y": [ + 50 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 12 + ], + "A": [ + 51 + ], + "B": [ + 50 + ], + "Y": [ + 27 + ] + } + }, + "not__0": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 6, + "Y_WIDTH": 6 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 30, + 31, + 32, + 33, + 34, + 35 + ], + "Y": [ + 36, + 37, + 38, + 39, + 40, + 41 + ] + } + }, + "bussubset_1": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 5, + "A_WIDTH": 6, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 30, + 31, + 32, + 33, + 34, + 35 + ], + "Y": [ + 25 + ] + } + }, + "bussubset_2": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 5, + "A_WIDTH": 6, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 43, + 44, + 45, + 46, + 47, + 48 + ], + "Y": [ + 52 + ] + } + }, + "not__1": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 52 + ], + "Y": [ + 53 + ] + } + }, + "mux_1": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 12 + ], + "A": [ + 54 + ], + "B": [ + 53 + ], + "Y": [ + 28 + ] + } + }, + "bussubset_3": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 5, + "A_WIDTH": 6, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 43, + 44, + 45, + 46, + 47, + 48 + ], + "Y": [ + 55 + ] + } + }, + "and__0": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 12 + ], + "B": [ + 55 + ], + "Y": [ + 56 + ] + } + }, + "mux_2": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 6 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 56 + ], + "A": [ + 43, + 44, + 45, + 46, + 47, + 48 + ], + "B": [ + 57, + 58, + 59, + 60, + 61, + 62 + ], + "Y": [ + 19, + 20, + 21, + 22, + 23, + 24 + ] + } + }, + "not__2": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 6, + "Y_WIDTH": 6 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 43, + 44, + 45, + 46, + 47, + 48 + ], + "Y": [ + 57, + 58, + 59, + 60, + 61, + 62 + ] + } + }, + "bussubset_4": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 5, + "A_WIDTH": 6, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 43, + 44, + 45, + 46, + 47, + 48 + ], + "Y": [ + 26 + ] + } + }, + "ones_complement_adder": { + "hide_name": 0, + "type": "OnesComplementAdder_W5_0", + "parameters": {}, + "attributes": {}, + "port_directions": { + "a": "input", + "b": "input", + "sum": "output", + "endAroundCarry": "output", + "sign": "output" + }, + "connections": { + "a": [ + 2, + 3, + 4, + 5, + 6 + ], + "b": [ + 7, + 8, + 9, + 10, + 11 + ], + "sum": [ + 63, + 64, + 65, + 66, + 67, + 68 + ], + "endAroundCarry": [ + 69 + ], + "sign": [ + 70 + ] + } + }, + "const_0_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 51 + ] + } + }, + "const_1_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 54 + ] + } + } + }, + "netnames": { + "a": { + "bits": [ + 2, + 3, + 4, + 5, + 6 + ], + "attributes": {} + }, + "b": { + "bits": [ + 7, + 8, + 9, + 10, + 11 + ], + "attributes": {} + }, + "subtractIn": { + "bits": [ + 12 + ], + "attributes": {} + }, + "sum": { + "bits": [ + 13, + 14, + 15, + 16, + 17, + 18 + ], + "attributes": {} + }, + "sumP1": { + "bits": [ + 19, + 20, + 21, + 22, + 23, + 24 + ], + "attributes": {} + }, + "carryOut": { + "bits": [ + 25 + ], + "attributes": {} + }, + "carryOutP1": { + "bits": [ + 26 + ], + "attributes": {} + }, + "sign": { + "bits": [ + 27 + ], + "attributes": {} + }, + "signP1": { + "bits": [ + 28 + ], + "attributes": {} + }, + "_control__subtractIn_and__subset_5_5_sum": { + "bits": [ + 29 + ], + "attributes": {} + }, + "sum_0": { + "bits": [ + 30, + 31, + 32, + 33, + 34, + 35 + ], + "attributes": {} + }, + "_d1__sum_b": { + "bits": [ + 36, + 37, + 38, + 39, + 40, + 41 + ], + "attributes": {} + }, + "_in1__subset_5_5_sum": { + "bits": [ + 42 + ], + "attributes": {} + }, + "sumP1_0": { + "bits": [ + 43, + 44, + 45, + 46, + 47, + 48 + ], + "attributes": {} + }, + "_subset_5_5_sum": { + "bits": [ + 49 + ], + "attributes": {} + }, + "_d1__subset_5_5_sum_b": { + "bits": [ + 50 + ], + "attributes": {} + }, + "_subset_5_5_sumP1": { + "bits": [ + 52 + ], + "attributes": {} + }, + "_d1__subset_5_5_sumP1_b": { + "bits": [ + 53 + ], + "attributes": {} + }, + "_in1__subset_5_5_sumP1": { + "bits": [ + 55 + ], + "attributes": {} + }, + "_control__subtractIn_and__subset_5_5_sumP1": { + "bits": [ + 56 + ], + "attributes": {} + }, + "_d1__sumP1_b": { + "bits": [ + 57, + 58, + 59, + 60, + 61, + 62 + ], + "attributes": {} + }, + "const_0_1_h0": { + "bits": [ + 51 + ], + "attributes": {} + }, + "const_1_1_h0": { + "bits": [ + 54 + ], + "attributes": {} + }, + "ones_complement_adder_sum": { + "bits": [ + 63, + 64, + 65, + 66, + 67, + 68 + ], + "attributes": {} + }, + "ones_complement_adder_endAroundCarry": { + "bits": [ + 69 + ], + "attributes": {} + }, + "ones_complement_adder_sign": { + "bits": [ + 70 + ], + "attributes": {} + } + } + }, + "FloatingPointAdderDualPath_E4M3": { + "attributes": { + "src": "generated" + }, + "ports": { + "clk": { + "direction": "input", + "bits": [ + 2 + ] + }, + "reset": { + "direction": "input", + "bits": [ + 3 + ] + }, + "enable": { + "direction": "input", + "bits": [ + 4 + ] + }, + "a": { + "direction": "input", + "bits": [ + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12 + ] + }, + "b": { + "direction": "input", + "bits": [ + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20 + ] + }, + "sum": { + "direction": "output", + "bits": [ + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28 + ] + } + }, + "cells": { + "combinational": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "_in0_isNaN_flopped": "input", + "_in5_isInf_flopped": "input", + "_in8__s": "input", + "_in10_isR": "input", + "_in11_realIsInfRPath": "input", + "_in14__s": "input", + "_in16_sign_flopped": "input", + "_in17__s": "input", + "_in18__out": "input", + "_in20_realIsInfNPath": "input", + "_in22_signNpath": "input", + "_in23_exponentNpath": "input", + "_in24__out": "input", + "sum": "output" + }, + "connections": { + "_in0_isNaN_flopped": [ + 37 + ], + "_in5_isInf_flopped": [ + 47 + ], + "_in8__s": [ + 55 + ], + "_in10_isR": [ + 57 + ], + "_in11_realIsInfRPath": [ + 58 + ], + "_in14__s": [ + 55 + ], + "_in16_sign_flopped": [ + 55 + ], + "_in17__s": [ + 67, + 68, + 69, + 70 + ], + "_in18__out": [ + 71, + 72, + 73 + ], + "_in20_realIsInfNPath": [ + 75 + ], + "_in22_signNpath": [ + 77 + ], + "_in23_exponentNpath": [ + 78, + 79, + 80, + 81 + ], + "_in24__out": [ + 82, + 83, + 84 + ], + "sum": [ + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28 + ] + } + }, + "flipflop": { + "hide_name": 0, + "type": "$dff", + "parameters": { + "WIDTH": 1, + "CLK_POLARITY": 1 + }, + "attributes": {}, + "port_directions": { + "_clk": "input", + "_d": "input", + "_q": "output", + "_en": "input", + "_reset": "input" + }, + "connections": { + "_clk": [ + 2 + ], + "_d": [ + 85 + ], + "_q": [ + 37 + ], + "_en": [ + 4 + ], + "_reset": [ + 3 + ] + } + }, + "or_": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 86 + ], + "B": [ + 87 + ], + "Y": [ + 85 + ] + } + }, + "or__0": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 88 + ], + "B": [ + 89 + ], + "Y": [ + 86 + ] + } + }, + "and_": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 90 + ], + "B": [ + 91 + ], + "Y": [ + 88 + ] + } + }, + "equals": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 92, + 93, + 94, + 95 + ], + "B": [ + 96, + 97, + 98, + 99 + ], + "Y": [ + 90 + ] + } + }, + "uor": { + "hide_name": 0, + "type": "$reduce_or", + "parameters": { + "A_WIDTH": 3, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 100, + 101, + 102 + ], + "Y": [ + 103 + ] + } + }, + "not_": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 103 + ], + "Y": [ + 104 + ] + } + }, + "and__0": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 105 + ], + "B": [ + 104 + ], + "Y": [ + 106 + ] + } + }, + "or__1": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 106 + ], + "B": [ + 107 + ], + "Y": [ + 108 + ] + } + }, + "flipflop_0": { + "hide_name": 0, + "type": "$dff", + "parameters": { + "WIDTH": 1, + "CLK_POLARITY": 1 + }, + "attributes": {}, + "port_directions": { + "_clk": "input", + "_d": "input", + "_q": "output", + "_en": "input", + "_reset": "input" + }, + "connections": { + "_clk": [ + 2 + ], + "_d": [ + 108 + ], + "_q": [ + 47 + ], + "_en": [ + 4 + ], + "_reset": [ + 3 + ] + } + }, + "and__1": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 106 + ], + "B": [ + 107 + ], + "Y": [ + 109 + ] + } + }, + "and__2": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 109 + ], + "B": [ + 110 + ], + "Y": [ + 87 + ] + } + }, + "mux": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 110 + ], + "A": [ + 111, + 112, + 113, + 114, + 115 + ], + "B": [ + 116, + 117, + 118, + 119, + 120 + ], + "Y": [ + 121, + 122, + 123, + 124, + 125 + ] + } + }, + "flipflop_1": { + "hide_name": 0, + "type": "$dff", + "parameters": { + "WIDTH": 5, + "CLK_POLARITY": 1 + }, + "attributes": {}, + "port_directions": { + "_clk": "input", + "_d": "input", + "_q": "output", + "_en": "input", + "_reset": "input" + }, + "connections": { + "_clk": [ + 2 + ], + "_d": [ + 121, + 122, + 123, + 124, + 125 + ], + "_q": [ + 126, + 127, + 128, + 129, + 130 + ], + "_en": [ + 4 + ], + "_reset": [ + 3 + ] + } + }, + "rpath_significand_adder": { + "hide_name": 0, + "type": "CarrySelectOnesComplementCompoundAdder_W5", + "parameters": {}, + "attributes": {}, + "port_directions": { + "a": "input", + "b": "input", + "subtractIn": "input", + "sum": "output", + "sumP1": "output", + "carryOut": "output", + "carryOutP1": "output", + "sign": "output", + "signP1": "output" + }, + "connections": { + "a": [ + 126, + 127, + 128, + 129, + 130 + ], + "b": [ + 131, + 132, + 133, + 134, + 135 + ], + "subtractIn": [ + 136 + ], + "sum": [ + 137, + 138, + 139, + 140, + 141, + 142 + ], + "sumP1": [ + 143, + 144, + 145, + 146, + 147, + 148 + ], + "carryOut": [ + 149 + ], + "carryOutP1": [ + 150 + ], + "sign": [ + 151 + ], + "signP1": [ + 152 + ] + } + }, + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 6, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 137, + 138, + 139, + 140, + 141, + 142 + ], + "Y": [ + 153, + 154, + 155, + 156, + 157 + ] + } + }, + "bussubset_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 4, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 153, + 154, + 155, + 156, + 157 + ], + "Y": [ + 158 + ] + } + }, + "not__0": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 158 + ], + "Y": [ + 159 + ] + } + }, + "and__3": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 159 + ], + "B": [ + 160 + ], + "Y": [ + 161 + ] + } + }, + "mux_0": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 7 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 161 + ], + "A": [ + 162, + 163, + 164, + 165, + 166, + 167, + 168 + ], + "B": [ + 169, + 170, + 171, + 172, + 173, + 174, + 175 + ], + "Y": [ + 176, + 177, + 178, + 179, + 180, + 181, + 182 + ] + } + }, + "mux_1": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 7 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 183 + ], + "A": [ + 176, + 177, + 178, + 179, + 180, + 181, + 182 + ], + "B": [ + 184, + 185, + 186, + 187, + 188, + 189, + 190 + ], + "Y": [ + 191, + 192, + 193, + 194, + 195, + 196, + 197 + ] + } + }, + "bussubset_1": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 2, + "A_WIDTH": 7, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 191, + 192, + 193, + 194, + 195, + 196, + 197 + ], + "Y": [ + 198 + ] + } + }, + "and__4": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 198 + ], + "B": [ + 199 + ], + "Y": [ + 200 + ] + } + }, + "and__5": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 200 + ], + "B": [ + 201 + ], + "Y": [ + 202 + ] + } + }, + "and__6": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 202 + ], + "B": [ + 203 + ], + "Y": [ + 204 + ] + } + }, + "not__1": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 204 + ], + "Y": [ + 205 + ] + } + }, + "and__7": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 205 + ], + "B": [ + 136 + ], + "Y": [ + 206 + ] + } + }, + "and__8": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 206 + ], + "B": [ + 207 + ], + "Y": [ + 208 + ] + } + }, + "combinational_0": { + "hide_name": 0, + "type": "Combinational", + "parameters": {}, + "attributes": {}, + "port_directions": { + "_in0__incExpRrpath_b_and_effSubtraction_flopped_and_firstZero_rpath": "input", + "_in1_out": "input", + "_in2__effSubtraction_flopped_b_and__incExpRrpath_and_firstZero_rpath_or__incExpRrpath_b_and__firstZero_rpath_b": "input", + "_in3_out": "input", + "_in4__incExpRrpath_and_effSubtraction_flopped_and__firstZero_rpath_b": "input", + "_in5__exponent_flopped_lshift_const_4_h1": "input", + "_in7_exponent_flopped": "input", + "_out8__s": "output" + }, + "connections": { + "_in0__incExpRrpath_b_and_effSubtraction_flopped_and_firstZero_rpath": [ + 208 + ], + "_in1_out": [ + 209, + 210, + 211, + 212 + ], + "_in2__effSubtraction_flopped_b_and__incExpRrpath_and_firstZero_rpath_or__incExpRrpath_b_and__firstZero_rpath_b": [ + 213 + ], + "_in3_out": [ + 214, + 215, + 216, + 217 + ], + "_in4__incExpRrpath_and_effSubtraction_flopped_and__firstZero_rpath_b": [ + 218 + ], + "_in5__exponent_flopped_lshift_const_4_h1": [ + 219, + 220, + 221, + 222 + ], + "_in7_exponent_flopped": [ + 224, + 225, + 226, + 227 + ], + "_out8__s": [ + 67, + 68, + 69, + 70 + ] + } + }, + "equals_0": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 67, + 68, + 69, + 70 + ], + "B": [ + 228, + 229, + 230, + 231 + ], + "Y": [ + 58 + ] + } + }, + "mux_2": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 232 + ], + "A": [ + 55 + ], + "B": [ + 233 + ], + "Y": [ + 77 + ] + } + }, + "flipflop_2": { + "hide_name": 0, + "type": "$dff", + "parameters": { + "WIDTH": 1, + "CLK_POLARITY": 1 + }, + "attributes": {}, + "port_directions": { + "_clk": "input", + "_d": "input", + "_q": "output", + "_en": "input", + "_reset": "input" + }, + "connections": { + "_clk": [ + 2 + ], + "_d": [ + 234 + ], + "_q": [ + 232 + ], + "_en": [ + 4 + ], + "_reset": [ + 3 + ] + } + }, + "npath_significand_sub": { + "hide_name": 0, + "type": "OnesComplementAdder_W5_1", + "parameters": {}, + "attributes": {}, + "port_directions": { + "a": "input", + "b": "input", + "subtractIn": "input", + "sum": "output", + "sign": "output" + }, + "connections": { + "a": [ + 121, + 122, + 123, + 124, + 125 + ], + "b": [ + 235, + 236, + 237, + 238, + 239 + ], + "subtractIn": [ + 110 + ], + "sum": [ + 240, + 241, + 242, + 243, + 244, + 245 + ], + "sign": [ + 234 + ] + } + }, + "rshift": { + "hide_name": 0, + "type": "$shr", + "parameters": { + "A_WIDTH": 5, + "B_WIDTH": 1, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 246, + 247, + 248, + 249, + 250 + ], + "B": [ + 251 + ], + "Y": [ + 235, + 236, + 237, + 238, + 239 + ] + } + }, + "swizzle_0": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 6, + "B_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 252, + 253, + 254, + 255, + 256, + 257 + ], + "B": [ + 246, + 247, + 248, + 249, + 250 + ], + "Y": [ + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268 + ] + } + }, + "rshift_0": { + "hide_name": 0, + "type": "$shr", + "parameters": { + "A_WIDTH": 11, + "B_WIDTH": 5, + "Y_WIDTH": 11 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268 + ], + "B": [ + 269, + 270, + 271, + 272, + 273 + ], + "Y": [ + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284 + ] + } + }, + "bussubset_2": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 6, + "A_WIDTH": 11, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284 + ], + "Y": [ + 285, + 286, + 287, + 288, + 289 + ] + } + }, + "flipflop_3": { + "hide_name": 0, + "type": "$dff", + "parameters": { + "WIDTH": 5, + "CLK_POLARITY": 1 + }, + "attributes": {}, + "port_directions": { + "_clk": "input", + "_d": "input", + "_q": "output", + "_en": "input", + "_reset": "input" + }, + "connections": { + "_clk": [ + 2 + ], + "_d": [ + 285, + 286, + 287, + 288, + 289 + ], + "_q": [ + 131, + 132, + 133, + 134, + 135 + ], + "_en": [ + 4 + ], + "_reset": [ + 3 + ] + } + }, + "flipflop_4": { + "hide_name": 0, + "type": "$dff", + "parameters": { + "WIDTH": 11, + "CLK_POLARITY": 1 + }, + "attributes": {}, + "port_directions": { + "_clk": "input", + "_d": "input", + "_q": "output", + "_en": "input", + "_reset": "input" + }, + "connections": { + "_clk": [ + 2 + ], + "_d": [ + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284 + ], + "_q": [ + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300 + ], + "_en": [ + 4 + ], + "_reset": [ + 3 + ] + } + }, + "bussubset_3": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 11, + "Y_WIDTH": 6 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300 + ], + "Y": [ + 301, + 302, + 303, + 304, + 305, + 306 + ] + } + }, + "not__2": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 6, + "Y_WIDTH": 6 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 301, + 302, + 303, + 304, + 305, + 306 + ], + "Y": [ + 307, + 308, + 309, + 310, + 311, + 312 + ] + } + }, + "mux_3": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 6 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 136 + ], + "A": [ + 301, + 302, + 303, + 304, + 305, + 306 + ], + "B": [ + 307, + 308, + 309, + 310, + 311, + 312 + ], + "Y": [ + 313, + 314, + 315, + 316, + 317, + 318 + ] + } + }, + "rpath_lowadder": { + "hide_name": 0, + "type": "NativeAdder_W6", + "parameters": {}, + "attributes": {}, + "port_directions": { + "a": "input", + "b": "input", + "sum": "output" + }, + "connections": { + "a": [ + 319, + 320, + 321, + 322, + 323, + 324 + ], + "b": [ + 313, + 314, + 315, + 316, + 317, + 318 + ], + "sum": [ + 325, + 326, + 327, + 328, + 329, + 330, + 331 + ] + } + }, + "bussubset_4": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 7, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 325, + 326, + 327, + 328, + 329, + 330, + 331 + ], + "Y": [ + 332, + 333, + 334, + 335 + ] + } + }, + "uor_0": { + "hide_name": 0, + "type": "$reduce_or", + "parameters": { + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 332, + 333, + 334, + 335 + ], + "Y": [ + 336 + ] + } + }, + "or__2": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 337 + ], + "B": [ + 336 + ], + "Y": [ + 338 + ] + } + }, + "swizzle_1": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 338 + ], + "B": [ + 339 + ], + "Y": [ + 340, + 341 + ] + } + }, + "swizzle_2": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 340, + 341 + ], + "B": [ + 153, + 154, + 155, + 156, + 157 + ], + "Y": [ + 162, + 163, + 164, + 165, + 166, + 167, + 168 + ] + } + }, + "swizzle_3": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 340, + 341 + ], + "B": [ + 342, + 343, + 344, + 345, + 346 + ], + "Y": [ + 347, + 348, + 349, + 350, + 351, + 352, + 353 + ] + } + }, + "mux_4": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 7 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 354 + ], + "A": [ + 347, + 348, + 349, + 350, + 351, + 352, + 353 + ], + "B": [ + 355, + 356, + 357, + 358, + 359, + 360, + 361 + ], + "Y": [ + 184, + 185, + 186, + 187, + 188, + 189, + 190 + ] + } + }, + "equals_1": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 354 + ], + "B": [ + 362 + ], + "Y": [ + 203 + ] + } + }, + "mux_5": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 183 + ], + "A": [ + 161 + ], + "B": [ + 354 + ], + "Y": [ + 363 + ] + } + }, + "lshift": { + "hide_name": 0, + "type": "$shl", + "parameters": { + "A_WIDTH": 5, + "B_WIDTH": 1, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 364, + 365, + 366, + 367, + 368 + ], + "B": [ + 363 + ], + "Y": [ + 369, + 370, + 371, + 372, + 373 + ] + } + }, + "bussubset_5": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 1, + "A_WIDTH": 5, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 369, + 370, + 371, + 372, + 373 + ], + "Y": [ + 374, + 375, + 376 + ] + } + }, + "mux_6": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 377 + ], + "A": [ + 374, + 375, + 376 + ], + "B": [ + 378, + 379, + 380 + ], + "Y": [ + 71, + 72, + 73 + ] + } + }, + "and__9": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 381 + ], + "B": [ + 382 + ], + "Y": [ + 377 + ] + } + }, + "and__10": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 381 + ], + "B": [ + 383 + ], + "Y": [ + 384 + ] + } + }, + "mux_7": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 384 + ], + "A": [ + 385, + 386, + 387 + ], + "B": [ + 388, + 389, + 390 + ], + "Y": [ + 82, + 83, + 84 + ] + } + }, + "mux_8": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 391 + ], + "A": [ + 392, + 393, + 394 + ], + "B": [ + 395, + 396, + 397 + ], + "Y": [ + 385, + 386, + 387 + ] + } + }, + "or__3": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 398 + ], + "B": [ + 399 + ], + "Y": [ + 391 + ] + } + }, + "or__4": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 398 + ], + "B": [ + 399 + ], + "Y": [ + 160 + ] + } + }, + "or__5": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 398 + ], + "B": [ + 399 + ], + "Y": [ + 400 + ] + } + }, + "and__11": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 401 + ], + "B": [ + 400 + ], + "Y": [ + 354 + ] + } + }, + "not__3": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 402 + ], + "Y": [ + 401 + ] + } + }, + "bussubset_6": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 4, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 342, + 343, + 344, + 345, + 346 + ], + "Y": [ + 402 + ] + } + }, + "swizzle_4": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 3, + "B_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 403, + 404, + 405 + ], + "B": [ + 342, + 343, + 344, + 345, + 346 + ], + "Y": [ + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413 + ] + } + }, + "bussubset_7": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 8, + "Y_WIDTH": 7 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413 + ], + "Y": [ + 355, + 356, + 357, + 358, + 359, + 360, + 361 + ] + } + }, + "bussubset_8": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 2, + "A_WIDTH": 3, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 403, + 404, + 405 + ], + "Y": [ + 339 + ] + } + }, + "swizzle_5": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 3, + "B_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 403, + 404, + 405 + ], + "B": [ + 153, + 154, + 155, + 156, + 157 + ], + "Y": [ + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421 + ] + } + }, + "bussubset_9": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 8, + "Y_WIDTH": 7 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421 + ], + "Y": [ + 169, + 170, + 171, + 172, + 173, + 174, + 175 + ] + } + }, + "swizzle_6": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 2 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 336 + ], + "B": [ + 422, + 423 + ], + "Y": [ + 403, + 404, + 405 + ] + } + }, + "bussubset_10": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 4, + "A_WIDTH": 7, + "Y_WIDTH": 2 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 325, + 326, + 327, + 328, + 329, + 330, + 331 + ], + "Y": [ + 422, + 423 + ] + } + }, + "bussubset_11": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 4, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 342, + 343, + 344, + 345, + 346 + ], + "Y": [ + 424 + ] + } + }, + "not__4": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 424 + ], + "Y": [ + 425 + ] + } + }, + "mux_9": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 183 + ], + "A": [ + 426 + ], + "B": [ + 425 + ], + "Y": [ + 207 + ] + } + }, + "and__12": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 204 + ], + "B": [ + 207 + ], + "Y": [ + 427 + ] + } + }, + "or__6": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 427 + ], + "B": [ + 428 + ], + "Y": [ + 429 + ] + } + }, + "and__13": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 430 + ], + "B": [ + 429 + ], + "Y": [ + 213 + ] + } + }, + "not__5": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 136 + ], + "Y": [ + 430 + ] + } + }, + "and__14": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 204 + ], + "B": [ + 136 + ], + "Y": [ + 431 + ] + } + }, + "and__15": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 431 + ], + "B": [ + 432 + ], + "Y": [ + 218 + ] + } + }, + "not__6": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 207 + ], + "Y": [ + 432 + ] + } + }, + "not__7": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 136 + ], + "Y": [ + 433 + ] + } + }, + "or__7": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 434 + ], + "B": [ + 433 + ], + "Y": [ + 57 + ] + } + }, + "greaterThanOrEqual": { + "hide_name": 0, + "type": "$ge", + "parameters": { + "A_WIDTH": 5, + "B_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 435, + 436, + 437, + 438, + 439 + ], + "B": [ + 440, + 441, + 442, + 443, + 444 + ], + "Y": [ + 434 + ] + } + }, + "flipflop_5": { + "hide_name": 0, + "type": "$dff", + "parameters": { + "WIDTH": 5, + "CLK_POLARITY": 1 + }, + "attributes": {}, + "port_directions": { + "_clk": "input", + "_d": "input", + "_q": "output", + "_en": "input", + "_reset": "input" + }, + "connections": { + "_clk": [ + 2 + ], + "_d": [ + 269, + 270, + 271, + 272, + 273 + ], + "_q": [ + 435, + 436, + 437, + 438, + 439 + ], + "_en": [ + 4 + ], + "_reset": [ + 3 + ] + } + }, + "exponent_sub": { + "hide_name": 0, + "type": "OnesComplementAdder_W4_0", + "parameters": {}, + "attributes": {}, + "port_directions": { + "a": "input", + "b": "input", + "sum": "output", + "sign": "output" + }, + "connections": { + "a": [ + 92, + 93, + 94, + 95 + ], + "b": [ + 445, + 446, + 447, + 448 + ], + "sum": [ + 269, + 270, + 271, + 272, + 273 + ], + "sign": [ + 449 + ] + } + }, + "uor_1": { + "hide_name": 0, + "type": "$reduce_or", + "parameters": { + "A_WIDTH": 3, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 450, + 451, + 452 + ], + "Y": [ + 453 + ] + } + }, + "not__8": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 453 + ], + "Y": [ + 454 + ] + } + }, + "and__16": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 455 + ], + "B": [ + 454 + ], + "Y": [ + 107 + ] + } + }, + "or__8": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 456 + ], + "B": [ + 457 + ], + "Y": [ + 455 + ] + } + }, + "or__9": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 458 + ], + "B": [ + 459 + ], + "Y": [ + 456 + ] + } + }, + "equals_2": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 445, + 446, + 447, + 448 + ], + "B": [ + 460, + 461, + 462, + 463 + ], + "Y": [ + 459 + ] + } + }, + "equals_3": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 445, + 446, + 447, + 448 + ], + "B": [ + 464, + 465, + 466, + 467 + ], + "Y": [ + 457 + ] + } + }, + "uor_2": { + "hide_name": 0, + "type": "$reduce_or", + "parameters": { + "A_WIDTH": 3, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 450, + 451, + 452 + ], + "Y": [ + 468 + ] + } + }, + "and__17": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 469 + ], + "B": [ + 468 + ], + "Y": [ + 89 + ] + } + }, + "equals_4": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 445, + 446, + 447, + 448 + ], + "B": [ + 470, + 471, + 472, + 473 + ], + "Y": [ + 469 + ] + } + }, + "swizzle_7": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 3, + "IN1_WIDTH": 4, + "IN2_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "[2:0]": "input", + "[6:3]": "input", + "[7]": "input", + "Y": "output" + }, + "connections": { + "[2:0]": [ + 450, + 451, + 452 + ], + "[6:3]": [ + 445, + 446, + 447, + 448 + ], + "[7]": [ + 474 + ], + "Y": [ + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482 + ] + } + }, + "floating_point_conditional_swap": { + "hide_name": 0, + "type": "FloatingPointSwap_W8", + "parameters": {}, + "attributes": {}, + "port_directions": { + "a": "input", + "b": "input", + "swap": "input", + "outA": "output", + "outB": "output" + }, + "connections": { + "a": [ + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490 + ], + "b": [ + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482 + ], + "swap": [ + 449 + ], + "outA": [ + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498 + ], + "outB": [ + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506 + ] + } + }, + "bussubset_12": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 8, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498 + ], + "Y": [ + 507, + 508, + 509 + ] + } + }, + "bussubset_13": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 8, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498 + ], + "Y": [ + 510, + 511, + 512, + 513 + ] + } + }, + "notEquals": { + "hide_name": 0, + "type": "$ne", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 510, + 511, + 512, + 513 + ], + "B": [ + 514, + 515, + 516, + 517 + ], + "Y": [ + 518 + ] + } + }, + "not__9": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 518 + ], + "Y": [ + 519 + ] + } + }, + "xor_": { + "hide_name": 0, + "type": "$xor", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 519 + ], + "B": [ + 520 + ], + "Y": [ + 521 + ] + } + }, + "mux_10": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 521 + ], + "A": [ + 522, + 523, + 524, + 525 + ], + "B": [ + 526, + 527, + 528, + 529 + ], + "Y": [ + 530, + 531, + 532, + 533 + ] + } + }, + "swizzle_8": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 530, + 531, + 532, + 533 + ], + "B": [ + 534 + ], + "Y": [ + 535, + 536, + 537, + 538, + 539 + ] + } + }, + "lshift_0": { + "hide_name": 0, + "type": "$shl", + "parameters": { + "A_WIDTH": 5, + "B_WIDTH": 5, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 535, + 536, + 537, + 538, + 539 + ], + "B": [ + 748, + 749, + 750, + 751, + 752 + ], + "Y": [ + 116, + 117, + 118, + 119, + 120 + ] + } + }, + "swizzle_9": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 530, + 531, + 532, + 533 + ], + "B": [ + 545 + ], + "Y": [ + 111, + 112, + 113, + 114, + 115 + ] + } + }, + "mux_11": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 518 + ], + "A": [ + 546, + 547, + 548, + 549 + ], + "B": [ + 550, + 551, + 552, + 553 + ], + "Y": [ + 522, + 523, + 524, + 525 + ] + } + }, + "swizzle_10": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 554, + 555 + ], + "B": [ + 556, + 557 + ], + "Y": [ + 546, + 547, + 548, + 549 + ] + } + }, + "bussubset_14": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 3, + "Y_WIDTH": 2 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 507, + 508, + 509 + ], + "Y": [ + 556, + 557 + ] + } + }, + "swizzle_11": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 3, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 507, + 508, + 509 + ], + "B": [ + 558 + ], + "Y": [ + 550, + 551, + 552, + 553 + ] + } + }, + "swizzle_12": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 559 + ], + "B": [ + 507, + 508, + 509 + ], + "Y": [ + 526, + 527, + 528, + 529 + ] + } + }, + "flipflop_6": { + "hide_name": 0, + "type": "$dff", + "parameters": { + "WIDTH": 4, + "CLK_POLARITY": 1 + }, + "attributes": {}, + "port_directions": { + "_clk": "input", + "_d": "input", + "_q": "output", + "_en": "input", + "_reset": "input" + }, + "connections": { + "_clk": [ + 2 + ], + "_d": [ + 510, + 511, + 512, + 513 + ], + "_q": [ + 224, + 225, + 226, + 227 + ], + "_en": [ + 4 + ], + "_reset": [ + 3 + ] + } + }, + "expDecrement": { + "hide_name": 0, + "type": "ParallelPrefixDecr_W4", + "parameters": {}, + "attributes": {}, + "port_directions": { + "inp": "input", + "out": "output" + }, + "connections": { + "inp": [ + 224, + 225, + 226, + 227 + ], + "out": [ + 209, + 210, + 211, + 212 + ] + } + }, + "mux_12": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 560 + ], + "A": [ + 209, + 210, + 211, + 212 + ], + "B": [ + 561, + 562, + 563, + 564 + ], + "Y": [ + 565, + 566, + 567, + 568 + ] + } + }, + "lshift_1": { + "hide_name": 0, + "type": "$shl", + "parameters": { + "A_WIDTH": 5, + "B_WIDTH": 4, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 569, + 570, + 571, + 572, + 573 + ], + "B": [ + 565, + 566, + 567, + 568 + ], + "Y": [ + 574, + 575, + 576, + 577, + 578 + ] + } + }, + "bussubset_15": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 1, + "A_WIDTH": 5, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 574, + 575, + 576, + 577, + 578 + ], + "Y": [ + 395, + 396, + 397 + ] + } + }, + "bussubset_16": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 4, + "A_WIDTH": 5, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 569, + 570, + 571, + 572, + 573 + ], + "Y": [ + 579, + 580, + 581, + 582, + 583 + ] + } + }, + "npath_leadingOne": { + "hide_name": 0, + "type": "RecursiveModulePriorityEncoder_W5", + "parameters": {}, + "attributes": {}, + "port_directions": { + "inp": "input", + "valid": "output", + "out": "output" + }, + "connections": { + "inp": [ + 579, + 580, + 581, + 582, + 583 + ], + "valid": [ + 584 + ], + "out": [ + 585, + 586, + 587 + ] + } + }, + "and__18": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 588 + ], + "B": [ + 584 + ], + "Y": [ + 589 + ] + } + }, + "mux_13": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 589 + ], + "A": [ + 590, + 591, + 592, + 593 + ], + "B": [ + 594, + 595, + 596, + 597 + ], + "Y": [ + 78, + 79, + 80, + 81 + ] + } + }, + "equals_5": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 78, + 79, + 80, + 81 + ], + "B": [ + 228, + 229, + 230, + 231 + ], + "Y": [ + 75 + ] + } + }, + "uor_3": { + "hide_name": 0, + "type": "$reduce_or", + "parameters": { + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 78, + 79, + 80, + 81 + ], + "Y": [ + 598 + ] + } + }, + "not__10": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 598 + ], + "Y": [ + 383 + ] + } + }, + "uor_4": { + "hide_name": 0, + "type": "$reduce_or", + "parameters": { + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 594, + 595, + 596, + 597 + ], + "Y": [ + 599 + ] + } + }, + "and__19": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 599 + ], + "B": [ + 600 + ], + "Y": [ + 588 + ] + } + }, + "not__11": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 601 + ], + "Y": [ + 600 + ] + } + }, + "npath_expcalc": { + "hide_name": 0, + "type": "OnesComplementAdder_W4", + "parameters": {}, + "attributes": {}, + "port_directions": { + "a": "input", + "b": "input", + "subtractIn": "input", + "sum": "output", + "sign": "output" + }, + "connections": { + "a": [ + 224, + 225, + 226, + 227 + ], + "b": [ + 602, + 603, + 604, + 605 + ], + "subtractIn": [ + 606 + ], + "sum": [ + 607, + 608, + 609, + 610, + 611 + ], + "sign": [ + 601 + ] + } + }, + "swizzle_13": { + "hide_name": 0, + "type": "$buf", + "parameters": { + "WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 561, + 562, + 563, + 564 + ], + "Y": [ + 602, + 603, + 604, + 605 + ] + } + }, + "uor_5": { + "hide_name": 0, + "type": "$reduce_or", + "parameters": { + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 561, + 562, + 563, + 564 + ], + "Y": [ + 612 + ] + } + }, + "not__12": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 612 + ], + "Y": [ + 613 + ] + } + }, + "or__10": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 613 + ], + "B": [ + 614 + ], + "Y": [ + 615 + ] + } + }, + "or__11": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 589 + ], + "B": [ + 615 + ], + "Y": [ + 560 + ] + } + }, + "not__13": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 616 + ], + "Y": [ + 614 + ] + } + }, + "uor_6": { + "hide_name": 0, + "type": "$reduce_or", + "parameters": { + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 224, + 225, + 226, + 227 + ], + "Y": [ + 616 + ] + } + }, + "swizzle_14": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 3, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 585, + 586, + 587 + ], + "B": [ + 617 + ], + "Y": [ + 561, + 562, + 563, + 564 + ] + } + }, + "bussubset_17": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 5, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 607, + 608, + 609, + 610, + 611 + ], + "Y": [ + 594, + 595, + 596, + 597 + ] + } + }, + "bussubset_18": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 2, + "A_WIDTH": 5, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 569, + 570, + 571, + 572, + 573 + ], + "Y": [ + 392, + 393, + 394 + ] + } + }, + "flipflop_7": { + "hide_name": 0, + "type": "$dff", + "parameters": { + "WIDTH": 5, + "CLK_POLARITY": 1 + }, + "attributes": {}, + "port_directions": { + "_clk": "input", + "_d": "input", + "_q": "output", + "_en": "input", + "_reset": "input" + }, + "connections": { + "_clk": [ + 2 + ], + "_d": [ + 618, + 619, + 620, + 621, + 622 + ], + "_q": [ + 569, + 570, + 571, + 572, + 573 + ], + "_en": [ + 4 + ], + "_reset": [ + 3 + ] + } + }, + "bussubset_19": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 6, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 240, + 241, + 242, + 243, + 244, + 245 + ], + "Y": [ + 618, + 619, + 620, + 621, + 622 + ] + } + }, + "expIncrement": { + "hide_name": 0, + "type": "ParallelPrefixIncr_W4", + "parameters": {}, + "attributes": {}, + "port_directions": { + "inp": "input", + "out": "output" + }, + "connections": { + "inp": [ + 224, + 225, + 226, + 227 + ], + "out": [ + 214, + 215, + 216, + 217 + ] + } + }, + "lshift_2": { + "hide_name": 0, + "type": "$shl", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 4, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 224, + 225, + 226, + 227 + ], + "B": [ + 753, + 754, + 755, + 756 + ], + "Y": [ + 219, + 220, + 221, + 222 + ] + } + }, + "bussubset_20": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 7, + "A_WIDTH": 8, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498 + ], + "Y": [ + 627 + ] + } + }, + "flipflop_8": { + "hide_name": 0, + "type": "$dff", + "parameters": { + "WIDTH": 1, + "CLK_POLARITY": 1 + }, + "attributes": {}, + "port_directions": { + "_clk": "input", + "_d": "input", + "_q": "output", + "_en": "input", + "_reset": "input" + }, + "connections": { + "_clk": [ + 2 + ], + "_d": [ + 627 + ], + "_q": [ + 55 + ], + "_en": [ + 4 + ], + "_reset": [ + 3 + ] + } + }, + "bussubset_21": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 8, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506 + ], + "Y": [ + 628, + 629, + 630 + ] + } + }, + "bussubset_22": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 8, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506 + ], + "Y": [ + 631, + 632, + 633, + 634 + ] + } + }, + "notEquals_0": { + "hide_name": 0, + "type": "$ne", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 631, + 632, + 633, + 634 + ], + "B": [ + 635, + 636, + 637, + 638 + ], + "Y": [ + 639 + ] + } + }, + "not__14": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 639 + ], + "Y": [ + 640 + ] + } + }, + "xor__0": { + "hide_name": 0, + "type": "$xor", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 640 + ], + "B": [ + 641 + ], + "Y": [ + 642 + ] + } + }, + "mux_14": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 642 + ], + "A": [ + 643, + 644, + 645, + 646 + ], + "B": [ + 647, + 648, + 649, + 650 + ], + "Y": [ + 651, + 652, + 653, + 654 + ] + } + }, + "swizzle_15": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 651, + 652, + 653, + 654 + ], + "B": [ + 655 + ], + "Y": [ + 656, + 657, + 658, + 659, + 660 + ] + } + }, + "lshift_3": { + "hide_name": 0, + "type": "$shl", + "parameters": { + "A_WIDTH": 5, + "B_WIDTH": 5, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 656, + 657, + 658, + 659, + 660 + ], + "B": [ + 757, + 758, + 759, + 760, + 761 + ], + "Y": [ + 666, + 667, + 668, + 669, + 670 + ] + } + }, + "mux_15": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 110 + ], + "A": [ + 671, + 672, + 673, + 674, + 675 + ], + "B": [ + 666, + 667, + 668, + 669, + 670 + ], + "Y": [ + 246, + 247, + 248, + 249, + 250 + ] + } + }, + "swizzle_16": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 651, + 652, + 653, + 654 + ], + "B": [ + 676 + ], + "Y": [ + 671, + 672, + 673, + 674, + 675 + ] + } + }, + "mux_16": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 639 + ], + "A": [ + 677, + 678, + 679, + 680 + ], + "B": [ + 681, + 682, + 683, + 684 + ], + "Y": [ + 643, + 644, + 645, + 646 + ] + } + }, + "swizzle_17": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 2, + "B_WIDTH": 2 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 685, + 686 + ], + "B": [ + 687, + 688 + ], + "Y": [ + 677, + 678, + 679, + 680 + ] + } + }, + "bussubset_23": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 3, + "Y_WIDTH": 2 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 628, + 629, + 630 + ], + "Y": [ + 687, + 688 + ] + } + }, + "swizzle_18": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 3, + "B_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 628, + 629, + 630 + ], + "B": [ + 689 + ], + "Y": [ + 681, + 682, + 683, + 684 + ] + } + }, + "swizzle_19": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 690 + ], + "B": [ + 628, + 629, + 630 + ], + "Y": [ + 647, + 648, + 649, + 650 + ] + } + }, + "bussubset_24": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 7, + "A_WIDTH": 8, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506 + ], + "Y": [ + 691 + ] + } + }, + "flipflop_9": { + "hide_name": 0, + "type": "$dff", + "parameters": { + "WIDTH": 1, + "CLK_POLARITY": 1 + }, + "attributes": {}, + "port_directions": { + "_clk": "input", + "_d": "input", + "_q": "output", + "_en": "input", + "_reset": "input" + }, + "connections": { + "_clk": [ + 2 + ], + "_d": [ + 691 + ], + "_q": [ + 233 + ], + "_en": [ + 4 + ], + "_reset": [ + 3 + ] + } + }, + "swizzle_20": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 3, + "IN1_WIDTH": 4, + "IN2_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "[2:0]": "input", + "[6:3]": "input", + "[7]": "input", + "Y": "output" + }, + "connections": { + "[2:0]": [ + 100, + 101, + 102 + ], + "[6:3]": [ + 92, + 93, + 94, + 95 + ], + "[7]": [ + 692 + ], + "Y": [ + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490 + ] + } + }, + "xor__1": { + "hide_name": 0, + "type": "$xor", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 692 + ], + "B": [ + 474 + ], + "Y": [ + 693 + ] + } + }, + "xor__2": { + "hide_name": 0, + "type": "$xor", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 693 + ], + "B": [ + 694 + ], + "Y": [ + 110 + ] + } + }, + "bussubset_25": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 7, + "A_WIDTH": 8, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20 + ], + "Y": [ + 474 + ] + } + }, + "bussubset_26": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 7, + "A_WIDTH": 8, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12 + ], + "Y": [ + 692 + ] + } + }, + "bussubset_27": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 8, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20 + ], + "Y": [ + 450, + 451, + 452 + ] + } + }, + "notEquals_1": { + "hide_name": 0, + "type": "$ne", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 445, + 446, + 447, + 448 + ], + "B": [ + 695, + 696, + 697, + 698 + ], + "Y": [ + 699 + ] + } + }, + "flipflop_10": { + "hide_name": 0, + "type": "$dff", + "parameters": { + "WIDTH": 1, + "CLK_POLARITY": 1 + }, + "attributes": {}, + "port_directions": { + "_clk": "input", + "_d": "input", + "_q": "output", + "_en": "input", + "_reset": "input" + }, + "connections": { + "_clk": [ + 2 + ], + "_d": [ + 699 + ], + "_q": [ + 399 + ], + "_en": [ + 4 + ], + "_reset": [ + 3 + ] + } + }, + "bussubset_28": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 445, + 446, + 447, + 448 + ], + "Y": [ + 700 + ] + } + }, + "xor__3": { + "hide_name": 0, + "type": "$xor", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 701 + ], + "B": [ + 700 + ], + "Y": [ + 251 + ] + } + }, + "bussubset_29": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 92, + 93, + 94, + 95 + ], + "Y": [ + 701 + ] + } + }, + "bussubset_30": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 8, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20 + ], + "Y": [ + 445, + 446, + 447, + 448 + ] + } + }, + "flipflop_11": { + "hide_name": 0, + "type": "$dff", + "parameters": { + "WIDTH": 1, + "CLK_POLARITY": 1 + }, + "attributes": {}, + "port_directions": { + "_clk": "input", + "_d": "input", + "_q": "output", + "_en": "input", + "_reset": "input" + }, + "connections": { + "_clk": [ + 2 + ], + "_d": [ + 110 + ], + "_q": [ + 136 + ], + "_en": [ + 4 + ], + "_reset": [ + 3 + ] + } + }, + "and__20": { + "hide_name": 0, + "type": "$and", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 702 + ], + "B": [ + 703 + ], + "Y": [ + 428 + ] + } + }, + "not__15": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 204 + ], + "Y": [ + 702 + ] + } + }, + "not__16": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 207 + ], + "Y": [ + 703 + ] + } + }, + "mux_17": { + "hide_name": 0, + "type": "$mux", + "parameters": { + "WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "S": "input", + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "S": [ + 183 + ], + "A": [ + 153, + 154, + 155, + 156, + 157 + ], + "B": [ + 342, + 343, + 344, + 345, + 346 + ], + "Y": [ + 704, + 705, + 706, + 707, + 708 + ] + } + }, + "add": { + "hide_name": 0, + "type": "$add", + "parameters": { + "A_WIDTH": 5, + "B_WIDTH": 5, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output", + "CO": "output" + }, + "connections": { + "A": [ + 704, + 705, + 706, + 707, + 708 + ], + "B": [ + 709, + 710, + 711, + 712, + 713 + ], + "Y": [ + 364, + 365, + 366, + 367, + 368 + ], + "CO": [ + 714 + ] + } + }, + "swizzle_21": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 200 + ], + "B": [ + 715, + 716, + 717, + 718 + ], + "Y": [ + 709, + 710, + 711, + 712, + 713 + ] + } + }, + "bussubset_31": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 6, + "A_WIDTH": 7, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 325, + 326, + 327, + 328, + 329, + 330, + 331 + ], + "Y": [ + 183 + ] + } + }, + "not__17": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 719 + ], + "Y": [ + 426 + ] + } + }, + "bussubset_32": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 4, + "A_WIDTH": 5, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 153, + 154, + 155, + 156, + 157 + ], + "Y": [ + 719 + ] + } + }, + "bussubset_33": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 6, + "Y_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 143, + 144, + 145, + 146, + 147, + 148 + ], + "Y": [ + 342, + 343, + 344, + 345, + 346 + ] + } + }, + "flipflop_12": { + "hide_name": 0, + "type": "$dff", + "parameters": { + "WIDTH": 1, + "CLK_POLARITY": 1 + }, + "attributes": {}, + "port_directions": { + "_clk": "input", + "_d": "input", + "_q": "output", + "_en": "input", + "_reset": "input" + }, + "connections": { + "_clk": [ + 2 + ], + "_d": [ + 720 + ], + "_q": [ + 398 + ], + "_en": [ + 4 + ], + "_reset": [ + 3 + ] + } + }, + "notEquals_2": { + "hide_name": 0, + "type": "$ne", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 92, + 93, + 94, + 95 + ], + "B": [ + 721, + 722, + 723, + 724 + ], + "Y": [ + 720 + ] + } + }, + "not__18": { + "hide_name": 0, + "type": "$not", + "parameters": { + "A_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 725 + ], + "Y": [ + 382 + ] + } + }, + "uor_7": { + "hide_name": 0, + "type": "$reduce_or", + "parameters": { + "A_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 67, + 68, + 69, + 70 + ], + "Y": [ + 725 + ] + } + }, + "bussubset_34": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 4, + "A_WIDTH": 7, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 325, + 326, + 327, + 328, + 329, + 330, + 331 + ], + "Y": [ + 337 + ] + } + }, + "swizzle_22": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 5 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 149 + ], + "B": [ + 726, + 727, + 728, + 729, + 730 + ], + "Y": [ + 319, + 320, + 321, + 322, + 323, + 324 + ] + } + }, + "equals_6": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 161 + ], + "B": [ + 731 + ], + "Y": [ + 201 + ] + } + }, + "or__12": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 732 + ], + "B": [ + 733 + ], + "Y": [ + 199 + ] + } + }, + "or__13": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 734 + ], + "B": [ + 735 + ], + "Y": [ + 732 + ] + } + }, + "bussubset_35": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 7, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 191, + 192, + 193, + 194, + 195, + 196, + 197 + ], + "Y": [ + 734 + ] + } + }, + "bussubset_36": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 1, + "A_WIDTH": 7, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 191, + 192, + 193, + 194, + 195, + 196, + 197 + ], + "Y": [ + 735 + ] + } + }, + "bussubset_37": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 7, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 191, + 192, + 193, + 194, + 195, + 196, + 197 + ], + "Y": [ + 733 + ] + } + }, + "or__14": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 736 + ], + "B": [ + 737 + ], + "Y": [ + 105 + ] + } + }, + "or__15": { + "hide_name": 0, + "type": "$or", + "parameters": { + "A_WIDTH": 1, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 738 + ], + "B": [ + 739 + ], + "Y": [ + 736 + ] + } + }, + "equals_7": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 92, + 93, + 94, + 95 + ], + "B": [ + 740, + 741, + 742, + 743 + ], + "Y": [ + 739 + ] + } + }, + "equals_8": { + "hide_name": 0, + "type": "$eq", + "parameters": { + "A_WIDTH": 4, + "B_WIDTH": 4, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ + 92, + 93, + 94, + 95 + ], + "B": [ + 744, + 745, + 746, + 747 + ], + "Y": [ + 737 + ] + } + }, + "uor_8": { + "hide_name": 0, + "type": "$reduce_or", + "parameters": { + "A_WIDTH": 3, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 100, + 101, + 102 + ], + "Y": [ + 91 + ] + } + }, + "bussubset_38": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 8, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12 + ], + "Y": [ + 100, + 101, + 102 + ] + } + }, + "bussubset_39": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 8, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12 + ], + "Y": [ + 92, + 93, + 94, + 95 + ] + } + }, + "const_0_4_hf": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'hf": "output" + }, + "connections": { + "4'hf": [ + 96, + 97, + 98, + 99 + ] + } + }, + "const_1_4_hf": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'hf": "output" + }, + "connections": { + "4'hf": [ + 228, + 229, + 230, + 231 + ] + } + }, + "const_2_6_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "6'h0": "output" + }, + "connections": { + "6'h0": [ + 252, + 253, + 254, + 255, + 256, + 257 + ] + } + }, + "const_3_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 362 + ] + } + }, + "const_4_3_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "3'h0": "output" + }, + "connections": { + "3'h0": [ + 378, + 379, + 380 + ] + } + }, + "const_5_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 381 + ] + } + }, + "const_6_3_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "3'h0": "output" + }, + "connections": { + "3'h0": [ + 388, + 389, + 390 + ] + } + }, + "const_7_5_h2": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "5'h2": "output" + }, + "connections": { + "5'h2": [ + 440, + 441, + 442, + 443, + 444 + ] + } + }, + "const_8_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 458 + ] + } + }, + "const_9_4_hf": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'hf": "output" + }, + "connections": { + "4'hf": [ + 460, + 461, + 462, + 463 + ] + } + }, + "const_10_4_hf": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'hf": "output" + }, + "connections": { + "4'hf": [ + 464, + 465, + 466, + 467 + ] + } + }, + "const_11_4_hf": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'hf": "output" + }, + "connections": { + "4'hf": [ + 470, + 471, + 472, + 473 + ] + } + }, + "const_12_4_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'h0": "output" + }, + "connections": { + "4'h0": [ + 514, + 515, + 516, + 517 + ] + } + }, + "const_13_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 520 + ] + } + }, + "const_14_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 534 + ] + } + }, + "const_15_5_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "5'h1": "output" + }, + "connections": { + "5'h1": [ + 748, + 749, + 750, + 751, + 752 + ] + } + }, + "const_16_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 545 + ] + } + }, + "const_17_2_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h0": "output" + }, + "connections": { + "2'h0": [ + 554, + 555 + ] + } + }, + "const_18_1_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h1": "output" + }, + "connections": { + "1'h1": [ + 558 + ] + } + }, + "const_19_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 559 + ] + } + }, + "const_20_4_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'h0": "output" + }, + "connections": { + "4'h0": [ + 590, + 591, + 592, + 593 + ] + } + }, + "const_21_1_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h1": "output" + }, + "connections": { + "1'h1": [ + 606 + ] + } + }, + "const_22_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 617 + ] + } + }, + "const_23_4_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'h1": "output" + }, + "connections": { + "4'h1": [ + 753, + 754, + 755, + 756 + ] + } + }, + "const_24_4_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'h0": "output" + }, + "connections": { + "4'h0": [ + 635, + 636, + 637, + 638 + ] + } + }, + "const_25_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 641 + ] + } + }, + "const_26_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 655 + ] + } + }, + "const_27_5_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "5'h1": "output" + }, + "connections": { + "5'h1": [ + 757, + 758, + 759, + 760, + 761 + ] + } + }, + "const_28_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 676 + ] + } + }, + "const_29_2_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "2'h0": "output" + }, + "connections": { + "2'h0": [ + 685, + 686 + ] + } + }, + "const_30_1_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h1": "output" + }, + "connections": { + "1'h1": [ + 689 + ] + } + }, + "const_31_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 690 + ] + } + }, + "const_32_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 694 + ] + } + }, + "const_33_4_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'h0": "output" + }, + "connections": { + "4'h0": [ + 695, + 696, + 697, + 698 + ] + } + }, + "const_34_4_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'h0": "output" + }, + "connections": { + "4'h0": [ + 715, + 716, + 717, + 718 + ] + } + }, + "const_35_4_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'h0": "output" + }, + "connections": { + "4'h0": [ + 721, + 722, + 723, + 724 + ] + } + }, + "const_36_5_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "5'h0": "output" + }, + "connections": { + "5'h0": [ + 726, + 727, + 728, + 729, + 730 + ] + } + }, + "const_37_1_h1": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h1": "output" + }, + "connections": { + "1'h1": [ + 731 + ] + } + }, + "const_38_1_h0": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "1'h0": "output" + }, + "connections": { + "1'h0": [ + 738 + ] + } + }, + "const_39_4_hf": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'hf": "output" + }, + "connections": { + "4'hf": [ + 740, + 741, + 742, + 743 + ] + } + }, + "const_40_4_hf": { + "hide_name": 0, + "type": "$const", + "parameters": {}, + "attributes": {}, + "port_directions": { + "4'hf": "output" + }, + "connections": { + "4'hf": [ + 744, + 745, + 746, + 747 + ] + } + } + }, + "netnames": { + "clk": { + "bits": [ + 2 + ], + "attributes": {} + }, + "reset": { + "bits": [ + 3 + ], + "attributes": {} + }, + "enable": { + "bits": [ + 4 + ], + "attributes": {} + }, + "a": { + "bits": [ + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12 + ], + "attributes": {} + }, + "b": { + "bits": [ + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20 + ], + "attributes": {} + }, + "sum": { + "bits": [ + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28 + ], + "attributes": {} + }, + "outSum_mantissa": { + "bits": [ + 29, + 30, + 31 + ], + "attributes": {} + }, + "outSum_exponent": { + "bits": [ + 32, + 33, + 34, + 35 + ], + "attributes": {} + }, + "outSum_sign": { + "bits": [ + 36 + ], + "attributes": {} + }, + "isNaN_flopped": { + "bits": [ + 37 + ], + "attributes": {} + }, + "isInf_flopped": { + "bits": [ + 47 + ], + "attributes": {} + }, + "sign_flopped": { + "bits": [ + 55 + ], + "attributes": {} + }, + "isR": { + "bits": [ + 57 + ], + "attributes": {} + }, + "realIsInfRPath": { + "bits": [ + 58 + ], + "attributes": {} + }, + "_s": { + "bits": [ + 67, + 68, + 69, + 70 + ], + "attributes": {} + }, + "_in18__out": { + "bits": [ + 71, + 72, + 73 + ], + "attributes": {} + }, + "realIsInfNPath": { + "bits": [ + 75 + ], + "attributes": {} + }, + "signNpath": { + "bits": [ + 77 + ], + "attributes": {} + }, + "exponentNpath": { + "bits": [ + 78, + 79, + 80, + 81 + ], + "attributes": {} + }, + "_in24__out": { + "bits": [ + 82, + 83, + 84 + ], + "attributes": {} + }, + "isNaN": { + "bits": [ + 85 + ], + "attributes": {} + }, + "_in0__exponent_equals_const_4_hf_and_isNaN_a_or__exponent_equals_const_4_hf_and_isNaN_b": { + "bits": [ + 86 + ], + "attributes": {} + }, + "_in1__isAnInfinity_a_and_isAnInfinity_b_and_effSubtraction": { + "bits": [ + 87 + ], + "attributes": {} + }, + "_in0__exponent_equals_const_4_hf_and_isNaN_a": { + "bits": [ + 88 + ], + "attributes": {} + }, + "_in1__exponent_equals_const_4_hf_and_isNaN_b": { + "bits": [ + 89 + ], + "attributes": {} + }, + "_in0__exponent_equals_const_4_hf": { + "bits": [ + 90 + ], + "attributes": {} + }, + "isNaN_a": { + "bits": [ + 91 + ], + "attributes": {} + }, + "a_exponent": { + "bits": [ + 92, + 93, + 94, + 95 + ], + "attributes": {} + }, + "a_mantissa": { + "bits": [ + 100, + 101, + 102 + ], + "attributes": {} + }, + "_uor_mantissa": { + "bits": [ + 103 + ], + "attributes": {} + }, + "_in1__uor_mantissa_b": { + "bits": [ + 104 + ], + "attributes": {} + }, + "_in0__const_0_or__exponent_equals_const_4_hf_or__exponent_equals_const_4_hf": { + "bits": [ + 105 + ], + "attributes": {} + }, + "isAnInfinity_a": { + "bits": [ + 106 + ], + "attributes": {} + }, + "isAnInfinity_b": { + "bits": [ + 107 + ], + "attributes": {} + }, + "isInf": { + "bits": [ + 108 + ], + "attributes": {} + }, + "_in0__isAnInfinity_a_and_isAnInfinity_b": { + "bits": [ + 109 + ], + "attributes": {} + }, + "effSubtraction": { + "bits": [ + 110 + ], + "attributes": {} + }, + "_d0__swizzled": { + "bits": [ + 111, + 112, + 113, + 114, + 115 + ], + "attributes": {} + }, + "_d1__swizzled_lshift_const_5_h1": { + "bits": [ + 116, + 117, + 118, + 119, + 120 + ], + "attributes": {} + }, + "largeShift": { + "bits": [ + 121, + 122, + 123, + 124, + 125 + ], + "attributes": {} + }, + "largeShift_flopped": { + "bits": [ + 126, + 127, + 128, + 129, + 130 + ], + "attributes": {} + }, + "smallerOperandRpath_flopped": { + "bits": [ + 131, + 132, + 133, + 134, + 135 + ], + "attributes": {} + }, + "effSubtraction_flopped": { + "bits": [ + 136 + ], + "attributes": {} + }, + "sum_0": { + "bits": [ + 137, + 138, + 139, + 140, + 141, + 142 + ], + "attributes": {} + }, + "sumP1": { + "bits": [ + 143, + 144, + 145, + 146, + 147, + 148 + ], + "attributes": {} + }, + "carryOut": { + "bits": [ + 149 + ], + "attributes": {} + }, + "sumRpath": { + "bits": [ + 153, + 154, + 155, + 156, + 157 + ], + "attributes": {} + }, + "_subset_4_4_sumRpath": { + "bits": [ + 158 + ], + "attributes": {} + }, + "_in0__subset_4_4_sumRpath_b": { + "bits": [ + 159 + ], + "attributes": {} + }, + "_in1__isNormal_a_flopped_or_isNormal_b_flopped": { + "bits": [ + 160 + ], + "attributes": {} + }, + "sumlead0Rpath": { + "bits": [ + 161 + ], + "attributes": {} + }, + "_swizzled": { + "bits": [ + 162, + 163, + 164, + 165, + 166, + 167, + 168 + ], + "attributes": {} + }, + "_d1__subset_6_0_sumEarlyGRSRpath": { + "bits": [ + 169, + 170, + 171, + 172, + 173, + 174, + 175 + ], + "attributes": {} + }, + "mergedSumRpath": { + "bits": [ + 176, + 177, + 178, + 179, + 180, + 181, + 182 + ], + "attributes": {} + }, + "selectRpath": { + "bits": [ + 183 + ], + "attributes": {} + }, + "mergedSumP1RPath": { + "bits": [ + 184, + 185, + 186, + 187, + 188, + 189, + 190 + ], + "attributes": {} + }, + "finalSumLGRSRpath": { + "bits": [ + 191, + 192, + 193, + 194, + 195, + 196, + 197 + ], + "attributes": {} + }, + "_in0__subset_2_2_finalSumLGRSRpath": { + "bits": [ + 198 + ], + "attributes": {} + }, + "_in1__subset_3_3_finalSumLGRSRpath_or__subset_1_1_finalSumLGRSRpath_or__subset_0_0_finalSumLGRSRpath": { + "bits": [ + 199 + ], + "attributes": {} + }, + "rndRpath": { + "bits": [ + 200 + ], + "attributes": {} + }, + "_in1__sumlead0Rpath_equals_const_1": { + "bits": [ + 201 + ], + "attributes": {} + }, + "_in0__rndRpath_and__sumlead0Rpath_equals_const_1": { + "bits": [ + 202 + ], + "attributes": {} + }, + "_in1__sumP1lead0Rpath_equals_const_0": { + "bits": [ + 203 + ], + "attributes": {} + }, + "incExpRrpath": { + "bits": [ + 204 + ], + "attributes": {} + }, + "_in0__incExpRrpath_b": { + "bits": [ + 205 + ], + "attributes": {} + }, + "_in0__incExpRrpath_b_and_effSubtraction_flopped": { + "bits": [ + 206 + ], + "attributes": {} + }, + "firstZero_rpath": { + "bits": [ + 207 + ], + "attributes": {} + }, + "_in0__incExpRrpath_b_and_effSubtraction_flopped_and_firstZero_rpath": { + "bits": [ + 208 + ], + "attributes": {} + }, + "out_0": { + "bits": [ + 209, + 210, + 211, + 212 + ], + "attributes": {} + }, + "_in2__effSubtraction_flopped_b_and__incExpRrpath_and_firstZero_rpath_or__incExpRrpath_b_and__firstZero_rpath_b": { + "bits": [ + 213 + ], + "attributes": {} + }, + "out": { + "bits": [ + 214, + 215, + 216, + 217 + ], + "attributes": {} + }, + "_in4__incExpRrpath_and_effSubtraction_flopped_and__firstZero_rpath_b": { + "bits": [ + 218 + ], + "attributes": {} + }, + "_in5__exponent_flopped_lshift_const_4_h1": { + "bits": [ + 219, + 220, + 221, + 222 + ], + "attributes": {} + }, + "exponent_flopped": { + "bits": [ + 224, + 225, + 226, + 227 + ], + "attributes": {} + }, + "sign_flopped_0": { + "bits": [ + 232 + ], + "attributes": {} + }, + "sign_flopped_1": { + "bits": [ + 233 + ], + "attributes": {} + }, + "sign": { + "bits": [ + 234 + ], + "attributes": {} + }, + "smallOperand": { + "bits": [ + 235, + 236, + 237, + 238, + 239 + ], + "attributes": {} + }, + "sum_2": { + "bits": [ + 240, + 241, + 242, + 243, + 244, + 245 + ], + "attributes": {} + }, + "smallShift": { + "bits": [ + 246, + 247, + 248, + 249, + 250 + ], + "attributes": {} + }, + "_shiftAmount__subset_0_0_exponent_xor__subset_0_0_exponent": { + "bits": [ + 251 + ], + "attributes": {} + }, + "smallerFullRpath": { + "bits": [ + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268 + ], + "attributes": {} + }, + "expDelta": { + "bits": [ + 269, + 270, + 271, + 272, + 273 + ], + "attributes": {} + }, + "smallerAlignedRpath": { + "bits": [ + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284 + ], + "attributes": {} + }, + "smallerOperandRpath": { + "bits": [ + 285, + 286, + 287, + 288, + 289 + ], + "attributes": {} + }, + "smallerAlignedRpath_flopped": { + "bits": [ + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300 + ], + "attributes": {} + }, + "lowbitsRpath": { + "bits": [ + 301, + 302, + 303, + 304, + 305, + 306 + ], + "attributes": {} + }, + "_d1__lowbitsRpath_b": { + "bits": [ + 307, + 308, + 309, + 310, + 311, + 312 + ], + "attributes": {} + }, + "b_0": { + "bits": [ + 313, + 314, + 315, + 316, + 317, + 318 + ], + "attributes": {} + }, + "a_0": { + "bits": [ + 319, + 320, + 321, + 322, + 323, + 324 + ], + "attributes": {} + }, + "lowAdderSumRpath": { + "bits": [ + 325, + 326, + 327, + 328, + 329, + 330, + 331 + ], + "attributes": {} + }, + "_subset_3_0_lowAdderSumRpath": { + "bits": [ + 332, + 333, + 334, + 335 + ], + "attributes": {} + }, + "preStickyRpath": { + "bits": [ + 336 + ], + "attributes": {} + }, + "_in0__subset_4_4_lowAdderSumRpath": { + "bits": [ + 337 + ], + "attributes": {} + }, + "stickyBitRpath": { + "bits": [ + 338 + ], + "attributes": {} + }, + "_in1": { + "bits": [ + 339 + ], + "attributes": {} + }, + "shiftGRSRpath": { + "bits": [ + 340, + 341 + ], + "attributes": {} + }, + "sumPlusOneRpath": { + "bits": [ + 342, + 343, + 344, + 345, + 346 + ], + "attributes": {} + }, + "sumP1ShiftGRSRPath": { + "bits": [ + 347, + 348, + 349, + 350, + 351, + 352, + 353 + ], + "attributes": {} + }, + "sumP1lead0Rpath": { + "bits": [ + 354 + ], + "attributes": {} + }, + "_d1__subset_6_0_sumP1EarlyGRSRPath": { + "bits": [ + 355, + 356, + 357, + 358, + 359, + 360, + 361 + ], + "attributes": {} + }, + "shiftRpath": { + "bits": [ + 363 + ], + "attributes": {} + }, + "sumMantissaRndRpath": { + "bits": [ + 364, + 365, + 366, + 367, + 368 + ], + "attributes": {} + }, + "mantissaRpath1": { + "bits": [ + 369, + 370, + 371, + 372, + 373 + ], + "attributes": {} + }, + "_d0__subset_3_1_mantissaRpath1": { + "bits": [ + 374, + 375, + 376 + ], + "attributes": {} + }, + "_control__const_0_and__uor__s_b": { + "bits": [ + 377 + ], + "attributes": {} + }, + "_in1__uor__s_b": { + "bits": [ + 382 + ], + "attributes": {} + }, + "_in1__uor_exponentNpath_b": { + "bits": [ + 383 + ], + "attributes": {} + }, + "_control__const_0_and__uor_exponentNpath_b": { + "bits": [ + 384 + ], + "attributes": {} + }, + "finalSignificandNpath": { + "bits": [ + 385, + 386, + 387 + ], + "attributes": {} + }, + "_control__isNormal_a_flopped_or_isNormal_b_flopped": { + "bits": [ + 391 + ], + "attributes": {} + }, + "_d0__subset_4_2_significandNpath_flopped": { + "bits": [ + 392, + 393, + 394 + ], + "attributes": {} + }, + "_d1__subset_3_1_shiftedSignificandNpath": { + "bits": [ + 395, + 396, + 397 + ], + "attributes": {} + }, + "isNormal_a_flopped": { + "bits": [ + 398 + ], + "attributes": {} + }, + "isNormal_b_flopped": { + "bits": [ + 399 + ], + "attributes": {} + }, + "_isNormal_a_flopped_or_isNormal_b_flopped": { + "bits": [ + 400 + ], + "attributes": {} + }, + "_in0__subset_4_4_sumPlusOneRpath_b": { + "bits": [ + 401 + ], + "attributes": {} + }, + "_subset_4_4_sumPlusOneRpath": { + "bits": [ + 402 + ], + "attributes": {} + }, + "earlyGRSRpath": { + "bits": [ + 403, + 404, + 405 + ], + "attributes": {} + }, + "sumP1EarlyGRSRPath": { + "bits": [ + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413 + ], + "attributes": {} + }, + "sumEarlyGRSRpath": { + "bits": [ + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421 + ], + "attributes": {} + }, + "_subset_5_4_lowAdderSumRpath": { + "bits": [ + 422, + 423 + ], + "attributes": {} + }, + "_subset_4_4_sumPlusOneRpath_0": { + "bits": [ + 424 + ], + "attributes": {} + }, + "_d1__subset_4_4_sumPlusOneRpath_b": { + "bits": [ + 425 + ], + "attributes": {} + }, + "_d0__subset_4_4_sumRpath_b": { + "bits": [ + 426 + ], + "attributes": {} + }, + "_in0__incExpRrpath_and_firstZero_rpath": { + "bits": [ + 427 + ], + "attributes": {} + }, + "_in1__incExpRrpath_b_and__firstZero_rpath_b": { + "bits": [ + 428 + ], + "attributes": {} + }, + "_in1__incExpRrpath_and_firstZero_rpath_or__incExpRrpath_b_and__firstZero_rpath_b": { + "bits": [ + 429 + ], + "attributes": {} + }, + "_in0__effSubtraction_flopped_b": { + "bits": [ + 430 + ], + "attributes": {} + }, + "_in0__incExpRrpath_and_effSubtraction_flopped": { + "bits": [ + 431 + ], + "attributes": {} + }, + "_in1__firstZero_rpath_b": { + "bits": [ + 432 + ], + "attributes": {} + }, + "_in1__effSubtraction_flopped_b": { + "bits": [ + 433 + ], + "attributes": {} + }, + "_in0__expDelta_flopped_greaterThanOrEqual_const_2": { + "bits": [ + 434 + ], + "attributes": {} + }, + "expDelta_flopped": { + "bits": [ + 435, + 436, + 437, + 438, + 439 + ], + "attributes": {} + }, + "b_exponent": { + "bits": [ + 445, + 446, + 447, + 448 + ], + "attributes": {} + }, + "signDelta": { + "bits": [ + 449 + ], + "attributes": {} + }, + "b_mantissa": { + "bits": [ + 450, + 451, + 452 + ], + "attributes": {} + }, + "_uor_mantissa_0": { + "bits": [ + 453 + ], + "attributes": {} + }, + "_uor_mantissa_b": { + "bits": [ + 454 + ], + "attributes": {} + }, + "_const_0_or__exponent_equals_const_4_hf_or__exponent_equals_const_4_hf": { + "bits": [ + 455 + ], + "attributes": {} + }, + "_in0__const_0_or__exponent_equals_const_4_hf": { + "bits": [ + 456 + ], + "attributes": {} + }, + "_in1__exponent_equals_const_4_hf": { + "bits": [ + 457 + ], + "attributes": {} + }, + "_exponent_equals_const_4_hf": { + "bits": [ + 459 + ], + "attributes": {} + }, + "isNaN_b": { + "bits": [ + 468 + ], + "attributes": {} + }, + "_in0__exponent_equals_const_4_hf_0": { + "bits": [ + 469 + ], + "attributes": {} + }, + "b_sign": { + "bits": [ + 474 + ], + "attributes": {} + }, + "b_1": { + "bits": [ + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482 + ], + "attributes": {} + }, + "a_1": { + "bits": [ + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490 + ], + "attributes": {} + }, + "outA": { + "bits": [ + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498 + ], + "attributes": {} + }, + "outB": { + "bits": [ + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506 + ], + "attributes": {} + }, + "outA_mantissa": { + "bits": [ + 507, + 508, + 509 + ], + "attributes": {} + }, + "outA_exponent": { + "bits": [ + 510, + 511, + 512, + 513 + ], + "attributes": {} + }, + "isNormal_outA": { + "bits": [ + 518 + ], + "attributes": {} + }, + "_in0__isNormal_outA_b": { + "bits": [ + 519 + ], + "attributes": {} + }, + "_control__isNormal_outA_b_xor_const_false": { + "bits": [ + 521 + ], + "attributes": {} + }, + "_d0__out": { + "bits": [ + 522, + 523, + 524, + 525 + ], + "attributes": {} + }, + "_d1__swizzled": { + "bits": [ + 526, + 527, + 528, + 529 + ], + "attributes": {} + }, + "fullLarger": { + "bits": [ + 530, + 531, + 532, + 533 + ], + "attributes": {} + }, + "_in__swizzled": { + "bits": [ + 535, + 536, + 537, + 538, + 539 + ], + "attributes": {} + }, + "_d0__swizzled_0": { + "bits": [ + 546, + 547, + 548, + 549 + ], + "attributes": {} + }, + "_d1__swizzled_0": { + "bits": [ + 550, + 551, + 552, + 553 + ], + "attributes": {} + }, + "_subset_1_0_mantissa": { + "bits": [ + 556, + 557 + ], + "attributes": {} + }, + "_control__posExpNpath_or_preMinShiftNpath": { + "bits": [ + 560 + ], + "attributes": {} + }, + "leadOneNpath": { + "bits": [ + 561, + 562, + 563, + 564 + ], + "attributes": {} + }, + "minShiftNpath": { + "bits": [ + 565, + 566, + 567, + 568 + ], + "attributes": {} + }, + "significandNpath_flopped": { + "bits": [ + 569, + 570, + 571, + 572, + 573 + ], + "attributes": {} + }, + "shiftedSignificandNpath": { + "bits": [ + 574, + 575, + 576, + 577, + 578 + ], + "attributes": {} + }, + "inp": { + "bits": [ + 579, + 580, + 581, + 582, + 583 + ], + "attributes": {} + }, + "valid": { + "bits": [ + 584 + ], + "attributes": {} + }, + "out_1": { + "bits": [ + 585, + 586, + 587 + ], + "attributes": {} + }, + "_in0__uor_preExpNpath_and__sign_b": { + "bits": [ + 588 + ], + "attributes": {} + }, + "posExpNpath": { + "bits": [ + 589 + ], + "attributes": {} + }, + "preExpNpath": { + "bits": [ + 594, + 595, + 596, + 597 + ], + "attributes": {} + }, + "_uor_exponentNpath": { + "bits": [ + 598 + ], + "attributes": {} + }, + "_in0__uor_preExpNpath": { + "bits": [ + 599 + ], + "attributes": {} + }, + "_in1__sign_b": { + "bits": [ + 600 + ], + "attributes": {} + }, + "sign_0": { + "bits": [ + 601 + ], + "attributes": {} + }, + "b_2": { + "bits": [ + 602, + 603, + 604, + 605 + ], + "attributes": {} + }, + "sum_1": { + "bits": [ + 607, + 608, + 609, + 610, + 611 + ], + "attributes": {} + }, + "_uor_leadOneNpath": { + "bits": [ + 612 + ], + "attributes": {} + }, + "_in0__uor_leadOneNpath_b": { + "bits": [ + 613 + ], + "attributes": {} + }, + "_in1__uor_exponent_flopped_b": { + "bits": [ + 614 + ], + "attributes": {} + }, + "preMinShiftNpath": { + "bits": [ + 615 + ], + "attributes": {} + }, + "_uor_exponent_flopped": { + "bits": [ + 616 + ], + "attributes": {} + }, + "significandNpath": { + "bits": [ + 618, + 619, + 620, + 621, + 622 + ], + "attributes": {} + }, + "outA_sign": { + "bits": [ + 627 + ], + "attributes": {} + }, + "outB_mantissa": { + "bits": [ + 628, + 629, + 630 + ], + "attributes": {} + }, + "outB_exponent": { + "bits": [ + 631, + 632, + 633, + 634 + ], + "attributes": {} + }, + "isNormal_outB": { + "bits": [ + 639 + ], + "attributes": {} + }, + "_in0__isNormal_outB_b": { + "bits": [ + 640 + ], + "attributes": {} + }, + "_control__isNormal_outB_b_xor_const_false": { + "bits": [ + 642 + ], + "attributes": {} + }, + "_out": { + "bits": [ + 643, + 644, + 645, + 646 + ], + "attributes": {} + }, + "_d1__swizzled_1": { + "bits": [ + 647, + 648, + 649, + 650 + ], + "attributes": {} + }, + "fullSmaller": { + "bits": [ + 651, + 652, + 653, + 654 + ], + "attributes": {} + }, + "_in__swizzled_0": { + "bits": [ + 656, + 657, + 658, + 659, + 660 + ], + "attributes": {} + }, + "_swizzled_lshift_const_5_h1": { + "bits": [ + 666, + 667, + 668, + 669, + 670 + ], + "attributes": {} + }, + "_d0__swizzled_1": { + "bits": [ + 671, + 672, + 673, + 674, + 675 + ], + "attributes": {} + }, + "_d0__swizzled_2": { + "bits": [ + 677, + 678, + 679, + 680 + ], + "attributes": {} + }, + "_d1__swizzled_2": { + "bits": [ + 681, + 682, + 683, + 684 + ], + "attributes": {} + }, + "_in1_0": { + "bits": [ + 687, + 688 + ], + "attributes": {} + }, + "outB_sign": { + "bits": [ + 691 + ], + "attributes": {} + }, + "a_sign": { + "bits": [ + 692 + ], + "attributes": {} + }, + "_in0__sign_xor_sign": { + "bits": [ + 693 + ], + "attributes": {} + }, + "isNormal_b": { + "bits": [ + 699 + ], + "attributes": {} + }, + "_in1__subset_0_0_exponent": { + "bits": [ + 700 + ], + "attributes": {} + }, + "_in0__subset_0_0_exponent": { + "bits": [ + 701 + ], + "attributes": {} + }, + "_incExpRrpath_b": { + "bits": [ + 702 + ], + "attributes": {} + }, + "_firstZero_rpath_b": { + "bits": [ + 703 + ], + "attributes": {} + }, + "selectSumMantissa_rpath": { + "bits": [ + 704, + 705, + 706, + 707, + 708 + ], + "attributes": {} + }, + "rndExtend_rpath": { + "bits": [ + 709, + 710, + 711, + 712, + 713 + ], + "attributes": {} + }, + "_selectSumMantissa_rpath_add_rndExtend_rpath_carry": { + "bits": [ + 714 + ], + "attributes": {} + }, + "_subset_4_4_sumRpath_0": { + "bits": [ + 719 + ], + "attributes": {} + }, + "isNormal_a": { + "bits": [ + 720 + ], + "attributes": {} + }, + "_uor__s": { + "bits": [ + 725 + ], + "attributes": {} + }, + "_in0__subset_3_3_finalSumLGRSRpath_or__subset_1_1_finalSumLGRSRpath": { + "bits": [ + 732 + ], + "attributes": {} + }, + "_in1__subset_0_0_finalSumLGRSRpath": { + "bits": [ + 733 + ], + "attributes": {} + }, + "_in0__subset_3_3_finalSumLGRSRpath": { + "bits": [ + 734 + ], + "attributes": {} + }, + "_in1__subset_1_1_finalSumLGRSRpath": { + "bits": [ + 735 + ], + "attributes": {} + }, + "_const_0_or__exponent_equals_const_4_hf": { + "bits": [ + 736 + ], + "attributes": {} + }, + "_in1__exponent_equals_const_4_hf_0": { + "bits": [ + 737 + ], + "attributes": {} + }, + "_in1__exponent_equals_const_4_hf_1": { + "bits": [ + 739 + ], + "attributes": {} + }, + "const_0_4_hf": { + "bits": [ + 96, + 97, + 98, + 99 + ], + "attributes": {} + }, + "const_1_4_hf": { + "bits": [ + 228, + 229, + 230, + 231 + ], + "attributes": {} + }, + "const_2_6_h0": { + "bits": [ + 252, + 253, + 254, + 255, + 256, + 257 + ], + "attributes": {} + }, + "const_3_1_h0": { + "bits": [ + 362 + ], + "attributes": {} + }, + "const_4_3_h0": { + "bits": [ + 378, + 379, + 380 + ], + "attributes": {} + }, + "const_5_1_h0": { + "bits": [ + 381 + ], + "attributes": {} + }, + "const_6_3_h0": { + "bits": [ + 388, + 389, + 390 + ], + "attributes": {} + }, + "const_7_5_h2": { + "bits": [ + 440, + 441, + 442, + 443, + 444 + ], + "attributes": {} + }, + "const_8_1_h0": { + "bits": [ + 458 + ], + "attributes": {} + }, + "const_9_4_hf": { + "bits": [ + 460, + 461, + 462, + 463 + ], + "attributes": {} + }, + "const_10_4_hf": { + "bits": [ + 464, + 465, + 466, + 467 + ], + "attributes": {} + }, + "const_11_4_hf": { + "bits": [ + 470, + 471, + 472, + 473 + ], + "attributes": {} + }, + "const_12_4_h0": { + "bits": [ + 514, + 515, + 516, + 517 + ], + "attributes": {} + }, + "const_13_1_h0": { + "bits": [ + 520 + ], + "attributes": {} + }, + "const_14_1_h0": { + "bits": [ + 534 + ], + "attributes": {} + }, + "const_15_5_h1": { + "bits": [ + 748, + 749, + 750, + 751, + 752 + ], + "attributes": {} + }, + "const_16_1_h0": { + "bits": [ + 545 + ], + "attributes": {} + }, + "const_17_2_h0": { + "bits": [ + 554, + 555 + ], + "attributes": {} + }, + "const_18_1_h1": { + "bits": [ + 558 + ], + "attributes": {} + }, + "const_19_1_h0": { + "bits": [ + 559 + ], + "attributes": {} + }, + "const_20_4_h0": { + "bits": [ + 590, + 591, + 592, + 593 + ], + "attributes": {} + }, + "const_21_1_h1": { + "bits": [ + 606 + ], + "attributes": {} + }, + "const_22_1_h0": { + "bits": [ + 617 + ], + "attributes": {} + }, + "const_23_4_h1": { + "bits": [ + 753, + 754, + 755, + 756 + ], + "attributes": {} + }, + "const_24_4_h0": { + "bits": [ + 635, + 636, + 637, + 638 + ], + "attributes": {} + }, + "const_25_1_h0": { + "bits": [ + 641 + ], + "attributes": {} + }, + "const_26_1_h0": { + "bits": [ + 655 + ], + "attributes": {} + }, + "const_27_5_h1": { + "bits": [ + 757, + 758, + 759, + 760, + 761 + ], + "attributes": {} + }, + "const_28_1_h0": { + "bits": [ + 676 + ], + "attributes": {} + }, + "const_29_2_h0": { + "bits": [ + 685, + 686 + ], + "attributes": {} + }, + "const_30_1_h1": { + "bits": [ + 689 + ], + "attributes": {} + }, + "const_31_1_h0": { + "bits": [ + 690 + ], + "attributes": {} + }, + "const_32_1_h0": { + "bits": [ + 694 + ], + "attributes": {} + }, + "const_33_4_h0": { + "bits": [ + 695, + 696, + 697, + 698 + ], + "attributes": {} + }, + "const_34_4_h0": { + "bits": [ + 715, + 716, + 717, + 718 + ], + "attributes": {} + }, + "const_35_4_h0": { + "bits": [ + 721, + 722, + 723, + 724 + ], + "attributes": {} + }, + "const_36_5_h0": { + "bits": [ + 726, + 727, + 728, + 729, + 730 + ], + "attributes": {} + }, + "const_37_1_h1": { + "bits": [ + 731 + ], + "attributes": {} + }, + "const_38_1_h0": { + "bits": [ + 738 + ], + "attributes": {} + }, + "const_39_4_hf": { + "bits": [ + 740, + 741, + 742, + 743 + ], + "attributes": {} + }, + "const_40_4_hf": { + "bits": [ + 744, + 745, + 746, + 747 + ], + "attributes": {} + }, + "rpath_significand_adder_carryOutP1": { + "bits": [ + 150 + ], + "attributes": {} + }, + "rpath_significand_adder_sign": { + "bits": [ + 151 + ], + "attributes": {} + }, + "rpath_significand_adder_signP1": { + "bits": [ + 152 + ], + "attributes": {} + } + } + }, + "TwoFloatingAddersTiedClean": { + "attributes": { + "src": "generated", + "top": 1 + }, + "ports": { + "a": { + "direction": "input", + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ] + }, + "b": { + "direction": "input", + "bits": [ + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ] + }, + "clk": { + "direction": "input", + "bits": [ + 18 + ] + }, + "reset": { + "direction": "input", + "bits": [ + 19 + ] + }, + "enable": { + "direction": "input", + "bits": [ + 20 + ] + }, + "out": { + "direction": "output", + "bits": [ + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28 + ] + } + }, + "cells": { + "bussubset": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 3, + "A_WIDTH": 8, + "Y_WIDTH": 4 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52 + ], + "Y": [ + 53, + 54, + 55, + 56 + ] + } + }, + "adder0": { + "hide_name": 0, + "type": "FloatingPointAdderDualPath_E4M3", + "parameters": {}, + "attributes": {}, + "port_directions": { + "clk": "input", + "reset": "input", + "enable": "input", + "a": "input", + "b": "input", + "sum": "output" + }, + "connections": { + "clk": [ + 18 + ], + "reset": [ + 19 + ], + "enable": [ + 20 + ], + "a": [ + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67 + ], + "b": [ + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75 + ], + "sum": [ + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52 + ] + } + }, + "adder1": { + "hide_name": 0, + "type": "FloatingPointAdderDualPath_E4M3", + "parameters": {}, + "attributes": {}, + "port_directions": { + "clk": "input", + "reset": "input", + "enable": "input", + "a": "input", + "b": "input", + "sum": "output" + }, + "connections": { + "clk": [ + 18 + ], + "reset": [ + 19 + ], + "enable": [ + 20 + ], + "a": [ + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67 + ], + "b": [ + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75 + ], + "sum": [ + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83 + ] + } + }, + "swizzle": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 3, + "IN1_WIDTH": 4, + "IN2_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "[2:0]": "input", + "[6:3]": "input", + "[7]": "input", + "Y": "output" + }, + "connections": { + "[2:0]": [ + 29, + 30, + 31 + ], + "[6:3]": [ + 32, + 33, + 34, + 35 + ], + "[7]": [ + 36 + ], + "Y": [ + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67 + ] + } + }, + "swizzle_0": { + "hide_name": 0, + "type": "$concat", + "parameters": { + "IN0_WIDTH": 3, + "IN1_WIDTH": 4, + "IN2_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "[2:0]": "input", + "[6:3]": "input", + "[7]": "input", + "Y": "output" + }, + "connections": { + "[2:0]": [ + 37, + 38, + 39 + ], + "[6:3]": [ + 40, + 41, + 42, + 43 + ], + "[7]": [ + 44 + ], + "Y": [ + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75 + ] + } + }, + "bussubset_0": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 0, + "A_WIDTH": 8, + "Y_WIDTH": 3 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52 + ], + "Y": [ + 84, + 85, + 86 + ] + } + }, + "bussubset_1": { + "hide_name": 0, + "type": "$slice", + "parameters": { + "OFFSET": 7, + "A_WIDTH": 8, + "Y_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52 + ], + "Y": [ + 87 + ] + } + }, + "struct_unpack_0_b": { + "hide_name": 0, + "type": "$struct_unpack", + "parameters": { + "STRUCT_NAME": "b", + "FIELD_COUNT": 3, + "FIELD_0_NAME": "mantissa", + "FIELD_0_OFFSET": 0, + "FIELD_0_WIDTH": 3, + "FIELD_1_NAME": "exponent", + "FIELD_1_OFFSET": 3, + "FIELD_1_WIDTH": 4, + "FIELD_2_NAME": "sign", + "FIELD_2_OFFSET": 7, + "FIELD_2_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "mantissa": "output", + "exponent": "output", + "sign": "output" + }, + "connections": { + "A": [ + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "mantissa": [ + 37, + 38, + 39 + ], + "exponent": [ + 40, + 41, + 42, + 43 + ], + "sign": [ + 44 + ] + } + }, + "struct_unpack_1_a": { + "hide_name": 0, + "type": "$struct_unpack", + "parameters": { + "STRUCT_NAME": "a", + "FIELD_COUNT": 3, + "FIELD_0_NAME": "mantissa", + "FIELD_0_OFFSET": 0, + "FIELD_0_WIDTH": 3, + "FIELD_1_NAME": "exponent", + "FIELD_1_OFFSET": 3, + "FIELD_1_WIDTH": 4, + "FIELD_2_NAME": "sign", + "FIELD_2_OFFSET": 7, + "FIELD_2_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "A": "input", + "mantissa": "output", + "exponent": "output", + "sign": "output" + }, + "connections": { + "A": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "mantissa": [ + 29, + 30, + 31 + ], + "exponent": [ + 32, + 33, + 34, + 35 + ], + "sign": [ + 36 + ] + } + }, + "struct_pack_0_out": { + "hide_name": 0, + "type": "$struct_pack", + "parameters": { + "STRUCT_NAME": "out", + "FIELD_COUNT": 3, + "FIELD_0_NAME": "mantissa", + "FIELD_0_OFFSET": 0, + "FIELD_0_WIDTH": 3, + "FIELD_1_NAME": "exponent", + "FIELD_1_OFFSET": 3, + "FIELD_1_WIDTH": 4, + "FIELD_2_NAME": "sign", + "FIELD_2_OFFSET": 7, + "FIELD_2_WIDTH": 1 + }, + "attributes": {}, + "port_directions": { + "mantissa": "input", + "exponent": "input", + "sign": "input", + "Y": "output" + }, + "connections": { + "mantissa": [ + 84, + 85, + 86 + ], + "exponent": [ + 53, + 54, + 55, + 56 + ], + "sign": [ + 87 + ], + "Y": [ + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28 + ] + } + } + }, + "netnames": { + "a": { + "bits": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "attributes": {} + }, + "b": { + "bits": [ + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ], + "attributes": {} + }, + "clk": { + "bits": [ + 18 + ], + "attributes": {} + }, + "reset": { + "bits": [ + 19 + ], + "attributes": {} + }, + "enable": { + "bits": [ + 20 + ], + "attributes": {} + }, + "out": { + "bits": [ + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28 + ], + "attributes": {} + }, + "a_mantissa": { + "bits": [ + 29, + 30, + 31 + ], + "attributes": {} + }, + "a_exponent": { + "bits": [ + 32, + 33, + 34, + 35 + ], + "attributes": {} + }, + "a_sign": { + "bits": [ + 36 + ], + "attributes": {} + }, + "b_mantissa": { + "bits": [ + 37, + 38, + 39 + ], + "attributes": {} + }, + "b_exponent": { + "bits": [ + 40, + 41, + 42, + 43 + ], + "attributes": {} + }, + "b_sign": { + "bits": [ + 44 + ], + "attributes": {} + }, + "sum": { + "bits": [ + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52 + ], + "attributes": {} + }, + "out_exponent": { + "bits": [ + 53, + 54, + 55, + 56 + ], + "attributes": {} + }, + "clk_local": { + "bits": [ + 18 + ], + "attributes": {} + }, + "reset_local": { + "bits": [ + 19 + ], + "attributes": {} + }, + "enable_local": { + "bits": [ + 20 + ], + "attributes": {} + }, + "a_0": { + "bits": [ + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67 + ], + "attributes": {} + }, + "b_0": { + "bits": [ + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75 + ], + "attributes": {} + }, + "out_mantissa": { + "bits": [ + 84, + 85, + 86 + ], + "attributes": {} + }, + "out_sign": { + "bits": [ + 87 + ], + "attributes": {} + }, + "adder1_sum": { + "bits": [ + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83 + ], + "attributes": {} + } + } + } + } +} \ No newline at end of file diff --git a/rohd_devtools_extension/assets/help/rohd_shell_help.md b/rohd_devtools_extension/assets/help/rohd_shell_help.md new file mode 100644 index 0000000000..e42f173ae2 --- /dev/null +++ b/rohd_devtools_extension/assets/help/rohd_shell_help.md @@ -0,0 +1,70 @@ +# ROHD Debug Shell Help + + + +ROHD Debug Shell + Enter Run a command + Tab Complete the current command + Up/Down Browse command history + + + +## Shell Controls + +| Key | Description | +| --- | --- | +| Enter | Run the command in the input field | +| Tab | Request completion for the token at the cursor | +| Up / Down | Browse commands submitted in this shell session | + +## Commands + +| Command | Description | +| --- | --- | +| `help` | List the shell command syntax | +| `status` | Show the active design-session status and capabilities | +| `find-cell ` | Find a hierarchy cell by path | +| `find-port ` | Find a port by path | +| `find-ports [$root] [transparent]` | Find matching ports | +| `find-signal ` | Find a signal by path | +| `find-cells [$root] [transparent]` | Find matching hierarchy cells | +| `find-signals [$root] [transparent]` | Find matching signals | +| `fanin $signal [transparent]` | Trace signals feeding one signal alias | +| `fanout $signal [transparent]` | Trace signals driven by one signal alias | +| `get-value $signal [time]` | Read the latest or a historical signal value | +| `name $occurrence` | Expand one alias with its path and metadata | +| `send $signal` | Send one signal or a signal-list alias to the other panes | + +`let = find-cell|find-cells|find-port|find-ports|find-signal|find-signals ...` + +`let` creates an alias for one occurrence or an occurrence list. + +## Aliases + +| Syntax | Description | +| --- | --- | +| `$sum` | Inspect one assigned occurrence | +| `$selected` | Inspect an assigned occurrence list | +| `$selected[4]` | Inspect one list occurrence by zero-based index | +| `$selected.length` | Return the number of list occurrences | + +Use `$name`, `$name[index]`, or `$name.length` to inspect an alias. + +## Hierarchy Patterns + +`find-cells`, `find-signals`, and `find-ports` use the `rohd_hierarchy` query +language. Refer to `packages/rohd_hierarchy/README.md`, “Regex / glob search”, +for the complete syntax and examples. + +A list alias retains the returned occurrence handles for commands that accept +a selection; commands requiring one occurrence report an error if given a +list. The shell is available when a ROHD debug target with diagnostics is +connected. + +## Output + +The shell displays successful commands in green and failures in red. Pretty +output shows occurrence addresses, list sizes, and signal values without +printing the full protocol JSON. Transported occurrence handles contain only +their addresses, even in `--json` mode. Run `name $occurrence` to expand one +handle with its path and metadata. \ No newline at end of file diff --git a/rohd_devtools_extension/assets/layout_bridge/elk_layout_only.js b/rohd_devtools_extension/assets/layout_bridge/elk_layout_only.js new file mode 100644 index 0000000000..e72ef69024 --- /dev/null +++ b/rohd_devtools_extension/assets/layout_bridge/elk_layout_only.js @@ -0,0 +1,96 @@ +/** + * Copyright (C) 2026 Intel Corporation + * SPDX-License-Identifier: BSD-3-Clause + * + * elk_layout_only.js + * Minimal ELK layout wrapper for the Dart-first FlutterSchematicViewer. + * + * This is the ONLY JavaScript the Dart-first path needs (besides elk.bundled.js). + * It invokes ELK's layout engine and returns the raw hierarchical result. + * All pre-processing (Yosys → ELK graph) and post-processing (coordinate + * conversion, flattening) happens in Dart. + * + * 2026 February + * Author: Desmond Kirkpatrick + */ + +(function () { + 'use strict'; + + /** + * Run ELK layout on a pre-built ELK graph and return the raw result. + * + * @param {string|object} elkGraphJson - ELK graph (JSON string or object) + * @returns {Promise} Raw ELK layout result (hierarchical, relative coords) + */ + async function elkLayoutOnly(elkGraphJson) { + try { + var graph = (typeof elkGraphJson === 'string') + ? JSON.parse(elkGraphJson) + : elkGraphJson; + + // Ensure minimal ELK-required properties + if (!graph.id) graph.id = 'root'; + if (!graph.properties) graph.properties = {}; + if (!graph.width) graph.width = 1; + if (!graph.height) graph.height = 1; + + // ELK drops unknown fields (_children, _edges, isPartiallyExpanded). + // Save them before layout and restore afterwards. + var hiddenData = {}; + function saveHidden(node, path) { + var entry = {}; + if (node._children) entry._children = node._children; + if (node._edges) entry._edges = node._edges; + if (node.isPartiallyExpanded) entry.isPartiallyExpanded = true; + if (Object.keys(entry).length > 0) hiddenData[path] = entry; + if (node.children) { + for (var i = 0; i < node.children.length; i++) { + saveHidden(node.children[i], path + '/' + (node.children[i].id || i)); + } + } + } + saveHidden(graph, graph.id || 'root'); + + var layoutOptions = { + 'edgeRouting': 'ORTHOGONAL', + 'org.eclipse.elk.padding': '[top=30,left=60,bottom=10,right=60]', + 'org.eclipse.elk.spacing.edgeNode': '15', + }; + + var elk = new ELK(); + try { + var result = await elk.layout(graph, { layoutOptions: layoutOptions }); + + // Restore hidden data that ELK dropped. + function restoreHidden(node, path) { + var entry = hiddenData[path]; + if (entry) { + if (entry._children) node._children = entry._children; + if (entry._edges) node._edges = entry._edges; + if (entry.isPartiallyExpanded) node.isPartiallyExpanded = true; + } + if (node.children) { + for (var i = 0; i < node.children.length; i++) { + restoreHidden(node.children[i], path + '/' + (node.children[i].id || i)); + } + } + } + restoreHidden(result, result.id || 'root'); + + return result; + } finally { + if (typeof elk.terminate === 'function') elk.terminate(); + } + } catch (e) { + var msg = (e && e.message) ? e.message : String(e); + console.error('[ElkLayoutOnly] error:', msg); + return { error: msg }; + } + } + + // Export for web (Dart interop reads window.ElkLayoutOnly) + if (typeof window !== 'undefined') { + window.ElkLayoutOnly = elkLayoutOnly; + } +})(); diff --git a/rohd_devtools_extension/assets/rohd_icon.png b/rohd_devtools_extension/assets/rohd_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..acd165142d5e74105a26e389c46231011d4df16a GIT binary patch literal 4911 zcmYjVc{tSH_kYhA%OI1njAbmDF_bWvm?Y~MBfF#$HCablCVSSIv2PKItb>xGLK4|V zmPlntk@%Q=vXs;)TPVNzJkR%!-}Bt}z0Y&*>)dmnd(U~Dd*11e_E!6Z<%9tM*k?^5 zIP*r;=E+nxLbgHMPv#;)|)7 zzrS*&-P_x@Ou82JQ$K#j7)1UE9r<_jtVSjq6H|d%4Baq}*^BSqmvT|&f9<+>NcEqA zxEv4H?JyOt7<0I1U54lqAZS>E#Epw0fl`<)e*~WL790DRztwLXWtvV#Qy^0`Ro3?> zE&ej%tA)k+IIcByM06G}4n&+_XV;j` z0^9CS0%f|Wy8OZtwy79C1F+xLQZLs1)BJ)cx=1Wm3je`MDdiKxz02_x=+DaV$5MSH zsX?1-$HCvtmQO*+(SFgaf18h5?JUzW=`Uh&K{8MBh7lPh^kej8x&g>NTcC1g4hBR5 zf`ZrIojy#@=J=quAdZll zqdc8U=nfcLC|0f;)iXk?ql*=;$PZ8s&I(-y{wiu-_+F+hd1XBWNn*pM`D3B{C|RP1 zY=By;I9_T?uAy-F4H&vj`{+2>r_a+PK1rGdz5F5=pK()XBJo!wW0eApFy?BZ%P$g6 zsDe!4Mi6(P9<&I@0XrZo;D@Et?HdnYkhG8Djx8}mkRPI&d!j|fq)(>UqzzSiOsiyU zUO0I?ST|0&C1Qe3m}Jysq;rZ zv8}*Qt35pOS+xe|pc{3UDyL#;7EUA!kS!SXI}3AQ!F0_Y3+p7bcdGQJ<&OF$b;6R5 zCLjaQ*gPA}gV%R}3ud}9M3s9-)V3b6T?Vo6^vv5)@}R7~Idht?V4w`qgX${XkIhSi zlD*|5Sc5nW?Yh4$fO=a55NmWmS+-tanOg%8tZw%I2e>2i>fgytVNYD9MTO6Pu-q;B4!_y zYcdO36Q~Hbnp;CTJ#)G@q{Rv6yo;@DRg}WT$W8(Q#1OoRsOpfnCGVmm`4HmW+!X*zyIVX;aZ8D8+2t5390irv9Md-4`KkXi*%QI#UlZwu$ef<7%gDmGe2IaP6F9-6 zBOED?waYobt2~8kWVxG1WOY~J$X(}SbZv0v=-Pq0X66{9g0N_4l13bK;CuVnb?dMM zm}L)bsf?tndY@y!kA@X5rq}+Q)uw6C|L_c1ND~ILfQFNdAau|Aq?y9SV!8!Qp0-2R zpvn3xiR-EY9d?XI;0b0S!HXu~vf`z~mEhpW?rxTYrT?j&cUfL@3qZ?c5jj{FAW$|> zB^>VU3`|-wZ0IHv>x?-Y4X!N5ie+tjvKT#B4{-IN-wDIjm>%{kVs(!cYpdBdT~`zM zRzMb{YGZn+wgS>~pU|Vx*RO)e2&fitzJ8g%zeJi7z;ShMIN=S3B%xbj3e!&?mQP58 z%F$1zjXY5eGnJm9t|s9?mA*nY9F$6CrYG2`GR_o zy{C+2o)ryA70U>|qA!{npAG{S`RdAWJP_*(E1VT%T`H`4mKLv^BerG?rM84C<#Ei= zA0FGw*{fwQK}PkgIq7EB(g4nHRwQsdR@ek?lp(ejKVaSa#Tz+w%0w>j$=RD>pcCJq zyBbsh>_9#w5Rbp9*Z&HT2E|P5nBPC32?lH}&4L!^s85@086)8C$T6znEs?{lPZom) z{&0Y!z$$cHm^cH2*PFgQkWZ$DP$Z3O-c0Ctj$r^6pcdYTP;`{-k^4$TR}&7{eGed;tn+>GwOF3xDsCBYlqH7~bVoDUv<=@bSclw|Srq2M4`3cwsro7bR5SkD zt>bN1NA|{i;Bm^kuW$|o-Pe*ayHuVC6?4v6ZZ~y>0D&J81gsnU#(JZy%$3cxx%g=R zJ)?$$&uu8gYKMSjtdBL23-M#BkK9`CELak%Aq6wDpZ~7)_H;pBYZ~&jeh&fulsK3- ze$#u5h4Uh0o2CR0T=*!-Ig_@CQ_lp`Ty5}-OGVkHKpon>_%b{4U+vgZ;b*|FZqZ~KGT9j)MkQfS_Xq>+L4+1Wp z051PEZKd&YDpLx>V#n^^I!4-5-_JFCd4+2&v7TwG0GA+BLev{k5!ykDOM>M;r>*#O zL(J)O@v~ z?|Xda48Lr6HLO#_I|D7^_>z8P8q4#d*s(7>oOKgm*N5xVue9yk<5P|B(^ESO^nxmn zU+bjJ7)89x*^u{4hLQ{Ltk9iK*5&e@S{`)+E8)nwwj4!{)JU8QkF9CH|L^1 zm5+^^NLwL*`yOKIpt)v@y9pXpe(qnPXYLNR4pTUgE|L1npz85H`<&X3Ci^{9pWWwK zAuKKI2{L*gpq5$?TSwT4r(a-2K<}u{?lmPjsh-!fqNR4tK64-GRw`fXE;Uh2iJD>J zadvTclU!qJs;XLlrR%404^%xMdPreRec(H5u$e6{r|^YgIx1bi_W_^OKN*4Lbl$mQ z@{ZdfVTXx#{~bq#?LJ-N$43lTsOIesXEScGL`ebu1)8-}7RU9OEllC@;QsXmL3vP$ zmjG9abDpVjL45()d{jWSVht?sNS}&ePRwV+k&AAJ5{<gHrji#$S`~66@7&j&sCi<>KeC?EkKL35~*Q~?MhN0S2 zNNZUTzwSEIImd>+@+$lBvQwLTin z?!LxHH5!2C`v0;FXgR#;e<0FT)z@PW+eLs3_S;Q6@QKxMF{Zmk{L{j*k{zT5@mArj zgF&iGg5L=z+a|SQZhC?H@{Jlq@ro2~17t^-s>7`i`?#xG>=~{$zaS`~{N|PU;>|Mf zXLsxU&yG%@pz$lr4{DB-bpgRZ%M9rLU|%NU<;hi4j~qvZF*D`VB&_<*=+yfN6)b3O z1joT}aLmy}h(on}RKI%hS^j2FxAtW{og!d}Y-srIFLIZ}wc>Pex>55^oWq>erWSZI zG#81fE_@YA!#KbXleZEdKjoXXvOc0QJViocOq+_5(0Bx8L%An-l!P6>VqM~7I~vPL zZu((|#+d#rg2c+UN>Wypdr<1J+XkZFWPX@B>^x=@Ph0K$Z0VcbC4; zxazA5$ynOLhTFL#As@wz!Rh{%wq$tP|^Chck2@wQzf z)vB0msQm_!;h|-5&ne0x;H|6&`6TnRp0r)EF)Yi0vfws@1&x`B2wy%UWQ&6muR(Ja zPr!HeupiJevKZ56GJK`!HxH@Zg7kWUMIB5|tSt$}g;k2yU5^hFnB62U?Zo-`9610D zg47g4ZZw`^zFY%Ef@UoY0uKs?yK{A%pV7Xv_i`-!LdpbQ^_T@+mbIhkT{ikJ+jfD! zxDV7zNicP_E5G!~6&g5jUE*c7uCV_eY*oq*HEUQqc4p)SJg+hX2|dYEaj^rj1_=|vLI>vK9z%ooXzBQb(ce< zXr5r-0qA$Zhr}VZE<9L@Q_T0_CQm3%ha6*f^&)6bjUpoP_mOdU@6%ujWnTz#Fm;%@LNC6mjTU& zI9QV^9lGDkygy)1Jc=C}c_;eztvnWlB%ocH-86gkyIRga$L(1c4-VjYAyC?6SdOR) zNix2b?3r3BJ)f%ao zKXsGW0l^6*Mn!eiDTVU((u|v)BYhX0&RgMlteE52Ssp{P+?vr8kecrVNzI45=HRq= zYoVLZxf5PgY(#wz(Y>$VNGq`B`DTGBBPc8{PQ1IlpZPU(;@?(9|4!cGw#sG*;nH@& zJs(kR0Z+bfK;P;z0Fvj-m5^LdEk$2jBlhZfqCzRo;kE{PH2>&#!5^nc7QNBAe!JrLZQF$hv$Z+xk-!4iE&9uP* zcU4w>uYO-XcnQgGODm9=(mW5@&0P}f+)+PKKNN$6>N5u?d2nxLgstOQZ$!y`YCepE;#WU(F(itMf|K z%N~e-vdldbQp?f3PYNxbXUWc84ppCh5}MZi!>Up31xUo{ez~?HpRrg+`Fj*GvE-4I zWmvpeGLF#iMmFZ!P$RRJyIyE%#6?RM!(YpOz3d?b@EHUcpd^^Gf0(J;Q}JsAxvxLu z>DFe)jE6D+;3Vx4s3Kzv{=TYhXM`3HgCkRF+*3t2!XH9N8ut)Pg7Wi!SSt|z5R^CH zef$-rcr;$JRcfo`=cC3`%BWX+m3LPYtfqg6N}5LMiXmLgcOV*$R~~s}h?D>~hF&en zM1M6-+z`4XcI086?9#!NW?>H!!*5i8qtu%a40frJ>a6!;V-S2=Bx zsRVVcdRM7-B7w|9@IS!&q%>_;Pk@36vCun*!uGw&c#Z&Vpbg4iq>=AfCy# zqq>rYDCkz91b8XT$P+A+$m0nGOE=;TTM6ID=8;gHc=Q$@^_ga(tM3uv#kiv@!%PeD z>8O*AA;b5=Ta)ZL!;~A8%;nj{Y+!&inFL;pKb6|0#*DgidDSub4Fr2=tgGVzP9a*{ z&dT-uCtWv3m60QO9(!T$fAV*MYGsUN&SzPcgk{pxAEL3KEOGJT7!$Elej~TkVTu_j z#)gWfL&;f1xeyJyo}>BpMw)gtRAHhyi7Dx&sZs>o_;6yan{!4YTJ22c`>{uaz(&J?Qzrqt5esgp+hJNqB-GRj=U%#fpK!-8EFy zH1G*`P%gdAcmGbCoR3Z5$X7)cwICwvSMpqi<7A&MCsBQI^SHX#BdHm`;L6YI*Erq5 z%+YW?3$>=r>T1W~{BjKNFJmNzp6GNf^xbFTFFSvgwQ}clRH6cXzkoG|;#2?9JZfy+Kv2 zS~aLscFx}4u0P6((x^y8NB{r;RaQnq6|xQZ-vt30vX<9>$^rnWCuJo>)qiJQcEkS0 zS=kmA>bS;RYvV_x#$Z&YXoI0oB5D=OeiFN~JCpQ6cI#x~)LqACV7jiM!4O0FMNN4< zX5LuS2n5sek6oJ<7B_%F-p}`ko~yhr=EsxIz>}=n>@Q*%FuQ>uKzks%IsiN3*Ry|@|xsvzTPClWw?GdCD$K#T=M9`hj&0tMvgv}tG47+3V%6cN;$_Aqy zmkqqVhPy0@+5wlKh%s|2D`r%ft|M_38<6O+%B%S{MohOnuELca`T@rc?g0RSkNi?=UM z2+-}Uec|%9gToR`C@_Ts1V|gk1mPmYihVFptBz>_A+F{agT`(Ibzxj4m6{H4@&KMy zyhT1q^u39&*27L6Ih6+W?q*t#;Ccug~Yc5UBIL?&u zpOVLJbSS{<($&bl4Rb1&0gD5hwmvQlSt6H%>FoRAt|UF>Xg8X|vtmHUo}9*(#n!kK zIYRLE;j0kaY%?vgwMDOg)H^A~p1mid-SlXlC~nG5;5nDVs2o2@_}^+J(-cmYms1{N zap`erk8UoZ?*Wk}L<$QY=fl-S+d~PH$x=Q-qk_1)2gJe_zW((^JB@TG28OMUwjs}g zO-~-!0VdW4AW?%0!^*vw33`NMw$Q}RPYE^3w1u0aP&d+@9G1@~eay%hW@6%$coKGA zsp$f6I^Rxw);TPBE`|S$B8tH0+ooA=?kDF(O?SX*qxEou)83&Dr1`9R&Xox`DCYz! zV`{Zz9dwiAgHT*g#x)=Jvd&FBIq~I)3>4>7eyjW#g*+tMkx_pw8-H@B^^~oOb#$l9 z;o>a%A15;Stf9|=vjHai=^Ji0q+^}hn`tCpH|nU(6jf($tWR(6Hqldig|sBB6IZqk zFBweXtJf8Ks8Iq@^*-mcN(bfLyoOW^HlQZe2XGXRK!S27-%$TWWF}X4vNO1UYA)vk z+p{`^IWLpj{}hUMhpnyeVFjdT>e;i@>F~ehV8Pa&yb18V9M#_RJoV4{aFMRv`Mmv? z6!(+sdYjdKtEcL(CIIk0l-0qaMKV>H4&HP6rydcd_4-N`tY2xhxvm3(0_+9_XubN) zpnT?OHvgOkjW}0sfO6grx=GI`Yv(7cfC|)P07U`Yx+BKfUR|akBb?k>FH)nnPf82511&QgZYT3W$Sr1 zA8U{79lbLVR2b|b9GQHNCM#Fmx^-3lEQHuxn})B_jvTFFu24__)?p#ELv>z60%D=v zmutW{5`Oq+CR6&B?t7hVA``hMl+;l0VlMah-`i!o+)w)cH;!b@KK|}z%Udb`l*q_@ z!ieQP|C>~>^T=^Z7K(80CV%?711x%QsaT)qCN*ULre6Q}r&sz7a!Y@=FWz~p*DZz} zv|48`k45zLOUS|o3oo<0@~Oow>psNkXz`eSc#so#-yZ2O?|2ug-aJmW1anuywL7vx z}|%^yZhO3QlRMf~Z%<^~!SK zoRx{b8E427y~4^rTeWBZTs}tC5vJlj++2r6Sd`0NPOpj-;?-HJAUm!2MC@a%W(u8{ z%*bRuBB?dgzc~`;f*tv@;%?Lld6&XVOHp)Ql_XTUT~adeZf+P%!C5+cbUJBR&gh?C zoL0l-=j4yJv>fFI;*viGvy6-~`hVszAI18(O&hy6AILn^!qR_VKHWg?#BuH-!w9!0 zQY>@|0*Kzuuvdk}qQ@TfwpAPC%Sg~xT5i8cm@imHN(C=nJ|Zvtjz}&#jf2_wR3tdU6Jx(BL(Lh zzK7CNLSfa&HO~)EFSOb)WGqo2C`LSZ=8X^)h?N7c#u-^0RQF)^Xpb3*iOIgYWLrTx znjyWNz2;du9XpVXLU4P>>3d~Y=sV>ed&%%C?y?6@5#;)nB3!5Y?5qdw-q+`c6`SX< z&WF5zdI>~sf2?u2p2i$%AZxqMcj*f7;Q#`d3zcgL-$>?d6=%S^gS`2)>rLa>3uSqmZHYl;DyCRQ zr%Z*r^zx|{vFVa53Gt=)yAAAHw#NwwWT}1ZD`}n6)r>1C;*fZGK0%6^Z+AUX#MTj_ zUr&`4pT=9}w=R(c#a$DHF1P*MnIdOSNvoRn5b*8%d|!t>ydh^!wqISjTKD?p+|-+P z|6i<@y=F_bOr#fDG&I2YibW?A{itJZk?6}$ zwNU!&u4|fx>d{qK=y>(t;e`W>J5M_4!NA<6b$G7L<0a-0Ig zGF$U`t`*hE)kI{8c*j#p2yr45byup~Bj`#IJ|_KTI;5S?h;MJiO&rap9&>tc{yzhzO7S z6TjuHXY|sr{sxr6W^@1CP&UkN+Iq#!(a$hr=9PB9uYyK>Vh)^cXU59}2*eb91<(G)Y;iDLrP{+3(ZdG>7>i z6PaSfXzw_QN}u0A&|VgK*9(^KW(~|dv%F{u5d~espaRPVsVWJ zQyvRxQzY`?UUy7sb}Yrjq}srVJ#K2wtUoH93hRU0>qF@>jB2Kg&!#74b|6d21%M1sD>B7Rn$Gy$E!^0vJ)b4N5tD||T;%!2w zER3^6jk$_TCzgrO%h$p;r!-=w)&5Kk_=d`g4Gvr;#jD`UyN|C@%tcrtexV@OL(14i#>+#_xj2=afD z6Z3@(V-@XM)=7|X%U6}%GMQTnj=UO|@&gjMZqGIpCGAz4Si%Fz3gjhWAVa@A$t#i0 zs6RqvEYrJzgvM&F2Q51x1eMlsEBW>8kKQ3AOc2jdST@lKcU<27yFS0Pd-1)ClhA;5 zm18+P<%e{0hxzV3O{^`i^be!K{2NcFutFvd7_Z-AraEf0ONa{&0RtYB)|e>O{k=Um}|!|)L<^cAMoZ62w7BJ^jG_9Je|YRqWO$uQ;v z*kFrT@weI;^4HH`6H*H^0dt>R!c{1=g(aY%E|v0^i3MY656d7K?#D z+QRu`)}0y`t~Bj03P#}94ywu9@y)^Kl-TT+v9k)#-@gtiL|=Q(>6c^=r~`&$IBdMr z3EC7kp55VqTnAfJF)Y`+89IAHK{JZm1svTMp*Jmj11Zj!nOT4yKD{<`>2D~3Hu&Eh z^w~Q!_qv3k10yei+e)c70v{hVFwm3;)}W`miKID~v9wtl6ETDJg&H=p8IKs1ScSj# z>gVS;eAeDLx@z4Goz&Atm%qs4d32O7W?eA}3f>ehaMowM4dZ4C?6lcCRLc2{4j-l< zgYn#396pI}WfPB(=4xP!IGXfC6&=X^+`To|WgY%7BK;zi7AEg%+;_hKg0j?J&&qZj8Lte#ve#H(O)w z*RZYnmKO7`(lAdIIf!cUMAr7m;3NI`)^zd>0O<0kz5yZApt@hY(f%d%@V72A!TO4@ zTV9n z-2J|i64B&pm@jv)mk(BR@W^W36>iUDQum@_Q29})0^>uE92Q@X@|z;zJJe|_gH69 zKy}|PG5OMGKONosft+i@>a>Zl|7uB#T+i%<(4BZcNkG=zhRy*wl z50zZEl$G1M`ARYJY4l&2Auf21X`0Y9OK3b}$_Zra&dZK1^Ji!c{C*%lUmIg{R&9$H z5|iHJhj-cLO*`Q60Tyo15T9K%9YCB{e0YyLNlkj9jNd<}&tKs)*TvwEDHSM~zy*iN zdwiGjLL=vhsE5e-@Or;$PKUrq8@%e_rgTBE$~wMJ;5u&yue6aCsw7k@zfS6Tbn zBIafoHnOk~;)B$`K0F9sti9?vP7oAk8pt)8!azMo2%iKCD zS0rLM0XWX7{V< z#^vnJOd-1yI3Zehp$XPa!kWWQvsXUnBAsm4T^7TTsEgvJUw^Kbol_T&dYE?LOH0&Q zE&%Gl+PTa%HfFQ`02lI-- z$42GfibZ5i3g-ZZWxs8uId#+x;(uii$Kb3U-}0h*Ni&SPQ^*{HACWG4iXy9QHKI|g zVobYQ@}!c6l`BVGb!&d#a2aAkvMI{qW}35*)Loq52UbJAc?1NQR)L)1pAQF>5D!~_ z@uZ@m2LPm$gk5=2W>+*mVJFyrPdi9(mpS?7HF9$ULP3Y???R6ypSU=BK}m3~1RrGd zFUP)8+=5Hx{^;oCRe)U6(0jBu>rN9B7mX*t$bD|>VKbBGl>=2hugWoz4_96WKXx)c zF#51c7usv`<=h5RrHaXJ?-A7RAS~( zhSI@z6IIup@ektJf;d#x?{4(Ao%c;8o*+kE$K$D2Mk02nfxv&C1<7EuzUqvU>W&uQ zhBWfC&3JK5@c!b}S*AhZU%8Pm-`0OUei!IzS#rB2!(H@Ta+PxJT9?dl!fvDPO*T=Y zEcVZsbrZs#2w zxeeu%%GAPc+vJj0T4)c23HQLHkt(pWWKpc~WruIN*+(14C&R1`sNT>?9qVo=ZhnP` z2_jha)=g~r;t1$?@7^{=_1(lvODl<6E39{1=p_gOeO`gKR#LrdSn5?9-UmDI&gRhw zt97Oir@ai~53%A455X1JYDuIt(J#N^Xo!nIrjQY>6oaqq8+oW35=%}7p0C0T7Pi#B z_+p!qQlfY7SUF#uH7xrOv-2gWW;p48@n8AHQ~ASjGhyMj4%fr&k)d`pCzGU{qYbSZ zj}Bh9+wH>|1jEb^2m4~XK)}rgxqyhd2Wre7^K4zlIY+eK;}tyO<|+t|ZskI>2aJp+ zS8W8b9YTDXbsyu|6!bTLKn1zEWHaxbDFx`{=5{?j9}zVlfRJ05&r03~$uCRP2)oug z3(Lqf%%VQ?YtON=bCnjc6ja;d`_D`&4X1J$4iL%E zwjv)GJHFaYFn8~l*=U`zrzL6^oXM;3jgzpZRdJ>D3K+aVs8#eFJ3kvM70vI@QRCWP zTdDxcpPZV6e2O+1EqiGRlrjgSc#T7ia6cs5yh>j!4Id%OwbOTgibj8!3Y#idA-2%` zFADr~oBWb>g&m9UxOLaYjZTSi0qYA>5+T>@5$cbvh8d;A98&`58zt0@CdOt5vTGxx z$eOywC&5I%%1Tt%cE)o(qE2%0KZBpd$>2@DWFoVIU!u;p=t@fMt!5bhmiaBR*=EW) zoUU1yHp~Ekgo!lUi%I%_pwlb~jB8ppu$SaSPt|xZH$&w{bD1C#5AU$Y^=RH924SYq z;GmyFA6s?(eS%J=iMr81lm-l-q3sUk&bDSnoMN*Qf1gKXsb=iE1Fxa7cYRyF#?|`P zSliwHTt2dzSXk5;N|3NgB{Z~}dd*Vn6>$-g9((M;BOo{xCE#PSyVN<;aMQ27V5;0~ ziX8X-@B*<*cjtEAx7k52kx|{Jec!pJ-0R)?D{%QVea!Q z?l6<~8<_s0=Cf&v?=munWy9mVEim00RQ-k0CkZ!@J;-uXA_+5M_5-7X+j!+yH9?Mt zmRot-ow2*y6DdugHWZ8raF5PN6p|Lu%MhIpp(i;WeQgPua2#88f(p#68vdTy4h3A+ zRlrTlhX$q;=HW?J0T_$!P8wcB0XBRh$iNJ{sqA6C;*K^^o%L0nxq=Eyl@a z1e9ph=L~|QOuQq0rfu@i#7R)EX(v%;@mAFo(B_`$?N=jL?~SX1rx5glDV>5?VWfzJ zyoF3UBPPHbmvey`&&_<>e!R9(*80k|f_t-*hJEBIg8W|bu zFkx{}3J`}fF$xHq97K$%04U+nnu8&8O(HlUB^3(W-!LFWak>#~Jm`iR#y-;8z>9VN zKA`fE3LPB|@uUftfv5f4zFo0jHJ!0zOIu72i%FC^3iZ3!*B4o3BFD4FWQ)d_LR#I` zo9gkFGhtbTIpG|e`oU%#3{_Gei2`%6jWaq4GszJE=u~{%qCy^oLV!O#uIUwhw)zSI zZ`fabkE4+cld%4+TrC{hZtc7XTOVkueKD_UAiCC#I^vSEc}_7)>$p)gqn2S$E5ns! z3P9D&JiGdKyoDw!8mUzHW3>j)^^`|fdEQ)d5f1q2Z3q)6A{04oF-NT*7Bz#E;v8Jm zMbOTwJ&YXZ2v(%JyP?kW-%Y~?~CX*B6J~t5wQ@9_I>Dk*EVslVMb>A^%}ShB*?H z1t>gYJDK{Fv?wz4E zHC}CLyE`2Ustn~AVt64^jU|-}Lct*1kVb1)z12zzPVR&nHkrG!#o+tZY(@yl8zk2$ zI8qdLH*^EVZ=ORak~W*q$x_4GpTI&fQ@+GU;Zl3r@X-?57k}Rtx@n^jk=dmNbDY4@ zWTtP(PY+FP6UEVwNLy+Pzs3$bZ&;Ez=-iYP|J-3awSe8F%Yng=$dV!kn-!%dBfjoP z{^yS}6pDZiH&Ugis>F{w)$(y;KMp4Ai8C>wNT~`Ayve80K^bx={@#-AJgL1Qi=o%Z zbq*!R)t1Yy5Rnu z1Iz!~S6OjZ;?Je@|Io5!O`6^>Rt$NGeN9BGzrVrS^i_5A~%VSbeH^rY2bdfT-ZmG-MI?2qiR z`r=V|>3=Vb9m3dx8p@r{KPF>N7Jef5c>6zPe_IOVY#enfF`qOa_|s%*6uj2K-}v5t zhZ*i%0ZGq>X$obZ=OTgFno}}$dpwF5G2Q(HbXf#+=F~+jurWq_-1ojqH^t*OAIRNtf2|H3b4dsq z7xJ{sbAS886DuF}{-%GozYStD<`SDUi)fE}LnDO|jY<16a8^=(qh4<<^*(C6X46?4 zKfyf8Stn1lKV%VK$v3(VIrFsA`^QiML}}X!8jZ}}jY2TbP(m0a%1(TijJ%|bv21r7 zNWiI{Yj{~moRscO?|GFm^amZr6SiI8mpT$!%H~Sa2On^QzD^X?yndTCZt-(zvAlgt z{N=-f%iUrXWr2Kg6X|qp01>nhCid9sH}!V-GMj0hNYDX~0obK7z4D>V*0+woyZeI* zvRC}`2nlvGai~4_d(w;=uBXYDNQ1MI33wRTX30M7bnYJ8-Mkx(vUq>xq1M*gYacRP zCU4l)@6S2!Ju#SB2b)bCSjDLP{@9n1=oa{C1?KB@*8tLs;zTIx<;ci-YB!U*^ zSl?k~XXCsOu@L>!B*GP%ts_DB;!%HtX``zCKoOennb4lp=&c$Aqf)J^i2E0g^@; zM0k5tr=9=$pbBC21o(>D)r4o!G<>1Nca!H!DCqGeDMFWV7>|}bPHR%pQ{+>KuBR;K zAXYHhk+3|ePQG$odA^LX>IP!owJhP?|5Iaqun6j#?O6img7%zeBR8fr^^$5GFVvoS zQ|A8ipy()#`>V!1+%h!o@TLU|y>lW!_p5GO#41vF92(DI;*st(b~LsP>Pwa3-`qKL zr1n*!9B0pzLU1w}b~eTymGQz@vY#u?6K2CVsaGK`Uh7wU3mjc+B=NJm&m95YwK)OG z%xSYcd7PHL5dA?o(SVtP-cFxOhEDdeY-I`CFcW-uJk%6bJUWEcCPxR+&f&7fO!RJn zNRsl#n-+5)pM6Kg#}^rL2!wcClWmv(mxIN8(0ydGv+aNX0Y7p#R-KJ8nmNPgTY3FZ z%?J8nY`e9e1nH^aIJF~$C+5EyfBt{?m*@ZTqY&5#f*inLpV!H8bNT2I$PPeOQc8o!Z|rQmvF)6V?QHCgZQ~>xZET;|wr$(q*tVYEzuvk(zg^YS)!(LS zx_hp^rYBrUK@tU#01*HHph!!Jsr+Yq{-^M;|E($;HgNwL1P3WC=l|^g1Oo8K6Zby{ z4InM{Q_Umuyc5PJ<6ujuOJ=U1mTS(#M4rHMj-zp5bH3>Ef6~-eoz;$H5`+?B8_5dW zKLi_zLKxHw-NXw1`fzcW@|^Yze#(6M+5^1#2`y94QF(%?x6eNHmu=6y0`-KXM8omPihM(JPY3_?Ln#D0$RB#E2M{IsiQS@3s?0NBVo1^tK>CKB-;G#6 z#$zKY=u4@sNCMIhChh}jD3ZWpWD<+OZ9o(wiJ}VGKO?>`ZTBWTM?oq0@T~sC%R@oA z!DCp$3mr~CkdRQLFd^Se6*G<-!BVY5NHP~GL@MD3iIp%q)(6$#{a(kd3fIt26{ra=YhRE>aOf+$qj<%6w4 zN@u{mT=n_&&~6;bJ;`JH>q__nNeEfi;<=8AfaKq0rGdZuk}+u+(pb}IImu@Sp~>a{ za2KWTM#?>F3ZzB!#>t`74l!^Hg+V-v!EEG`qOc6XQxc%I1c0O=EUHlzz7QZj&mo#$ zbFhaE9eMK5TYB* zgrO`+S*nSRow5~CYn)q4y^OO!JMUysT+-;oyW zAcC!y14O*>m>^)>raobs6#QV8qPt$`8WpROI^ClSD>ah)hA8?)4!~6PPV#Y@eAMCC z3J8Zz!#ufi-%Y4$Bla`a|2PJhp{at{!X{OpS$Wy)`E<_h`mp%oP9VK8lB{jzSQ{y0 zQ`s`n<^Mno0FB^XC=o@Wv7wMWV%{sOKN6m~;Wf7mYkA1S<;-T&H4rBUt-^yh z^s3Zev{u*P*7F(j2zSUc5hZy(Ggmm(ZgSm;-q2D$P*AX$P@nlA_w$gM*Ql-Kui(cLrNAk zzFUToJYs|qKV*RZV?O;7Y^Lz`r$EsQwlK04juNH)^#?M~+rR^_*Pu(eAo==*Zhv}Z zmdI)1X%1a*rGKg1fgWko{RobBOTq2nDNpnaRp4MVqM5_~r&{trkQ}!&^lv3d^3?p= zAsZkhMhSF?BIQiB0PrlP$B;$B;g)^XCOmCqL!qeVUJX>x?Cuoq_INFGbB!``gEE(F z)t7fBnvcm(jyVTwoKU|^Rd6&-X^vejJ6^t$sjSpVQC?!F=qB9{%A70eZ#899JW_AS z9;rSRP*>W#b275sE*E!&I{JGGJB_=D(y6S;|1RYqf^K;_dqcHRh3@MciY7bOPP*djU#(e15@oma*t7z7&}=CjRjqvAVt>k-%63YtbqRt;V)2c` zi+~t$z#Gwz|1WDpRhcyGn3DKtZEYZlbahQOI(^xFf&wD~`^d{g^Y^s# zFje0$=A5bKoFZ`R5$U;)l9n#$Dr|(*RMs6k@^X*V)bDyu(wBCf8!z&4Px*$ns;<&~ zx^vAB`-i$-tS6yl4H}S{wr%jWzih{^hxi%$GcLJMZM)VvT3+n-dW!fTd9&K7w zH(QDYNx8g1W?K1&5!+bsCjQFm`C*d-7Awob&*X_jK>iw+-{|33L zFr*Kyl^||a1{q8a*y@2!7VW{L@H@NOlYU3KY3}3|h7%#ljro&61PvP{VS<8!;+WG& zy>rbI&pPv}Mi4a(!ZaXvtWhiVSyY&cyWA48{OlzgTpKxV8+jgxZb`fc6-;b|-*@~Q z%#1H%3{FDvmbKQ&F0(l2Q=XsuQt=(WwvO7|vv0hY@7!J!_Aaz___TVP`B(g%;;ieO zNbgI2dF7CQ6I18vN$$d9fxi>!G;0g02K5xg+DLMmz5(YNeHFB}d>O1Q=_V>K+MW~g z`CZBOimRl|8cA)d>&8fWd<-=>>g;lVnb9XhmHo-}*TH>?W#Qg(JYs0|z`=btX40&y z5JT%l169{9Z+A&qu|VUGc0H&&F8)_DhE-20#WG!ExP#LfuG%F3Lf~OCihvvPq#7}> z2q`N{%H{`-B6c3DSQ7++VsJSm%b3LLYY)XS*-Q^Lg^|;Hw8k{N^)#6YifD|cbt}zK(?xGmr!?wm$kC`$7Nkxa(|M1*7QQdBe=|(L|}7;^VQ3F z`dO#)WB#fcWlGs~R^7CQ)Cg!>!(N7oC0*8C$`fX(0 z_$sTb#3{;vUL(}~uR4g+33Z6>$ue1IJ0+O<7B7?-JSW_8_lt{5?7_o4sxZJot z6_}=WiMPNAT@au6Ki6XWYDz}NQvdup9B60&H=Jk2RRs2(bi~gU=KU>`FXVLPA3Mu< z{KeHkRAFVqud=xC>EbGT#NJpbIK9~T)UCPA>d}^K{cL0Mbo^2TuI0|~rrxrI#m*_T ze+^3RN~34|s3&Q>pZ1+&tGU)X+i7Fg3H{Y&N4R=zyMA2Mevz-^XJOEOVf40k5%XWT zLNk6b1#BvFO%9xHf+$r(>|~eDMKQy!HlXU`2xGRoLnO?4q+h zbCSH3tC8LgXJB_u;L)1vj9uLW4d78-X1%x4dz)EZd(2(7S`V3CY(VMO-{kV?YIA*# zDqD&}Qm@R%EngejDzzf<>bNr7?Ge-IzQtwT9BC?BTws}|HxZ_Zy=7YjZ?z-SA)5+WtcKa7jz<~@H?^V` zJfs3G1w|yTh#LM$O&9QAMCUrb)ei{E13d0=LWeQ&3D{wC`uZ7~n;u_|M zW)CU9l9-p8IWJC+uLQYRgkHziTGP0Tml%Cn+WijpRv*rU)AY4k`C1#^Z&u#tl4e(f z$3<10ubyJ$yEg^d9CLjQ?{#ITXYf-2uC~6+3k^L*&2PLrPzuS5?qHhIGmoa0qK~w` z)22O`q{`tth+8`C?9p-yZ?5LNi{EzQZ_cgQSke0^$8~V+el;*}SDmk1i>fadNvdz^{Oq%bTS2HH1gJp(QUM29 z?YZ$ydP>Sja)Gu1&>6WCrzlERFSq>#@q;87h)0(LhtocUN$j5N~HS2S{CY=jRej5`i>tT-K) zg9#QY1|7AfoCKnWAU@guK>v>a+h&!gNWj-yz$m0F3BxyQ=zAea8jP}l{hPa+JL%}Z z5oKdz)5H}O<@%OqCjuNCtgp8VbMNc2I$VBrj?2**I!{-f?H4_tBu(e*Pah$A?N=4+ zZ66t}C>dR;y4tN=eC^M>Jp&WooBeyZYp)Xew#VoGwMB(zV&bB2wef4o6yoYpaChTp zPX~!hms1R7TXA56Rz}WhA6XfN)x(1GI{9#|!VC;HS?*!;9-4KGY^^Rvp?YIUpI?iY zf6miCq+4A>6YdDI6&Ni%xhhLO)Fh;zPAcj??|73$ulCieJ9U+~Ju7RB9>?>F26cW+ zjz7t0a|KGOvJ|I70s83pvg*8D_AfT`V7+Dl#HH(jw8)!Vf|WFv`!n!c-rB_ZP;~EZIhY#9Hd2mh z6DLc%m6|L6QOU<`?`B|QNp%z^%UmVGYq~h)TUUaXkQZ;c(|f{sS?RQMnR)kEX6X8OTZy>+rbKxjuO7Kl1WpF&ckULhdEXz)T?NJQ1^MN{eml?WfJR0r{w zc?-G*|1bR(#Q!e z;6T#rGRw1q37g&TUB90g@Vi*Kc>QY(4{nW6J;T|~*4KCUbh11Ns%>p`52Y$*x{r+PT3cH8 zFU##b^H5hk%biOP5rjEd)Tu`r|25}?c(mgfkh&kaJMx^^Rg*e!89Va)m{XIA^A%eH zYas7Y>29dmSlrz-*Uwzgx5-`5H%Z;HvB=-DallHa+aX$}>nmcd>)U_2`9Yp80GYSm z0cq0S!HMA8wU&tfRdYWIoZ+y}yZf&Ti{J{SO1wapEfYYCQ}O1YtGp3&kr+p+)w(F& zt81ScJbLU(i{-vn5c#|={PR9bj{sw$fr&UIEYFbH7N^PKOkeBqX{Rze7gR8Z4Gcs9 zWaRGORsz;@_y6iCsSMiD)cT-e8MGn&rCs|bzHb}YkT$NQG`0b?-BMe<+3zjvf^5ZS zzNhXdx0~20Zi6X2l@i)e6ATtti}ocCXIe(1A$QMY9bQ6HOu@&C2dej|KHSejx4hju zD$ZiI-Z8^%oaXZ`h@dW$mhs+-BLOGQ~x7mVJ7{A=Gh+!{!1EbRG}*5^8! z^SX@8rPUt}JLc+K(_VtvX|;GwZc0yrW)Vg=cUf<2$DF#Zp?e0Ku zM6rExLc4ogP`PP@z@xjtm^CZB~N0M?$^3T6?*@O^i42 zU#z6kX^V!#P-G03_b4}me~`b}&128;ZD;z*X@Bp{!*FBxWU)xX`qZCdSA(z#q86;I z`bRIDt%c>AV5Dv8WCl@b(+uFPeUJ*Bn+R=^H{kK-C?Nd6JGUi%Q^{r5O$mYPCmH@( zPC!8#Nr#Cp!#=pQ)wx(?4^K4l#0BT?{INRR^Pi>ssVjP6W%e2@`eETt#D$ z4q~7LvJyloj=21ofp}M={C7n+vv*#Rqh)+@&0Dm{Yf799ve>Z++w<=gz8yXrc@0KC zwQjism&Z*wSWF&7DbIe42HDILi)j%7QlWEFqJL}dRHYN(H zMVStzbj?InBxxZ^68sdm`P|t2V+;(OoAfUQjADBOu~(3OBwj#3uQbX8gl$abAXWs> z)m$gozwdvaE{S8->wgt;LA-1!`DVdqvZv>)a`MYZ^Dwqi{&yD3a6;%){p81)rNFWP z+dNeW5Z&7ZzKE`c;FtnAN&{}vPoC;sntrgF&k_sKRH{%#^U#>RaIJS}S$KwCh>EF$ zhn~BzvZBnPqPEeju)Nw;hl_6lwL*67N8Rc2eEZ=kEsk(QRRni3nof`Lz{ z{vD%;@evhq;_?1Q!O_h*qSo1AMtgMydL&84zBG7aQkUG74Kr=Mzh0PEpeufImrk>Y z2#Jaid^?dmhtI$oHHFnXpDSPD!j70kMVg`XLW!6pNuJ>l&LV{seZx$uA{Q05pZ#<9 z9l45i6dHCqRqOzBlmj9lRxCF{iVB%^^$)EUOwx}Zs;fBH_vUm#=JMugrD;UY=3I)0 zqpbDFXkoVfVmJy2D)iGf!M4ECG1i9JDaNAZQEJyUK^p%EMUR8Ho|VIt#!bT*L;`Cu~kz0Tv|k|kqKB39}%{E1St}c{^W=i zjmtM^2|@M!S8>t)4{hNF9HrRLE8AR$sS=tgD55?`u7R^O&2m>tS$~m$K&2uq3b~FL z&SeIoGko?>L-KD6IEaZu2MrvgrR!+X>vs5TlII&Y!jQh`&|CebT5BWVLXCDK0jGZV zvomviPdW*%O_8LAQ*?W1zN)sY&>p3qz>ijpwns)lqP@R;P;hf_L$0s;^%7R7A_)$t z{>_p`UKfr42gU(WqtRTuScoEr1c>C<#^AQ&;R(T>rVKKtX5;qbRWU_s!C*u^>yUnG zu!sdbJ>#c#1N=Uj{X=or@i3G^G~>yVfrB7pDV8EcDJmNzy7>w4V3Ma}@RD{eGF6ZU zxR9@9YKhUUXO!DymZHTY#{T!_XwGvqcSC6qiTH1YjmWXIcHFGyXBs|#{J&EMpuF29 z(Kt`S|B6$9Nd2#0KVqqD(GjJ^ExhT@w?0m z)!d0DX?&dFO#K)ZZ^GAUxh-i#&NX06t5g_Lr4+IdQ2pi&X$S+p$M|4}h-3}~_7K)< zB6m%Q*qrSflawIb$V$tFS4}WaotN4&WL%uvt_g80-C@ZEl)f}FM@>g&LaOgrI7{|7 z#sAGKO}yXdvTbRa>0hVVTH0b#vLbUnyzxXN$Qt5iW6R4^vS1J}KW-LU{*v!e%|e5R z5_LGHWB~uRk~5Z(JND6ml|1bQg&Xe1lh;2o*E>ZX*F4FAT^^@5&r2DF&k0wbRSb2H zbkYkz^klRY*;eyIU2{c>TmR|yqS?ep&ZMRXT72!ZiNotZMHYxam6V(SEWB~R8QE7N zO02;g>^biCR-nBt1-s#>KJC(G}qiJ|Q}GWzPu4Z~S7q4KcDd$V4z`vbRG>p;#Q2)V* z955oLe^1(B{6i=Et{cN4hNVMo4$VZYpD+zR467+{42!SM1JS=r^SgD`^+;_ELRqa- z(mZZj{l-8Avh)T1kI6^Ew6D}&P}nK ztoCyIhdLXc7&XVH9|`p9OnXW`bzR{K-)aHp7A|rYV5Abdh!Lk&kYUX2V4By-P=JPO zT)=?ISoc1!5ehR1CxmRjV>Gtcs3`wwb=m16B$eX21T!uze%{*^%MhB9s6Iz}mb}vc zSiv|r#Nh_9oG>E6KV-^B%TeTCo)fGa%m1BpR-_}WW>kln8=m`vPYFRau@PhvD;o{$o2OB}u&#HJY01!!mP;?t~Gh|EG<6F2(!yRi*=styJRv*zwL8Sr7ZJzi96@zI-{^p7fv|=4(4*Zj8+IT_Rc;8>8sd>` z*I4s&@_k}KRCt!B1n1{_D7cFOz4n|q9lGwVX)Lg9N&%B=b;Ls9^o`o8w^rS=XIWZN z(1_C%1SPzfQ5vEzbn>mWg8gJR*~>2A7H-mTuI1N~(@_9v^-5yH@$J95imI};z}>O* z_uRhtiK>Q)=d}?$Td;qQdq+fuNzItVi5(NVRy{8Rx|9p-w@^+t78YRt9&EWzMh}uP z@D6?&^Ywt&qZE0g9(ua$`2%z31~O+Da8yuUj`{}a5G~c&Z5MR=%&X^-feVG)!43_p zxQidRl8hD7N|<2&eJY{FG(w$h^4dm;zq+q;Dm`Q#jP6VFG9e;iWYhg}d;R{(`Fzoxf!|GVm3{Xc6N zdM7U<$V80;lzr@?Mk*@FBpB-tRlUuu20Ck5?%dY2_}+p$cxVB1Fx`z#_VCq@o#1O4 z4lv>s#?J!81(#@3mgNo3`3<@j>D^Qg+dZw8W!9Qc)8?8>)Q&vK?%VLJjw4L&yCC=T z38?DSG!nr)bH6~88t(-G(q71Yf<|~=NhXo#-Md(AeyCL|Dw0yjB|rNU_UEXH{4-4F z;#VYrv%ccAxo1zr<>qK$<6l^nkzXX?=EukHFK&g;rjz6j_V7?1B7_@z{l>GNY)H<8 zxEgN(u}aspiJ^)($E^15q*BRRf{6B@__JA z#Oz)B!b?3`-c`x};{vkb7dfjP6IZ=Y@~+Xz#~a}#<1Ll&iky<5+oX2jTy~{h9Eu07 zI_SPoA(m};Zdf%%iQ+88a@k9Ye7Z_o)u>cf*Jw941c^971l27yBR%&eE3vu(nKRb` z9ACg`ycN9vuwJIPF(`1*>^hv10+FD>wA-ERE(2OX6~!n(93R6%lOmm04w6oXcm$&a z(^KWjI8J4qs$MZwt!>|?{)SGt>c0-)3~R%8mDA>#{%K_NjhGb(JIM6&vUWUHXX17n z-H^BrB`v5T$c(h`>)98n8dN=*rNeY%E0b+98qb}6&8atpJZ!_DjA0mHq(z1trYq=+ zjE}Y(BiyL1p&^ND_b`e@p44xeCS4#>I3{tqzhiL$GhrVPnxa}$++2@C`rm{EEwq9c zX+%c=w?q7h*e?Mf4v>H=PK?x~#sXRCvHPuRVw-Mf@ba3;F#y`71p`g0hz>)3U&fR^ zFxBVHqiUsI$)eOYWtDoGb`$Yw{be!R5%Kb6h12-_+c|`Q@iN4_NWhN~S|12BL%$?| z8`)hB;sl6}8c zL@d6thZ|PNL`tu_)W1>4Q_3cU`D;oZ@2_O;EYVQA7IAsu!1kX;2>S$`(7ciiz-S}q zSUwj!b;u79fcnk^g>3iD8{0IdWKZr|oCcDQ^nWW%+;7HQ! zF_n!8xqvX7XuvXLPyRs77Ti@XDqZ*#i7w-(aKx})=_~AYNZU1Rdrunr&V@3IN7>AZ z*fBD5=>BLRLBV6GEZy|qgwvcU)XaW~Zr7+xzk6q9G>Z>&($JX`bxa$QTXu-RBQo`w z4Mmx+Qc0()xT_y_f(G#4)3=YbG&=f{%}H{?{~eBI_P9Y#vJ$EVl4^c~Py~L7j+1JB zC5#MFL9$m33@yzK&acz*(5%qIlHybWtl*MDHLc8~%~NZ32bLw@%fi+8Vo(yJ!BYf! zfbX5zBwwDdabGb|k5&$*z&#pBld_ShDR;R&dJ%rpZ)rMe`isnKaBhA(cx)d1tS%Sd zhi7g`h#C@57uQO&e<1)g02h$g5D~GBW)O9VnZa0Hn8Kq1p;uvgZNl8D+}*=4l!jXS zL^+5iM^Z(8@*bG$zd3p*Y#R~Z+kVz<8}#5}2TR~XekfwX^BB`71qVfxXOT$xRHno@ zhb2Tr#fZ?>9$cqFQkZ1cf*MdPBl|Hm&?=!!B9FPU0nlea zY)xqB)F6hBB2uKQ+EA6JT>Hr^Zz1fGjO~LGI(@S-wx@J>@+AV+O&J!k2s9{U(cI9U z*e@kEcm*Fp4?<&7gPQ;9Rj^2&V=DvMIYfmmmVy-=y*q#7oO&+SI{Y6S^k6HopZK3; z$t3zta97sh5C+)9l)?~zjnlwk>z!6Ae+I~Ri3d425LNCqM;f~Nx$FUNL7EIy#ze)Q zc|o+NH#YGibGgqt^C~RLRs$S#fP9VU3ZK;XrgwMf)R2842W-4I{d2DSsFBhmzU`_L zJ=O7eRgSv?6iNjk{nP*zMDP*cF(F>9i;Mr!Thiwwaq#Q4R0Zh2(WlD~GBgJXEX266 z-?O|vpwiaXROS?^Ni1?!#i0Y%7q#?S1RVPSZ9Vx{1Gvl;hizdgm+yw@_dg>*1&}iU zIRHXf%vaN4w|~mERu9y2dC>CLm2?iO6p*z?Wq_xyCu!oBIJ=nsfxvhPdM%%MN?+$; zWTXEy=iAQBn*(===rdvgY|T6q6a_M+QqQ>+OzfLnARWt#(kZW>#yQt}W17iRv2Mm1 zcUs+f5SHHxJm@mh+~W6T5HKUm<-w5s9hF_eUs&C!aS`snVWgfOf<8uJ;uv;F*iiL0Z_U5F>De91kS8tsygKTY>75U4Duv`|GPm_4{7q}eBuY*#067%}1AW<;ECR~_V4vxpu&-q7GknJsK|}Z!fdFCc(8>fblwAC5HVMzSh!Ll^X_!oI zQ4@N6NGYa>Wri&Mq`H@_$2x#PJ4v)VJL2hzV22(C41kmB8Nz6F`<*P$AWO7B-Y~hs z;9l*$$OrHM#ahO`#|Q@4jzAV@e@D&;#PUn%frrB1=SPxa`AV4ZevDi3eV1e(23PZz zo!+@fzbas8%tz&~73ad6UB1#_I_p74BT5B85g_oYeV=gR5eqNe~1ibz2cQMM)%Bs*I-mPTH=ph46=MTzQWTX)ClBn`CAnK_PFwX3IBP6MR6#)2& zc|FA9z=OOsgGPys0j_)=e@FeUm&NG?FQ^9d=W;1C-r}swy z&OdF0LYEdvs-|(ljHe{;Hq&-bM)v}Pe&al$%&=u;Cyk6zFcBg`n<>aJddH$VO z8YXind#uKe1S?Mor^Hf1&bui_Q>;9}P=Wv33lHS*zx}B-2+*o9X>?EK4x3Ib zbzy$a>*wEbsyM4@I{AefZV8`7uvuQC=nUV%>OBK74lp(Ma6+Vp5Qg|F&=qi$nxKL$ zq}bMVya5e&pQ&HT*+uEaHe^nLZ4PRo3=MG{@ZqeD-g1xvq!5T|fnUA&pZtT{-hfnS zO$Jz04XBwWJaV*azq_y9A8l>cu_3Up9*9%1W7LELZTGDq+5R3%}5{h!sXn zLHeF3MnAFjYK@}$rDrepEN=wa@xwpv(xg9-@WXwPN*(p;!<8%dX4lsID*YWZvL($L zGemW}vec#OM9%S<_SfF(EODZ##6WZK<5+t$RFIJnX`$lE&paIR7Jp2orJ<{SBvCdP zDVs(MG>vU$UhSA0T@vRdzKE6Vf6lU0Fudn677E2V)oQc^k5H&lIW5Zs+X?q`LT`kO zh}n@j)rKyqoMM-$Jcq1n!-%cvSm%AW5jEB@%8$~}vBvDJ{h>u4h{0IcRjb0z&A7cV zlwfCE6^Ka?8vw0Q#_9h9;1e;Ul^^r-m>?b*C5(ZBXg*T{UF%Mh&b>Cx8I7lk=GqUT zX>3O<0GiNLsiM&om?*Q0Ygc%UqB`a)l7zFREt{qhCUW|M$2N`j%$roWed@SY8klFO zN&nH$SV#;q2CZdH*EN_Z5B}naR}%jrn`!By4xezAK8Ow1oJxy%G;sP3#g=lau}{os zPv7BPrTzNNxALCEAK(oz1zbad#sP$+<2_Na8~#v~cUplHo7DeNW><`=XKfKKT9>N7 ze@-xfPSyi*R|@msG5n!JZ1e4b|ISVcR=;t^~$L{^-SITOQ4L{&seLPYYk;-)CwTK+o!CS+B}9 zI)P!4WBf^zH9#7rBh~Ip(-2`$V*c&q|0_A^WT*|N4T93ULAn%4G2AaiLKDzCG z*21}I!D6zR@*K{Q@*2h-_U^@L#^Tj=-um8o*2<-Rvc@63EXY{hPQ=iCtLt*Se3qij`E6Z{m~ z4N(vPp~4XlQPu$Uq1lYM%L$gxI(7)w3mRuDmMk}JAli%wE-HzGWe{HtXt11V7Nsa1 zv(ydA0g2s7=2w_Su$`9-%zh66UTw4isx!5Prz@-sVkYQFo+4#Pn(t){o+8Tt)#ut# z_CNEvY6^bHsV>1%40M-_PE+LfEecVs|02d>W_L#7G${{ik@K#k9Vc5#JOdA+ziQn5 z-tB}eFM!Flog#J~zD-bR9zt@e2A?H&qnxncuT5&YLom785 zGF8-n)tXCaz=ikcj1c8qU3efjE~ylZy4EV#E_$dbQ2lwd8CA>@RMV-uc&RF)FqeGO zZ{gwod`(JvaTnTZc<-gwSvF{Ga_vvD&d^}e)9HSm8jhH^*G(hf{n%1k4(H}SMFp4A zZn=;PyE-X~XucW8nk!e=yXppu?5EHf^8KkDk?~Kj4Mq)MPAGu(>tm7|af^c6AFpW) z%Zm83{(oEmjbpQ-HS#^pNer@8rb6VgzH|isMm#Zp2g-(>eDwJ`7Rg$p5Lbb%o}9y( zN<)z;tM)vy2^m$3CmC0PDH*YknUmU+lSE%n$i~9#WN=!-`rrCucP#VibB3|>Rn=4> zXHss@QzeP>wGV{c&UI1WGc&>OY&w;{(>a*N*XC1uFv#ywZmd5kAZGZim9QFwMkB-a zR-KNyK*@&?_;zlkC}cuOCOfHIMZ-~-qYCK)u?YgL%=DHv<`R9^hYio5q=x4%*HXt$ zS=!o7B!{4QtWDk&tVLG1ZN-Q)y_6(@4s;GS9V9kt_kD9YyJ;EXRrpUKLSm)WtFz3- zosvkVIu6tcthIHzmJBoBRB>9l&i!})z|5UQ;$vNN5sYds z$>h`JxI0$4snhkmI|J511q*pR_1;iy3k&$|Z}k_WZhAWW{;GU?bKiRQJ1RPJ=bke7 zbhEqfOX<&I_F2$&-HD2yC^U~J_u{e^kPXdJM{rH<>(NDDXAGBg4%fVyZK1q2SC7q`VNf-;?pDNRe|B(r^(^N&G*@4^I!;Y@$1S9x)A0~o^jD9$dFh;g^H=-VVpIBu zxlY+*_m*1Mmx$i%Rx@2)b9Y>J!{tFiO)eC{^q4eU`HB6_&zb@AtT*!KOzYB zO6%OhiOLO)PPjiu=o}y@g&9Digb229i>Km780?~N7DZse%95<nD(Y#1Ny$phRe*`uK3hFgZa&~6dr@n%^oi|#Lt zdllzD9=GeE3~!y;dL63xpN*ozu7TT;^Q&J54!|Mi!sivfhgQ~uwTh=msD5hcT@S`y z3;W?p*&(h|T+*(_UDkNPBPkT-5hfc~x%xAGRrYVX}Q)BOzNESb5*lyY>St&fxYhB)9lW%K&sH;#3Y3z_7mU)|9O2U{Vy zU7G8jmrD~ngXskW=R%j}SVX@2y zuLs)KP`B#;Y7ouUt-ND(23sNJH(SeHnaBK3gJNH;)6}m9Z$5cfjnl(#Q+`5AZ>Q!ag62Ym7k&q-4#>-J z+KRq&^A7(^cwTzn^sMQ4y(+2fza$4sb(o4I{lX@P=xo&OA$`?usTUPS;RaTxpFE*W; zXslVs_|9xTpC5cS9SIX%dYznVZl_r%1XcU;3BJFYvr`-iXXAVBji>D*aTmjGKYLX? zHD*BBGW#z5a=ynX@u)T%RwNEbu+q6YQsX$!3A2yQfWc0!)y350I76cw?8^|tX(v=2 z(3ju{PX2wGD2fT=?#!Ut48MrYEWODmRCi6(VYJ)$ScD8bWqnO*J=;OaRlPz1wcW8- z>7D&Ia5p4d1D&VSBLqMTAZeB|d~G%!aVv%8VSf_Ff^cy~qcQXd50T0%MNeilk2SqK z)NRIVWNTv>sdu5_t@GEhTzXZ_S@g2cc`2M;cI$Gp?l^jH-V?0$7hJkqi>d|JmydFC z!gsao-YuI;Znp>tKOPn%Vd8dca(`S-qTHp}+v{~b8ZL)0=L%-niL@_m2XIXq_;PUH zE;U0{PWx{twY};79NS>sVQdQaP@nc%Gk;neH#q}pF(*3svJDVbb0GZ$GLcF|HH&^K zsR7pyD_YVp)m!?HRbjT`1R^ zMZqy$>n!ds?FT1M-FkT4&ky%AFND?*2s`^%75tw@&M&*N58`jz)ezy@X^m$p(x=JI z^(MFmQOoxvhz^X|bsAzR8EJeLQW8Y8D%-KwF&fIKp$k81qF9LNzfDS*SQ2L*K}=C> zRGYHvivLyR?o>`{Kk`*VVB$_BYTHor+gH(fn3WZjr~Y}{{XV)dbC%7l(1lX92-nQT z?EAcVSQujmW$9_|`5M&jY`xtjxaEDB(RHYr&6z~vRZZ#KPj9K557*~QnB1|z+u2lC zB11b(9VFX~njgm?AT0sO4+-%JVW&#Zpu8iJLrX!c8-rNHVHH?BCP?E{B1r9M>22_D z%~uQA@N(k?lqS0V=JQtc)WY>(pHXJTT$8ANg!i{j!=kPa69{?nepkZ1f|7wHYNuZ=7Dccphx*(UxbUEoPur?j;~M$ z>n1;(k-`H-l8d$HAJD(&70=A8e1ru(J|zt9M#pzJj}TRkvZWEP*3r+^IS;Hd)~tSf zqh&erpuEM8RyJcu(QMT+j80HjsUPaJ;zD>N2S#%y_h6qa;F<^?*-gfDIh*&NCtWo& z8+3P@kEi@sxNaVTMBBSN{XM3eg^4yECZD{Ux1arnhtAx0DKlX7e?wF1n{U>lo<=! zG1ln6k)_zI_F?0GTuRBnsrG5NzB7M%ym&tS?7HA4K3}_E{g96!@fGfVyttC!o8GXf z7J5`Ry?o@Z+cO78ExOnuxzJ}g{3_(27w>%$aqvyWk~Lua4`U?L_Ts5LTOb3X$%f;_ z^oQi$)Y7#KGfD+4wG8z<)GQ1h;%9O%)pOfE)j@g}mSFkCaU%8A2piMUI|lJt=@9YV zdJe5ER!qkwh&mR}2v%+%qT%Z*oePA%8@*2!Vt{_&A1+d*NJkrl1o9`ew6?)jDT=Yq z?@n-eoVJ9wsz+eEvJH2;k~{I(0bDzV$WC8tuj42}DBEJ8KoklaK6Vo-u*^5YwG_0C zc6x>RP70wGb4eA=ugm-6*`Svk(`u%TS0|1Bd3(ignVn5+&L`^^^vhRQnqRB^jI!D9 zHFl>T>%cspS*QX4=``>2mx<`w@*B^Qo7T9xcXA+LYi*|tA2R;6*Dm6wU#qhsCSnywjV?mr2-V{kX z?v9T^>%y1+{U++T+~ePA^Iu$dx!qgq+q6IY!6-mdeX)*tuEl<3m$GO}5y6mf-4VZA zW@7yN(gJ#)ej_zE)&uc<&r_x?Kt z#;2b*=#y%P%&)~hLxQUrY81za5rzJyVfuU6we?mkHn(R(lg03AS289^0LI7a+&(`y zF7@_{Rmaz&BHt;vO)0(636k=43N2<$oa8MJfm?m5CW6fw&2Xfj%6(zF^f%u`u@Nt) zm4%}CR!G8Tlq9npYPTD9L(jI2-se73thg{B?e?Q@rM-FiG4lgMDh{>mwi&Dtfxm^n zuQg|14nK}vvq(Uvd@eu)#Jp?e`nT%VnHE0+>0~u2yY5+6^kj?sKgik5ChWEw zVM|Zq?+s5mTQBJ!pzrl9aH<3P!{w3Ve!iSpRJik5;C}w5_)=)4@!_@dB^+tlOB?K2 zjNzj%F|mJh9B}DNMl8P$rDw(c!mnQSTq1k4Ve2HZaQjTvss-fAw#2m&;iw+xR)DB}Vg{?=knOYe7jf~gJE{x?fV|8jKlh1HRoEiniw3v%O*EO(@JX=M3|WWKLFrBAHQj$=qVFn)Fj0$ zYLYC7nj-Ndr-;1pF(cF9emv8s0b}BjjWUu2BQb1iJtTqoE4Nep_YQ0zJQ8SdM-k{&hoRC)I1SAoQNA4r93u!I4c{>z!s^VbJDPQFuHvh7qx?8wd# z&#EaGWm>077+Gh*(Ugl>{-qKC3vO_wwRu#dt95#h*1LK-BW`#{ZSj_q1MSbgHM{ow zC+p`f-2}S)?#B6#?=MeXzCSbc*6pFTmp^N+IPhj(%Jjid|EghotB71a+t!an;3@Hj zOeqn|Q-Mn0E9Lv7I;oNxfmE7KjvUxon!R$Oz3$NK6N9I(Y+Sr_b6YweF^;--44cA#~t?X0^31nRip=PB<$whaD9u zUAEGgdLX;<%z&w7QY_qvc(&9KMWE{aH($J-t^pQpKx7$XO%)8F#|2F17(jvo2Sq}& zmwnz4kZ*HQfo+>oB8T?o1M^>7vhz$|+llw)C*J&Q=cem-p4$K2kIx>x4;?#v_s6~4 zKfk?h`r`HewrAd|$lv%}O4Q)45bv5<;4OOW6s~7ERS?iZGt+cY1;O1W{GbjBFQApo z@oOZR`Zf|x{hEwT{acLK{;dR-Uo)QJRg0xM7p!)H5=7nzL%RHTIS}@rg#i+4Y(nD8 zB?1?%vrT+Os87ulFjxmmGd7-XDn0mKZ{x|UBVDh23R?Z^WBsQ;8t6Fjc2ni97xPjl zcSi=+PrBKrH7m?C`2xCYGMi`@Lno*r03z8WyI3=ZTdJi{Q{-ls))Em|H<_C9J& zegve@4_j8Q+?W`8`Q65Wh_$-G|7FFqGLKN8>VObJG z10oZthsNuz(bNB%E-H8}3m%Ckat#Tlws^8Mz?g0mPh>h~l3339M3zfFk?E9c#Bj(W z(ADV#nmQd%Q)l354%s-GV-A+;kc~01Pd6l4#iEQP0Z1%Iy*eKV-ZteAuvS0g0sDyvzlYH&C~g5(|hX6 zcD&Hlcll(y2xB%}>P_iZ-g0x_co(~bQmub^Z$`qvN=?beqXQks&o4|~xVCfSwL4EA zy!#_8gU+3KOoG>80-S;gaO2zg$@5oQYxkeYN}M{YkqY?U!!C5mj6asx}u*I6L2s~XbW(v*-8tW`m4#hCK_sl7TKAkHF`Ui^+yG?&Sxc#9!K(k z>qvK=bj%dQ-T&VYHvs{N7ht2LW)lHvbXq1619}!o3wl;58+ul0TRIjgYg%Rr zOByC|Gq|XkB+RLqB(0Fk8p9}Q4GSMA5JW~O1}6chz+~i94F9XhaKB?{Bw^y> zS9A<^vP!Lr3TPV7Ng6*@n!Wob5|Z36&)ItiV)J!z!^h)7+II$d)(kjXXVx2Q2WKfs z+XO;s5XU5{Mvvi?#85B`ph+2cP^9!o9LgjBf5wi)@4~zqHp((~p(eUvd9Jp(EulV} z#uCGO_T?n+IA5B*=T1%Gv1c2LPrj@!IP$n4WA0L1Xxog7ZAP_*vST10x2!raMd6%+ zgxFC=hC!3lvS4ZP!d&c9>OgwaQgsctGmkF}_O9$qkMG@8frMyCO#KL1Nblx%yeAyk zvl{-uwRdTGWpwDlv!>c(mot+G_xib34w&i0)hSE5=ZN!}M+Hl^ZdFTJ zF*83+Mb8v-y_j+r>)iHW&)SLPNGKA_U#cxTdVh1>#pmq}myjg=)ZMcDg_B9qZDSrz z*){rF-Z7G*`u1Gx(wfXzJ{fpTASu#fSb1rvm^hL9V?mKq(UFrGOh8Wvo!u+Zx23kI`zHWuh$PT|)xqi=&o61f+sx3MG z7y-cTtc3Bi(E)8s-VSBkZH-gv_01o&nC@JVz$VgB$tBo?G z$d`bkp+rIf23mGOJe#KbM;En83~hnMjybv~Ks^io8RQ zEAkFJ$WNcW7#F%_8Ua8R0swzrE@>5N43_2BcTPr%!qCyM;PE&SSqTvxOKmmxNC%7L zicp`8gX`i44^-K7GkDV>aUb+d@tc@i{?w7A$ zx}1^FzZB?Iw#D2iG*wQ@*nyK>OaTfOC<+=z$Ti@C5;mHGnjR`stKb9`j$bt!5rukD zR1gYLpb$@rre{Y{GT>2^SgxNg3Q7h}3N!=$7Z)e_&letv`Ed~Tz|Ie1S^pd75C8gR zkwr?$%t*&ADJi0BXJHhU5fND1U6eh2w5jIwz4rRcubQjRJulDQdn+|+;JClbhDmFK zlosFw$%-H`KN5c;yP6t&v6LtphTnM@q?BkHES3&0#EFyA66M!(Rg!Xw*H;TGw>8S_ z@O9cS9UItlEGvHMYVo?=_e!((-d&$MeI5b8l#5+PrG~PDFE5vrB8H0YHx8awU!Rtm zkrft(w3wljzJ`CAi*Bu$)yQ{UdUoA0K_UK950A`lKBAXwV@@ze13yN~NP z9J-L6(6`gesi@OHJ+wqd*gBSvUEP%pD`CJu!!1LNct$h@hK}?*bv;p0(qfqzxkZ4^ zEhk~-t*h#rZf%rQ>tR>a7v|lxkR0BBA}4X`N@4oWn}rz*SF;jEPecYbjyYMURUjKd z06&kM1|1DEI|<4E+;vxh`89A7dpC*AI>=u`Lt+eJ5rE?73w|g5`IrCqZxmx1yU@M)+Kc{< zo=SL)gK6HjVE3loDG|dL)~77oLO^f_I6JZ60qnp7IQa5#NytN|)bG7IoMT|=Irs#) z6%COc}oEX+~xHMR0^sw=;Jqh}wMQz`&a! zn*FvBcQVM@;UOXm3dKrE#w^0YBB`q)XBXt|m{pybvTe4x_T;r8Bz7L%_LR`wdgE<1 zlAI-kb?tRB&+XEX^(_$PHV(%#%G)wv_*9TMpO1_b{fDAS;Hs%9S@@V}1ywm&6m3O$ zOhT0MA00@D`haWy~*>vJccIwbx zf47QlCfZSz3gY$&0(ect1BhzTVsJtzat!?+KGA>iX-P@{3|Q!BnQ`2BNfjA!V^>`@ zpHv&;-8WdiRhh5P^OW7^P*S)YYKWlWUqvgWwiJ@noc8t6t z^mW{NQ(e6O$GFgropvS}t;!Ovnfy3yKNebXQ~0+?vdi@)IsN)OlTc8h$muy~DDhIv zbYl8EZ0c@Og4XeR%Hh>67DdBALCB1qx>1n2ct1C3=0~6`yV_>fg6rqul2rI30KiE$ zj#)%mluyr1UCwhIoRS8(Zk)=98$MZAe)RVC?mMp+rr&)60PI;@UY;C%@~W-r%#Hla ziNm4ZwIe`xR+Dkh5arePf!aNiV2Ywqzs2|Y_2>Ev06_jPJsk@>lGCWkOPPBbXa;6F zn58!&dDS3L8>0O>4#fxco`?_XIT7vGzCX})!?=T4+9oY!_ZSg=RbwnYJI^28&wtVW z`2Zj#YPwJ$3kk)DEEznCgi#cW;nxu4(m-Noztmu#iuRKA(+7Gwe!K_A@UxR|3CO~E zRa3ejsxq@S#;FYoVvZ?1Eb5+&7-2&UIZlRxgpLzh0sr{j$ti&+LrKmoL{G)5g2T#K z2y+<(s>}N1+Zku~gnG2@PmdhGx;}a5{hWm9Yq3G?OD;B9^#}lhcsL~$p%MIRuZ{qx zT0F%701yC4L_t&l$I2+AB*d-hs3hr>WU3Wg>uFauloZi>pt^Y9kG&n&pUzFa{s1M= zeY;myrYD}i?cDssz0$n-)6s#gGfw7NZMw<<1v0`Gq0r32%)loDeZ7C;sgnMDef`TP zBO@clGO%+A@G594%h~vw>V@aKSm(C+yVQ(_d$%k_`)@rI8_;zWfDr20xO0^gl~4u! z)IxkJh6n(7|G{zhKYQ_m5fdO16fJZvk(1EzW5{rFEVN=qVto2OCOVUx*9aGKIM7I(aesL~a&UcPvKO0000UfQ*C^LWQq> zcv2E_Dl!r(MhX&oZVUxZl95J8o0m<^MN!--)j~J9)!(^pS5nB}rR=!byO}YQSEKy5 zEIC`PtB2Ao0stjYQTW>DqNZZxV8IG1^5a!)WkqbF^;AMioh|aZVuITi%GU2Z*SY2L z{ppDpZ(;GnLD<}mS08&ju0E+Q+H)y6qGykneM!HWc1(?mlv9ETueKA=LTIU3ILXN< z{!E?wPkr$e6eu(^6PJL9pqi0}vP-zNaeTR#V@Yp_SN%+sU)#QzfX>6P_`|(gb_Y0b z*x_cC*J-93S*#*!7b3``WWdOP=LdC+Kl5H|_8SID2C!JkNoY9GBut{TC~h@&1{o_U zL9-AGgXogzkj8S%uIk{0gvjDo0EVcma?=`Cj+)f6kzU1r0Aq z*uqUk$|^-q$*;r7r066oVjW{`oKO`P-a1xWweQTx!2PGdm)X6zOgu4d*m(4Zl-TZB zC#%dR6=}D00S+BsRys*DI!bOOIP5}^Q!|l$^+=ppnuD4#6>#QBNT}G*q)b9cLaYG| z9GdbzdG<&c6zI~hC&sV)Otf$3aX+W(3Ft#mkh1i_<3!~_Q|I?y9RNUuX23B}b4uW_ z5_$q0nr?EU_VGp<5#_!vWj&cm151syM=!zWT3q<}dEXL&09>2lz6WnxHlBGAqNGiT0GE;x69bnJ=ns9b=MP#x>}-M(G7^S%#=1eN?hfl)!u^`2 z;zPR+B!>1KLqKo@c7I>TstG5voKAC{m})Hrk7Q|KBX=GSX-zC0J1@l=0KVN|ky4Oi z7}2B*d>C?eIYugBBP5*hP!MxSvNKJoON?yav8m?Zxv`;#&-N^>5IHkD#-6@zsXuvj zUDEa?5Bq|xT8jSpVmu~cct&|UB!5uHpjd<`$f%iqt2X@$`&YXq39$l2P6u9yj*3%; z2d8AMAnuT0su{b<&9Y=Hz-iNNf5+Ng&KB!?4K;%ErA3Y0*ja>R&?wAT%Agcz;NH+s zvI#NL2&m$jD%s}6*M>}WVecHQ7Ahv6cZGZZqz2Wk+ z^4vYwp~K4GrFzubFtJ8m-Z@&BPt6SUia@aIdp&;u0O$b8OPe}b7)50Hxs`Rsg?8*p ziyl0l8Z~%2KDg&-s7KQ-Pn(h<8-tV<1C`(+Wl8&JQ9f-4Jgb-rJq;T-2!nmE`}sd- z2msK?Vr8ZzV-%pF;8bF!7Bk~x)$~=8aL#~gL{jwD88{poAAb03FA^(5#bkQo<-4}# z^LO&n$B+2CRt*_xMAgU&+b8qkG(1@7MD=LUI58vyV)`q$K|(x(Kr$-YxZtBe^I1pQ$TOmviz53kUdh_*$q9YHo;>XX0 zdpFHGS*&XUQ7V{BYd0ZZ4A@f z)n$AN#CVKD@l3K7^cYTQ5QF-Qw}N;Ca%xHn20SyppppQmhLeJ*eS(fcaD|ClT(hxS zY@@b9K#`oNbvPeh$&`_vQ}}DHAMy`!Qc8LX5?T&QQf3i4G_MK=qa3jr1xX?cLj5*$ z7w1jw?`-?w76RxGOA9Lq01$AGyj$*XzyH3m^6YbHiHr;0y4S<5puf$e8~zH+lMUa(MsAAh-H?2a}v` zeU-3EWMfJZ<2CT%W|KF8suU#pUj(_<>|1OV05mLAVxNjC$oF;Gx5-9e)`?=wyn2bRTmw&krdv0*u$oD#8^FglcJboiU3~21={bZ zPz)R-f4KxkN&$@{#O8ZeSz}QiLq7!($5b^*?*dgxuY7qC`y>$_Jx@G~q&85H$-ml}{DrPcbe#0ioL?far%&qIDr{2b+l8Z}ME(tv1mScTgtws6i-%3gMugKKK!VpI2Dzez zIraUySrx5V=miw1shBvww)3ryUn2jKV53>dNa*>H&!>Ro7gp*DE>Z3d*&EUmdv-Kz zIC62Y@7}AKiFbsBsTIQP*k{6M-z!2_^X-+ovXjs9Qm4*G_&1K*nJ1Ph%h~vHb4aQH zh2uYa>OUKXl7U5lM_xlu(<98st)L-2e%oSs-tHf(3lHBf&Rn{g5;<_f&$(v8TsN^n zS<*E_gxfHHlSRRbiB3=rs2P+fIu^1u0DQZB$pM&Fa{#;|6GqIGmsP_@QOqgL#wcY| zOi0UkRmtMX{_gAd7iQjlgk*7X?lWP0;Q4ZU%-!^^7f1{W8zf(;vks5S#N zr#Kago(%!-A5@usN%26lK`6w|D50YuY2{~UkysQL(K1+7ym+d6%hjjj120x!_Xhw> z4!k35?|4MmTzlzl#ri#0lcG8o+#Pc2v{l{01$dP7X)&xktD~O&W22y@X5kXyS2Zxw z@rw)eDsRh99ywTDbntd<>G8)vJx`A8KjQ6JK4_#7Q6VF29nHh0>I``n6bq9}%tcE{_FkSy+A zKthFaWRY~;C#Zzji;rG%_Saqldl%2_YS83{5JNj z&)9LIw(Qu0`ifJ}%5wMIfKzLCyTUFVW&a#eUISkoR?38qid&J2f>{tnMvFu89J;SH z;;h*p*e?&lP;d}N!L5d)m$8=MHw^&=hG4Jip2Ft)wR>#y}ZlXB)&{T(KS|FK+hS^BBhI^;g-RmnD{72sad~J zB)-}(0bv;$$pxs<%)E3|cnJm!k34cI&{J_r(V$rcDJkgLDUeW!^y@nGzg}?2-$i4Q z{6b8GU&Gu$(>Ko7wXi88p?`5>>7naeo3FhY?s>YrWAHs;W)uOz@H@hA@8jk6rXL=a zuAe&=6;j`4Z5o5*0cIXJCQ)@X86zJ8RS?30L>#sH`d@8``4u2ZX(>qP@JPO-C?jU< zW^Ei>7!}ksT9h?^zP|F*lg6sE&&zUmUrPw@T5_?@ZUzZPKD??OmWE%IlAKu>zAsV| zN-S`${@^*R+1KpnWRa4EjD(h#l7vl~iCRQom`le~Pt|XouWRv^oYbME*80=e#|NK& zSehdcRTcI@-F#+wWpe1nyS|PaPn&B`-Ym(RJDD8aIq&aQ-fabZ6?yj*aehNzE>?MS zMp}MlC~=aLU|{F`YRn2;d&nQq>0>uP|`QJlSSv8nppv%W3&K8^RkM#7*^g!u^s1S79j`a5qvudUpF zHYKiO40;iuA)gzkU`C6^%OcMU358J1&_D!)Lej6Ed;Id?kBn|rGLaRug7lz?$lg4q zIyPj>Oli*I6(rI2BuUdDl2MyX?BOxbB%vRfjJR_1=HCbLul;KeG4_ z?I92j>?Y;|pQgrMyxrb?^J&YblQ$3$oJxx9TJ&|U7yu1Sby@Em@FrZWiq-%EByQzJ z-s^WyaQ}5*P{t%fV<^Zm^eA!~M#Lj9Az=>|`f8En7qc4v{B;r-H5HbP8!x4zBx~($ zZ4y@$;$1rgO(r!+(%Dge?cGSvGs4{XN5bOF3SsB;N5a_Pqt~qsCokuu56=6#6*lRr z`KAhSYr8Vh2j{RAEF$%To|J@&4Ml<#pr_(if01yC4L_t(1%gm;Pu+Bv!?77}pb?!w&)tP4qFfT+0H;>tv#udtno4B(w3M!(= z=6rEG%i&6CRF!dgZu3zyFJ zY`Ok&dgLu(50V2M-b)}HIe-9RAAzuE*Yfhrj+gHTdTu{!u03@dzPN<2o&!D(RTGwa zDXkiEzUw6g%tE+viWZD?d~%d12K?&o^#^wbd?6SuL`ocwM7)UPz5k%|h>DVy0Vcf2 zh#NT>YlmccITUv#gm&*Q%Gi0msp|a8fvpb_5AdG&86n@9-SP5Wcl!@FOV&^A3-jO5 zW2PHfC?#kf!hw~urbF|np-GuVVa6GpIeaZAA$|@LG?Is4SWu)4eAE=|GR(B1`huL= z9w6o7YO{W8VtCJf1OPW1D$l&wRDSYN!Mf>F;Q_V%=7wSGBt*2Wv2=J*$QwxhXLz>; zfNwX_pSr=m%?rA3U~%=N>wLwss_@-rrmwAP+|INbAid11%rl>RMNgyjUgqTOj9wS$?5SJ3N|qY48J-Dqnx!kpK-9RN>HJPUGX;P zuq(;leY3Xo#M7GM!*_F1Mh^#hS9BQZ`o{|ks2I{xGjoyr|7@h}Kf!*<*#ShJt)H{2-&9X&O>kN~%m5j0*nTBL1=3TT-s$e6u|Bxg_iJMO=o8GH8$ zcFCiM2!xZzS1<4cyBAgnlfy4Q_O{)8)lhZnL2>rZOKCCv2f}>o$K37nS}hEs3pJJ9 zVx>imJ@~nlP1%{n)L`Bh2wahq0)OZ)*VliV#P}xxfIKtaMf#8@+;)ZMzM zKPI4kUtz}lmCbb*o{bMYdB1z-@-hGbdIcs%9zAc~bo??1QF%L+bQ`FJmBPY>-USwV zQC&I=o_H?tHDx#=IS)n4Ohd&c$V4lkf@hYq5aQDFRSu$w$AaR1j4D4tDfNSeh3>rFHa6Xf8W<}^F>ST znY)#RyMM?|89fviwq?fOy}ZZXJawbKMqs9*lx?Umua*OpN*SoRq|jsxoU13dUoVsX z`ey&42cU%MlRO-m5zAI>Njf=W~-M&Vv5_aNqsci*p}8AKXU-00CMh zH#eTXmX|(uAkd>`&|EieqmracnlP814+pcfF_xA`8bgU?|Junk002&q>1pty&|l2U zu4*sAZyKs9?U7}s9bb=s6hRu`X`tScHGWsH0_asj7mFH#c5fff7yg z-6$Aq_6G*7f9x#6@)AP&&blgo8BP}2ZO~Ajov`ELhN7eQI-9S7s=|lG`A;jLs{naXkEy|uflN!5iAL0!rkWgZav35kUvb1B2Fpst~ zj!|42Sfnsu8+m&;J^l-&y+613!4LpYG0@_8xo}ci5`u=Fn)03*)&|Lq{w~#H>9GSx zYRe8?@9(`e@76s@q1%q9 zMGl-u2<_Yx;9l8lWgMNSC}Zx*$u25OiKhO;hWs`AP6mUjnXx=#g50X+N>UC{rrI&p z$d@!68`yO)KW*+3487=WzwrVV`JTmPVh(T$#Abi;1P2K#&}lU{_4?!3z@s<4?bn|- z*PeM$S+Mt7R^r&HNdMM(ciVz46Ya=SxPh^c|Zx{{=0yoqLHrH5@{Z(>;IVr9Y7h3>X14`(J`zJtXN*Yw1TcU@a9 z-!ISKbv7=veZkc_zspb~yi7sDK1PUJ(;mkxszOJ@`c+;&P?iyp;8__3M)-`%H9#(q$zK9XQy8B!N2pJ)gyz zeZ^q+S7Moho75z^AW_QAQS=s zoH?}$1^@;8`L4N-gdHOt}W z>ErFq=WZim&ui#_0{{R8q;Ko>CmTu+T!DPX&!uV@6eBd`J@WzMmqXbSRE)J1{PS&%GByXf*G{CzZa-92 zxaU$w^A8Wk1|PpgLLp-O4@%1bfU~Dp!2qCuWD=6&>9Mzj!S07EZS|L51K}$>Y3wAD zTq8SOejDT&YVt18$bxd^x?k+iCNkR zrcWwMI;WcJ#%>7os2a#k8`_6wcb^A(?!K(AI(|DldHhtU zcf*XMc~+aAYG9s>sF@!RURD=N|MgyBV(3MO;{n}L2_XX)n5%505ngIznAYNASRH;2a?$pk~6t#4UtEeZOAhHTwf2BPAoFMAI_C zPzRVW!pEUzFC%Ofp{Ej5;AEM-CBnaHM{er)u}zgnZy?F;tLd@VD|>gYo(-Hj{tFNw zKTmuC!O}c|Fg5yyu)XX4r_Gx#KCLd=cQq$v>}YJrmT6y?(oS2`qzXMX-xLK&s{j!` zO&jn&O!U0c)RfFT(6)&z-!DSA#IWd_JOWf|pkhOZ;Sht-rMzsaPSQe_(FUr)#a@m@ zof!$+b~SE1^26xBy=O}Z0QT=Dwn{FKY`#4nZ@N?QQgLv2- zp0*`}4rZB~jkUrGlx1v#K>dLU%L&czYXJDW3`S=IE0YR^#nWN%608iOTKsr*dj)aZ z2ovq_A}@!c&V=x-J4f0!!_RXQABaRb00DRcSo~*x@&rd#50-Y#eI`tf zyjbq7>x) z3|yonlmG(iRZh*fRxQh47{U+1b(ON00tc~y*&1u6(<48Qlj zpxgk9Sb#@SUs2lH-%u+!$IdjZ(cPwSn~y`~xSvzaw68<;6yyRh><>aLT~)sTts@n|`y%DKc^8zoc)dDIMM z#0?&WT5rnGY+IBhNm-=%3Ek%a0p3 zoVZ;Fd`*$AT^9`cXx2Pz8ECI3{szT1pOyRmC|YH$@4D1Y47&nwZe0k*bni$NRglKUkP~M^uXd&$VOt_2=%E z8y{*44?kKLJ9;j}t6|pOEWJ@n$vs|FK*NHCiAVUW9sos!fiOlyK-E}H!7&s*AIPBl zI8_Y$yKJ2DciuPyVUVk3;Q$h5wwY)}Rcgq)Crb(&x^Z(zLyp0_27tfSfFc2lY*o95 zoP-8PLx~e+XO@8Sp_{IXZ<>>3R#T*3^Gr_C*n>)Q=91JWf$ z_3Uu00upEx=69RrSM`5*MZ|@*%(YeBqixNSs=S>_`+_{`rh+{h<^x=7XFcu8#~e*_ zddzj=>vfd_@)afRqD1(#>^X?)4_~h`t=adtU-H+1e1;(>p=PD0<`m~)mp76Vw+t}S z3SAFXoalhfI{^eRUKGM1$O&MO+x+yKPtZsYiykUM008)T_~2@FXwR+{q7=!@_*=rr zwkInv8*Ed>u{-P2Cr?HPwNAO&=503A3|TKPZXL#tSF>lsifJM5FA2>uC<@BALc>i-$|A`~Eu;gJUvyP{QehTCPWr$Ck_cac^6kRZ2g1(jWx~wpd%|GX z6T+6d%kL}K@4uT7J9rF9n)@w{qVg4_&D}XU#1*J0>3>%V1C7SefReMcxW0{{mS3`q zO;%&D=f<%}zt+VF-`3rMZky)aZAyl%4brygtA>`VO1q^=3Yqxx;g!r;83pB_gu145 zH$d3{01yC4L_t*k@ZU91ZJ?n-F>yN)UB1J?IWOs>1MmWBf_s~8p5H{+?^L2 zs*l}*&}Mks{ns-SuRrbHxx51LKhYZ;{c;^y{Tvn4t%P7LAwV#>tzj z$~%U;*rr#d#CD9=R_r^st@Gxy9m6k|fgU|G@_{hc_kz&Vdi!%j<*6qy-ZdtqWx~li ztx`kDF_52IP77ocNq&c{2HpW``7qGJOg}W!+qtMCDxh^CKD7H#OyJgo!R`$(<9EPZ zC!s+@-X~91#5x*i*U$sNNY5?#<@2rq;J<93wF8wQAr2OCb;Lc}DM{Id8EOXSI$5r3 z2=c5MOp55*m7lTWISDgQ8`GG)sNhX~rR!&pwl!XSh$QzPcMQHEOb>q`Ob)z3yujm? zj>apmHk9nYnjYV`)5kTx0mc-G2&kJf(Bef%R_V(B!;lb&29Fb#Qj{@wu{Mdx5A>|= zPYmxlkQP03nyCHb*|g|lncr`u5m}=o;hZMMYZw5%0<2hJb$V)cVHkC^*8Kk8H!^Zk zN?HsW%K^Qt>?~rc0^F(=vSMbw+A3bj*2W2yFibBdX!Bfl()h{hf&;g~OZq z*=(p0oGUM3>CeZdV93b8C5ocJd>& zZb9-tdxePr;A9t(QIWUuu(wDm1@D#~J9IKTVe)cHmVxh!2E`!RMcP+J1aoU9xy0A+lw_ z!7{N>QQFEE3D0yW$(V$Z7sUSh9e`TG#UU=IrfBEuY?EFc6TD?ECuzsU^{MkWGh#+B zhIzLvIhba5YAN`x7vnVw!ZXWRGtvmC(@^5XDJd8@DPRWI*F^x*sKPQD>3 zF(3OyC_GgTm3d_oamr_-cv+=PtOF(w$`q7+ZsBRs5+}U_@WwiGNVQ%ab zVb|0$lCQj98QFI4WmD~u3+s}5COsUpYBUsGB7qo3gW^;mA)$iCm4BlxAR!DRFQ=5U zriycryM0c5VtCi?{IvONMHx$X*Ts%s3iEDWv@=fMtSaM{E`Zl`XQ30-r$KYbqRFsC zF#(vkv!?#=&osm>qZz2tECOs;5p_W>O=m?3#{?tw$Z8k!{B4M9UtAYEa=K#uo@=dj zXCG|uzWri);>G*jyFPzDw4bnyEc}(9szXpM0&pxXAd74V5_1nC;l|bngw3@-yei9G z`Y|D*bHUv{w^3K!D_&GU(~60KM+z1P$*T6xFTV4wq)_xzoDghxdb>k5}f#J`#4%5eU1Hd}eCw`MZvmvsd%8Mt1sp7PsiD`=ttV zYr8R03+YmjFp80okOQmrUn5*;sF?5q-16EwY93KuP6eA&qP86@%2>QzlDX#rOvDWJ zYM8S&OxmO%VHd;2DsKh-!e~-PK{65yjud&m#I8A#HT8#os!@PW4lN~46vrs8E5xPk zrYP=^V5k;W?qr^`HNf`aDCvO&J-hJ4+L;xTV56Pe^ z1fdXAhCq2@ah5=oC+Y9F{~4NVa#F_*2YXldS{O!xJc$>cRZ@!@%_>AnLdAkCGMZKP zD0Gzlb(I7-sbyp46N5ZJPt7;g)jD@ew13-DUh>S9`tnmRx3%5-I5YZw8G4055o3Pp z&BxxYmv5EkPwxx!ujxcUlP4)?63EUVV@XZMsZ2^jCy2Z%8%U>+lTfoT&~OL~^QoCa zhn=rWX;)hGz_F6d-FHhf_dZw`H+DYQqju6rViH zResR>&)a*h-K{EFI2;|)&~I%VS1K=N8_mP2>Vl;b(x)WB$&ryT2$7S}@gnypz)a6C zFD9VtV5AkC$>sXzR)jg%4wZBS7#ARu5DWy1<7^KmGeN{bkKX(@UnSsKJvcsdkzMFzCYWhRWC ztSs1feeOO}tHXA_|ekKAavse7YEk|BEtq-Aaw>KZ1CLZUasKGz5TF z478yBfQAa!uXp@40Q_@}6i!&F$dP0Xn!l+jv3N#0PEjtLq^6jFj-!f` zZdZs$!vfU5LHciV-G!%vz4zbEPrqA%a{?gIojXk+oIgt-oISOAZUFKm<3o?%Y;HJx zEkAQ&f0$owzqL_fm9ms`q99(&osC|?5E{*);rv^*GKpk022MeKE=5BSszUCy*v-12 z2j-IHr_Wq$*?9KB$hL=Xcg=nzGDMdaK7JnFe&^Aq>iwrvVmo)Z+2%CqDEa3|3Rpz( zu&R5o(n(vv%rq=UPzSU;x!Dx07{ znrDn4uaZ9Kg_8V6DRs^M(MI}fiZVHhoQjT)nw1yFB%&h7rEV`LY8#`g6jEVll+_#P zTE7b>pj52id!xPahbN;0kKQfLeDzR>M$E$bU?U(OV6z)6`AJ#VI zVwJmDM=2m*lHWXnn?>0HG(>5s*hN8D_gfB(003Be4gu&DmKHJb(NXrxwl~RW4fd$p zk(n@Zd{gDon@9rxa(?>lDnV}Nr_ZB<_hGR1g>^~W=6#%tJD|Z{QQSFIgxffbn?>D| z9joAg!^+ukGAr7F{*RKRQ=+AQVqKtX?T(a)fzx?Ov)8f{CNIPUZJBqm&8*c_b_(X@ zl2OA@(f`%i3TyVA>`MiO^e3eSvM=IPjD&(3qzzffSv^7S_465VL&vL&_g(F5z4T~e_{rO)g-@Rm5UcAI*$ zyCj)u$8PYlFWsIT*|WF0c<-g&j%!b#I}9pSAeS;R^7zH(##2}FGDi0XdDZk=86?$d z%KPQRv>XvG<8Xd<9e+NYmbU<2$48vcG*nI2Gt1gAwK>4Gb~-7v|3p^YgrtRhUb!a7Kj=qe>(6{n*ZRO(=s)e-7bKb4glBWtdXaTzBGXZra$P5YM`CYlGBgbs6tmabA-UE>;CgCOUov;@kl8 zzs?Z?rX_?P(22&6SF@89v5wMH2`+K6$k~eQ&~s($7tVHVx%6OW^5uH~0CKHNO+0_y z(R%(yQO?xi2>-@0NAs-BhH4R2s#2c0GD3FA5_}fXV!Wo|;{0aevLd$eT8jP!Hb&{2 zf&Ls9)N>RGgU%p1#=#(un(aW30Gb4zU04!@qFQ5p{>}E&;$L0(BxER35^~DbegHHL zl33D%su=|t2DCXDAkhSUPBNmJ+n*`Tky1gG1{BelXoa+R*i;;3M64q8)q?V!t+HDq z{2L~+Q$`MNC_Qj>Ys=+FW80s++BN&>1E@=!_(GoBzlX2_BTd_y&fP4`nm!Tf-!kK9 zn%#i_saQtHDw2;~)s_`WylF8kT;D<)2BzieSXDlGE>?L9P;66|^~$j}Olb=9sh=p! znmXRza^ViL=-*CVDBQE|HibPvW<&0&OhwWoS6}U!)9P&F01v!QR6rBHL#RaC((;y&V z1BGZNIss)qyt1XdgjKMiW^kUXbq)f8rm3vN(c?8m2d-~zy7G8z;OX1NIpSd%u{s0* zm>PffYHRDoJEeIGr{hA}7hJ9KyA9RC%N4}zV+FZ19dS&esz}c9O}u$xuP_omG0<>H zvolH=L0F|A=9p@t6|=$Lt!gkgZS>&g#?#j)$DY0d4{!iU*cWEre(dYK_OQBm&-vuY z?nPgxia|T0j5cHS=vwe_>asrTRb@P~RAoIfH57bu4K*Sv?MyP;eH^RC!@OG-qx{33P6Yp>{xuw3xmPj+I|@t@rouHHh_L@qY<-P}DGV0lKEp z>IwvHTyOrC0$iurl3N0bXsI*$D%1{S*cJAcxp;!K3XcA2m>{z z6qc4pmXVfM9{DLlPmLFYIbKk40ZQ^;KX@V|2c1h+MgdttE;VZfal2?FcCK_W&+iZS z-n=I_Y3f2l)yew<-FM%>Kt9-Up|NIW^2OVpjvpUXm+ZZm65Y3VRf0WXqq>}XinxHj zD<_+z21vPl698aV8sgbt#xXq=uL_Pq+ER#9KM)dEC(F#{r0A{FwN?Ai4)x!8w7B!* zXW%XEoc*ve*n9V7L-ny6xhdnvqx@SJd>t#Hr?=PED1D2iUSflpPTWRQotSF4EDe(C z9n7*j+-*w+zzg^|RgJpZK)FR0 zK06I1GcO&6U4)UATLvaR;+Vv=@GMgLcvfix4i-sWBvDjhq~n&L!GL55H3Qi<96Uj| zMNP%b#fBA86U1w|DIoE(k!p0kn`OyJd~nynvb?1qJ6oa`TT(%6y6kiz?+%Qm4yl|wi>+0RP={H2rv@rdFFhrazfBIfg=G^(D@SX!8vFL{^ zZg-oa?amgt-414%ZMG)qE!IXUO}57At&Zk7ovzk}{RjvKk)M5bCh1LvnjyK0($)bm zf9#9;!Bc2X}6GRri6teJ@IhZANdDs=q1h~}fK)w(OGhBpt zH0*it3MT97`dQTEN07BTVS;gHb=eV%Vw zKwtFx>Bx{gg@ObtKuv*HV5OHZ5#u-XHPQ;s2AT4LoblZqt>>>#jy`(}lQQQf-w}rU z9)8%e>B5tWyxl)$#*Lhe5ANI_?%ljI&~@XKk7LEChh6b@7pwdpNAv8h$nL+@$vm&e z*&@FWE+ic4FxQQ%(N^|JlMyrZMZze=fZA&QkHUx*HrLc zr>7c_r>_>6r>*RrrYvI@DlVjB%gHXTOi#xKWyfzU+mU0)Nod%q$k-&XR6@GkEUGT@ zqW1Ath6y!MfsLc(1@k9*+OOQ79)Iz1VfsB`YV_qwU&qbYwPiF|HXvNiOEBdcTHkSxtUM)KgRxxPx{H8MQnth`|_(FxIW2UEJ z7lcC~9-M-y2)B-#jF3gBs(P3S&_kYJtcWF zN4GRwc(lFq{_=3o69SA>>T166sk!Fd^9@CZ?*VbHAZ_kScEZHP)TqHT@xeVu!+kdI z32>>M^|UP?cQ!8=urGWKqghU;yKPawr+smsi*?Rs3xnt)bw#I8 z5dk%07A78{Z!6mob%!W_p5#u)PmAJG zN?Ws2iM_&ix>~M(>~FtMfUCRp)^gjXOK%#hPCuzFIr^X~|G=G+%*7jd$umEuM~|M5 z5AHn{>e;f}*Rf{W#iDS~#vo&>v3g9Mrkr1aoTy!#2#>A@C!4Gx6FsjK=&`P;Km3ih zs$0*<&Wt>KE;d;MS=h# zON#1Pv9a)reVc0WuP3=vup)7{2o5Wut0Zj`=wh2*k)GH+*|_oOrJ=riZ*~m7B#iby zC3H4ldkac*=`n-H0^K$ewfc2c{4!-kO}!xp_|_!&_Z|RT}J|4>la)ti-)ZAQa9@$ak@XPSvAP(n3~I{OlSoIIN@rmWD@;nv#VVs&Q-T4}YVr z4sJjIfaRCvWmhnf;5YJ7mUKqKpO8`;BvJE1;?^+FmOXKS-A5BbdX7Z;w=Q@&7Pgz{ z1!u@e7}()h_(UnbtqSyOc@iWaK(k?~dE}%-44rMw@rx4LHE z+5Qax90&jejC@q2T#^k`L(A-p)^+$eRPBiLX*-Y@y6t32#P*Z1LG8PJT}rxuyd^7P zXb%7&C;z5%fM3Vl$ZJrrFi>+zONr<^+M31WBu2FkZYPe?JqtKbUl9G*?j9=L*=?R#=Og0!I}7B`5ip=IL7V``=~10D#QD03hv> z3=Qq}CRtnkoi|L!1auw-7Y_Zg@Z|@(SN2&NMdr#&nK-hu3W!sXe^bo*YXBgxfnveZ zaLY)G8aUdT$L1zRZ6*Ssul?rB5hVQS@3_C*vf;vu;>?{_;)1sB@vtfCGt-W#Qk8K@ z5aZW%#h(EJHY1S+j!!{W+}PFLG9f=Hrfs;k;=lzE+a2zGOn^|Msru~G{IuDNQOF{6w#eOT zs2*0LC}AHBnnZ9q{YSI9{;I)eV`btM6XDme&`@xVwJ}Pr4RqZwj(Edkh$p(*yy48l zZCh`>njCrde&_7_WuQnve=|s`&rN(LjBb00Br=pGu94WFDY#7 z#fBBtq$Fbk^$6$y1DQwINWMwcV$HtMeg=SmEFWIcR8q*qS54ME)kG_*%FQajH^Qf7 zS4Pb6nIgpH6KmWV)8`T*+Gji*vNr0dxrPYv%4^Y5Gl3l7U;Wa4TKEv}0;7}x*$H{s z7)8_+q%6FhZBj~7<2uLds}B9pzxDR(k-jG@eQkF>HdLN^n43I#I@GIv%FZagMMu#u zPe#}xgdeYB$;K$8KugWc`8@#u#55)>7jb5?qNHu8iB@EphfVRen1J>@>rnP7?^@+usnnT5b_)N{&2CiyJuP?Ofccui>8|%CGIf zNXsinMncU_vZ^0MPV(=Y!kYaZ_Uq||ptPVN=aFu%1MPq%{c*t^@I_y&DLi;*Q~9y` zFxDt5`)gdl000mGNkleaIlkvX5{xB+$`TKUoSuw`xxb$B>RjPa&xYB|_|X#^OAlS| zX}|V(YW&4pV64K(Sh%2Ze&-Z{=m9z!uP;{?9Jret)w|c-A+J?i)iYj@N7bC3nnM(M zWFV&d8^g-~Z`@F*n$lj|~Q6Opw7K|MyK{ zJLfy!_x(8gvu|fxpNsoSn)YgG`rPj$?;{3SO(whu3v{%OElrN@oNcS$|H9JjdlwJw zzJB+q{Wp|wwBqF8YhTor?0zXRtY@2>T~4osFt~)P>kv)THgO?f;Kq5vV;v*@V6U(N zlPZ>*aNXkUE#m9^T`H$j!iNr2B(AWee9g)|$g2E<{GXaZb#*OB0H%&M&vJzT z-f414LPLOC#dvz`@ZS2e-DlwP=uLAUe!Fw?#T(0uA72|EJpF!c+18_R;jPnhtGIHG zu3Z=b$+6Q|qb-29x@%TU`lAS}zkzi(OwBc9u{MhDDquM$z;WwYNkhv$ZAZ>--SF|1 zBZqD(;i8JY+rGXvIr!=))y3PMhl@F29gVSpS2l|*4JKjv_E-eX5TWtgrb7Hr^2=Uf zvay{Z+bI&Jh+#8+Tu}Fp(yUF-_qHB?cf;KIFAwj(_QOL904Li${|sEKbVIpi;o?tY zJ+FV;TzU9ixF9^xtE|`BJTOI1*VGP;Akx=7<~_)N1^FWh;0p+lE|(@Y26c$Oc4p-D&vtFO_`~6S*Y6zIb>#*;l{=fBd^sy=WQUh?{yGuQHY@VB0eYmLaA*{{lZn$zWmT?1ABRFTS&D`Qmk0dJH$o?A?C( z$MJzPAC%{BJQC(xHzhNTuI4hF5_NDQFC0Qoiqs%;G}Yl4@yAO5SSSeVq`10vAr^*# z1@Mj}!l!v-LF)XGuEwWdUqAiM=Lh#*{T@z=fGwP=W|=2{286wKfBnRTAA4I*epywx z^K5c-|8{TJyjBa5cMOweB!#8qkL&-rD!)A1mckf zHb4=%>T8kz&)NO(YY^(%9H6|`G`y)FU)MF=)-QN=WCI+4v_T~vqfr_f>toZT$tu+VE%uT%U(f-|EUw{7C-Jf9)46{H_9lQl%mapzk z4!rekTg{ORMHx%a#{{=6DI8MaE`dh-yTS`kIHM$=7Niz*7k1 z{|wE4fa*1PD*lVP)mX^_>8>oqmimfU2+$PbRWqHJI(@La`RP|T&Y!#ZYK@11JQ(42Pz1;4P|}+P_}vz~y!b zO$-5x($NQsC1p}9d<-UB_67 zFtps$A-_K=Qk$N8i}8 zc;Ty~Pu_sDdQ_9!o;`Z^-p(x-uZ{MezEEAX<786Az#e}^#grTn$6V-_3D+3GODPgj z&k%zqF<`#|>>Y;C(m)f?NFq%eughalgw|Y^%-7V=JH_5It_GG}#{_mP7pAX24tH=( z55IYN+tTMZVb>Mh*EKP8=6r4W@>8+l&13df(M1Lf8L&9|*1(10!TSA`W)}6wIz}AE z6ELoT@db=CSY)eU69eyTC#%%fn4s2$s-n$D#s^QmvwQo+t8iZE3Dw-tpOpu8eS2?l z`hy>OTVD9AB5(W4$x(y*{N2ljY%L@51O_&qWNp>v_tgOS|0!@18&rM`G+AAX$kIUS z2sF_Qu@;7DsfE##YGL)H2rNqiV2QvoEszj6mIQ^SO3WZ}?BC!mSCX!^Z zRs;1<=}Psr>gs3&LA4@Cp9TrwlL`K~?O{F*>kHH8pYClt_SW*!hnJ5%ee14jsl}@+ zqY9ro_~Wfj^A|4lwLcFV)K8?v4)1|}xtlz*S!N!ZW6XC6(`Q<`(#Qg-HeSyJk6{S# zXgZ&WWf}o@%YsD{%Y__yAgugU*r(Qocvp=kNA_-mV*(q>_P^HOcH+~Sp?ALBF#XZZ zjWZwpI0O4`o1S_lKVxEhpm%Y*rPw!-K{0VeX;MJojnrA0r2P2Dh(BnSC&Bmv#u++z zktZCPVq+Rz73y0vUYfW5;BemyZ|vOq`Pavf+*XZET!~k%-klqN@7s?0XMp>&;e}W@ z!2-lfR;EFj+y|TA|F^xutMX7_uPQkCRmzW|nP_44Z4h{Y0!cLXL1~Ku&?FW7(IgXJ z49VCV0!udW!%@TmcpcLqfIvJ&8BeeC`sA=LJetW>KwP-ConT%tL*i?zP zDbFX%Nt)Ub=F_+YcYXD=9eaDr;tB!apjtSp5Du^fe(t>kyTAEiar)e){`Tk2)s^i$ znVT}XFD9gA#>X|U9iGr;M&1d0eTNV|y2MMDVya+}#jY$Jb9auewVw&sH4+dd+tWF# zF)FBGJUeN0XI0_yv#r&KUx&*y#(G}8GClCl_tS&#{y5h2`Zw#Ep1n{}u;qAsMEk5l zo?LFka||RA^i4I?Fb@||Je*DXSQ7}UX8E;9B8)F!oIybH99b0WPzzyTzQ21(Z$akN zu7U33uWaA)$)#tWzV-79!2gHM^1GHV|1>r9#@EeNhu_IbnmHQb*Sw^#&uFzU@l62- zgR?e4m$OQMM-bI`Lg4nmlOHI*EmV9o*)keKwMoU&>@sn5`z$=&J`+#3ODE86Qwa>) zRBc`R3=-2Jhs<)!BeUeWB&L0aHp40gOE&UCV0F#cYGUc&JF8qFNC1=;PMd_)GuG3w z^b~P{3nWQt5A~{FpPxGWR9DlHH-PW`<#=u6dQN{b+5h_2ll^a9AMbhd`+>HXueH}4|Ew~9=c~}l z1bCG6Sepl>=`$@HacCX(N>|zM`TqaXEKh^37FwMNt$>#?$0NnVDZ3>rWq9+t_NQK2 z-f-c|r=R%oE_8pMI&@RHZQ~a=M|)rXqPAquE2%Lf2ZKDTryZ@6>cxg0@p`JVZTkO@ zPP)I5z$+7FSYC}pJ@001ws#YW?bSeLd(~6)y&7~l zKFw6FUptK-&`IY9bkKM{O*;CDQf-EHJX%|z&_GdyYt#`$IMN)%0GfaRByB9qh($4T zg9>VA9^V+~RyCcuk_J6JJN~*V%K4T1|S;1-u7hi=@14J%7C=PnPgJMn%~ z)xMVsGUg7)hj(ud^sJh2cgXF7Gcj$=;u~#DW9n_q;u@T!DXpIJyuJv(hS}`IvE6m0 zJ6`B(e-`-suYWN={_d5z(f7Uu1o(EK^~{yl%A=o^XYF_^J$mA32#8A@Wr@|my$YpK zc;-k1R{M8<|5fpX1_)NQz|TT6HP(=f2q>-tm+24zTSHUg*3Gpw?tgx1{@u?G@B8-l z(I;*x5AL~sf8*Ro-}SY>_+eS@mJ{)zJv+Qziid41qRWlAE>R#pvcvzz`9*&_ff*ba z>;iw^3JF{u4Am|Z&-ADxvIBZZoX}A+H)4XqiiM~qVi5#w~j$O(o~^fc2rZk{Dd zSkx26uVmLC3(kU=tW=Chn)q$c5I zo{ssw3E|xvD+@Ot8C>_=>zkK8_yP`tec{=AcTb;C-UGP5Qtxs{d1%k|dpkCLabte` zoy+|lFMI%(To+_490h^j-pGKqEkPc2>-}6SW__H>ru>}Cr-R(8=OX=DHl@W3@2kk& z{9I?l({GLUo&9WK;=QYjljpyk8Gh%Rq0Tdx+NzFzRF<{<_0-7mXF@%jHoMwnbebFa zrR(cjD&Qz{jsKJ0*C=G@gi)!g@D~ZU94R0E$uiF0f%=l{`?%sCk z#=+g!@9)}j>CW8PJ6AjEkGz|gI{!?#U-JfqT~@cmB)EXjb_k)Z>^Xj{MSFi)foV*2 zEp4_I*1!%$vWURaol6L8|8*p8qkswNKw7 z_Yg;t{{%;pcbH?DwU2F@xRGHP+(TwN=HYZi{sh*?IajEqF68Oi1yf0UDF&rYe}uujk0BoTWwAEATR=e)Xs#u4sU#x@iK%~5SYTyOMbU-Mj?`@v{^rx}jS1&h|A9yo8Zv2Tr_v%@>G`Ypp&^OCKSLUztI~48x zWd#rb-(9`|000mGNkl#`utdBuac|@$9DOKA@&e63AFcJ2qTWZkqk%C*Z<-H`?>c<-WEPpLI4I zyU<$w)Vap;L+`-3pS4AM--M_u-v4$><&*EPYk2Onp^h_`$9rDCHqra~H?ZHgz2>R+ z%5#@brbQ1Q2=S_$hm$Gb{w=8 zu&RBRYtwL^Z`bm^P~LID$f@f?W2ep!jU8LwH?*sMl`G9T#1chKP`U1vM1~{^N9H?W z2uw3HhAKdzC|nGZ$|qo0Vyd>G4VNYJvNZ8caFeH2Mh4Z7%RiZ|Fv@GhAYbLOP7_)3m5NioP|x|7jDdto&O%VG}k8w z-n=%}^V-$nuCrecw4c7**Lv!!{?=2M2ineD8ESv|o58j-S9=;?{Ia?HiF2jEGQhEi zAzn38&Nivd=0^TmT&8UZ9MMR?GEGnjA_IKI5uc%kLxnpp#^z{J z4+!9bp~#X6Oz##FH)erqlzE6DE(Et^ z+sHR!_u+5EioPo*&TXF>+Eu({V41dqX$<25=X`C3c_EUuH}d}Njnkjr zUtU-t!mdqMl)E=yRqoz$RW&$j=cdcbZA)L>-!lKj&l{#cxidfZ{;jEjcYYXM_xkmr z_OsV|n@(Nns6KwNzUaXDqSOtilEVk~1$$IYIm?n8%!R&b9HzCO4v{azp=bi6CV>G* zv%_J&YyP;hVKwN&@C~e7T^$mNlOnqoYYKOq>1{l5X{hy;AJ)~KyjGKc;6g^s^b5i6 z4V&eXv~E*=U@-?)t&&781T4!0iFmwKtAAPf)dKJyT7X6pCwh)5%sixPT5?*?vi6+5 zb;}oAyRL5p^1how=ixghiita7kLf#RUbA=1y=U&2dyU^Qb?f`i*s1A#flbjd1M|cs zU7>#))j*yFNDz!8aUGBtnu&%MK~G&Bqob*grC<;gmJX3?29(be1fFS5vef1Px9XX= z;NHDi@iWhsWG)w0J5pr2jymqH4y;D!B=`VQH{J zl|tZHq7fv0xT^q;Q(U>thUE@_+}cnS5=YW!n%dY)!!jcLYsU&w=Z`fMANruR{FyK7 z3J!l-khJNwxWK-{UJfPG)}ojOp}t3^9@RRCLNK()p&5n<&DHTIk0igu09cL#Oo8GV zZq+1%@NwV*?O}+EPCx<}$l5OP?0at*I*lle6;n#F=e*L)dr@iOyFqE`x2UxAol}~7 zjouS0x-T0$*1pb{5egqKM)kEKQzA)bsD6@Z&eoO>&Pw7sx=?`X%3?|F+O& zTxsGyr!@6mQkwg20?NNxY3aWaJT53Ld?uA<9s}QtUE4k~mRG(ckY(=!B$#3feH$rk z+Y}r{=&psKnygVr!LkB4A5&9vEeelC=osh_1UC9~n;;Xecc!&Cs@mB)z0=#dcsRtn zZYDOgV`F;!(9Xilxx>}P%g38*_MPl*dHU=?_j7NI_Md!bV(|1iSi>_uc>4TE-^p_W zUC+JU)$;UfP1XBORTgbIo}WJZL~8WFu1NppMPKkeVI``C&_9dEv<;?d8`@!!RG#`; zBn)`}qZ-9EG&Hp+Bt3x<&%sx26M*P2Ba>x>>tVQ>lD z5UEQx_a@_bHaHZ+2rdZGR7XAb@h7TH53u?Wh=vCE2mX^QP}hL3!Oy9P@Mn@=F2Ya@ zF)V>lWr7%r3X(y{5LKA6lWA6bQs27i6TU;=O(WL{rO0Ceoc&?&g?Y=jTz_79LR57a!3wo|e!vmzy@Su_$M1 zYgxhk&Whs2J(a~vd%@#g@bT`V-0AJP>7$#|5_%WnBU&fJ1F8r8+zL8f?NaJ&%)<*! z1)hmqrj0+HY-CTs=o%q3@U)ew&Hq^fbqr2&*4H(6G&k~2aI{LO^^)fg_&An~d)Vg> z$|XrHmPSE^0zIb~CdJHyjOWSlC|zTe7D-P_14~v{)A|jIMgDgI>a7MeT|-M#QwxF6 zLL!j}6a;*(rKPC_iLgR~KanMX<r=5M@8fme#z> zv+urc1S|j~fT@ZAn}7?n5dgSCKC>zdVCg+}*V1e7I}6XAFU{Oq-xoPmoiUVU?a>#9 z4^RypbAT1_&_YxAYu0LF9{zl_HR^zYSP~9N<-pV*P)s{Ly16S?Pv&LBlLwd@xrIs0 zd}C~-At_FFG1+cTNk!gnnU(%td38a)MNJ`oB`qQTC9T2WG03;D3BK;_o>}SUoLuZ= zACqe<4Na4n`o@b56=4E>TOT&v%!x+gONdxqLo`BLS3@246{!8k`O4s&)xe;%X*4oS z7RY=6ag(GbA%)hW@G^-}aG{9jnF7bl>r%unB%FZ-2;liBEg}=RK4c9w1QxENdb9;X_m;?y+pbX7eNhAl%8P5f{) zy9|=PUk6Q?w5(@QdYWt7eo5#&vf=`HEh)`>HYm+~76E|&?+s3W?+IW9#_vgd$8Jk~ zN4}SM_g}H_X#ZH`RB@6oP1y`xArey(i6-btG_)|3hZU8o(G6=gG!YsY0#HagTtY{{ zF*qawOQ1tCFoumCOuCT-283{irhsGPZp3%+H8FG!f{h=5AmJ-ego%W%!6t@I0Ybim zkAQ3A&efMV>od*lnRH_-I)!gW(PkSF!S}|Z$+~bPp{523udW7Hp053mo0J9)TXm!s zmPEiZcr=oswI0pV1Fl!)GVMYQ7_tDCj+q;kD3HPGR}7NGLTF+sn(9dWuiG`@>Hl~X zQ8i-{h^D57=8E#8ady6E9~wIL|77e2gJ56{{wl92|V-__^=Q`&Ss7CHctPWpY6N!T-)WcgKc;dl}8x0k- z5ODmUmL>`VyPA*)oHpF~1^&>wu*n67rVH?BU1PX$5e~Y7fcFao3=@_`8^T2#@ar%r z5)*|a(qL;K_&x+Ug9m%*i@DYQn=SNzxIhI4)(I~BqhrD8PQ`}w2lwP%r@bOfv{-eJS6(1-!0);}N!HJI}5O73oZ33A@B2wTZ z_*ff@MdKhjU`+7mA^`m3!)(D?*x7{umHQv_;wNpJ zYep`kcSY{g_rxBv_f0*gm1dqG`1KlBSpbROl+rqIPH7XoptKF1SK0(lDy2TXS4>@M z&Kg>$ZDkw#x9G5Cad04=lqf5Jbu{ob zxO`#_?1X}G20YpSOn;1j5Y=uqBy7RdRKrrW)CequnzjLimKvU=u@fmq~JRT@LIPpo^KyXLXIu8ke$K#054f=ChfPdKFzDCsaAx|*gI z7M4Z+oB#2LA(|-kATS(q zbhsgdOi|_m1FPz{`1TzajhqLrnJ7kXh~3BTntF_@2w>?u4cwnOK!EkX5+DRvgTS#n zR^HuTnk#BwF|p6x&zHnZu#LTI=p5Tb62sUNtIe{|LK9ga3|Q@7{byObQYi{M&{Sz- z^so5Ex;=JL2VM^vjlzHvp2}h|40wD4VF7}U#B(zSP=a>ez>GGYj z$hxL}kOUwkp#26b@K+bLUr7KPj2`0mvv$yj2dBEWE;#LlLY}FmL~LhcCvmm4mnfuG zW^$3p3Q&G}000mGNklCj5RQ~xia^#3fdPYgprV06teByj+d>0CtR zg$^-AX?ye~r6+l|4d;aN&M!?|`o9yqkKA3c0KXF8VGLj!Jgu}18oy^7Fnq(tzwfHd zr}I;(XXBd|E~Up!?9#XJ%tO1Ge5Y(OL*$JiFic=f@LT`GkM-C8&yk1jsrpK$>LFB@ zcE1Y&px+PO8!k`Z2r9p$lZ}_Vr(-Y#d=6jZfzMHNNHin}ivMDY|Es8}Be0rC3J*o# zJL9R=31qfsJxvfb%@SwsH;|T{;@dWyH*)O!N~Gxj(adw~K6HVkzy-1ngd_m2PtXid z{waWo`*uO&ckP2mZ#x7J|7aiBcg4oH{er};@`T7PeVJz#+@Z^LNYSPVUC=lko`#kx zJM{0oscZim{FP+wKgDS)c<|ce>`hkr{z#bCWC9n*1f2AC_EI+wFQ*XyK=&BG0Jms` zyF-ALwV5Myi=c}HPXE7du^qGl8d`V;0>iYxkW73Dbo)$-zE2C?FnUJMG;=>kT6#)g z*Kpq0x$Cm2``|4L?}>X7znS}10U+=VoCUuB3IXhbr<4w%Q%c9M8KqM=#N<7B$k2DT zet-muvS&?fk{384zdE{sELNK;kYn&P0TNB1X(G@B4NU|_9he1}DOz3X@K{8Z-F%SR z1fedx%|)Vt;Go+>CX;Bu^)V0_a>WvDHYpuxOzeu zAj6E$AN>pcjsh!5KroCX^N=`w8!Sm2NMryK7#~=G4$U8mTzjvX zdyU?f_)h(7;Mwe@sprb4DB&@H$)+Mw^8|;&e1LkytUkVYHTgFGIz9>TYI=D?ERtZ1FZm5ej8g$ z7Z40vGFfy3co7EEC4cnq^}C9inkHIZ6HC=Z>IeV{WWW;m5gB&rItJcNx<)ax`W88d z1-8|%nK*Y`H1inx!O~~q?ym%xRRzHgVe?AIhy|r{)S}Wg8Um0Y5?F$;kslobx;~Y8 z)t<3*&fhPxNt_i}1h*O(DGHcen^>BjnID;M=tLm1EwKcZRiJAE_Xr$cs|((KgTOi- z1n}>{NlyX+tS(DWm&X@yO@YG8fWkZ5J6L-(-({oUh2!~N1Dql0n)vcdCIUw^k~XIFcFE19_y zhzBfz+hfSkrRu?pFbo!r)6~-ZTUg@=fhV-u?EP;F z%-E2D%cF0gXCx9E+1S`gJv=;JB0|IcGZK>{%QABk8*&R$TC#Ez8xoQtiUWha66H=d z-X>y0DRg;=+ITVwjl^g^xa?BB+d3P9g~4k$i2{UfFU38wD5MNR$e9zAu( zBWCKhNA&njx5%NZ&LN!_?0subSt;`On%O5z3M~Q}41`YU41J3L5{+kzBhrP?9fC7= z|LFJQ&m!=m3Y^?jJvLKd3{HNTt<=NK!znx@%r7G;CAuQ7Ftx3$GPkd?CV#NFEUP;; zBc>7(z{XCZ;BeVScp{FZuJIT5_a9Y2T!7L-k+~RcfwMNlHkrorYt|FRFL0%R1a?&~ zi=3Ozo4Ivflz8=Bv-TUlX&W?g*CBNJXUDLadoT;+95JJ^0B+HQ>60+8^o$w%K@qm@6S;rgX_;I8UUNVKBS}Cb$JjZO$&rTY=o+~YDQpW2fyzao z@l;?8Kya+71!IF1Xn+$+0|6h^z$ety;KXY+byeZr+J`B`KdU@wy;4*Ar7s00bTl+z ziM}R6Llf5IYiO#&CKXlLG7?0)coJ}X^b9!q#_;5q*+|`8+#Eyw0=<%=V?zqkv*POt zOES93tMUdas`Ca4OVT@lMJVz1RYX}x#P$p(Oy=&!802D(gL9$R0}h{xxe8Jh^L%`MHGZ0xMO zoLn4&J-l3_{R6#|!y*E*V-vzlQZwRevU8K0atl&hvh$J}lT)M0gTs7MfcxVkH0GO= zDcZEZe75I-Jn}`-$|adL8->%8KoV%{+9pvs9+gaCXrI1W!g{_{_I_jg(ico!>)(=i zb$%-IAGl&4Ja)q=Z2F#S)ErR$MWtuLMx{^kveGYgn=&AMyD~6+n=%lRAO%>1#OXVp zF+*P~!aC161=O9i^C~)M?V7RCLLN6Nwh8MnlK52%Ox^N1#_}XRzEzm6ftfc=&)7vr zmv2X=8A!D$EHR!);{igjP-wi4mg-JH3k^%IfB(1f_Z4{Z1La4dF&F}YNYDXFug7FD z1za9bc9F5Ig~Z&|#!lwz=pqkw_f*9C_hWKTMga_t?M+N6c#)K3`#fBC}$AuNe z#D^EhC8$so9T$=x7U7=(0^%5`{HA8cGM1h$7Y738KV`4)ZO| zhs-T~N$Q+1Vc`(jBbEi$8(Df5^Tp2T93$HpJ)UJCgKeVFVQ^*I6s8DA)Zw6kML;0X zM0E|#KfNi3r#~8v#uK%*X*33%qt7uA8<`l{O0A`yPOgsOJ^|io;n86wiK+1o898a4 zxrJGM`NcW?c|}=$Ir-^b8QIA#$!T%5afy*-kFbm}7?igY(w}zz-_J%^9 zDZCAamt8P*`bYoH|A7MiY2af6OP~(iArKRA(0H~KPciW(Gi{RSJkKh&D14AFO0I$T&fB;)n7QinRx<9}bO4$go2(X~^PoBNwmo)i< zZ^GzRpSXdG-ZASw@{DSK*CV3&HMg+3Q?9|4&p7!P?YH;J+$3{NoUoKfbeYQhYm6-1 za=FHKae6!pKf0dKkxbLKAdu(+3|3ngfdnM@ZCmI6BLtrQC=?2IqtNKO3?7HaH5ZwR z`6!8oUOKQNs|(Jc&FIfx7^UoIh7-{4rLmM-D$df8J~25zdTMNX@cF)xt|wYM>z6BPipH~YQ(B=5fFdmBATH%FwJ0%J7_x%7~l| z%E;U$fJJ3w&iuWI?3r6(8DrOiQu;pii)(+=E3)=^*P!Bka_@{qnQQETg?&)HNa~Sq zXev+S2(3c&IHn$SmcX7uW1A6yMZgirY@kncNC;>dV6d#Ii9iEIL#rMEN&XAa{|qe% z6!`l88ComQ0$=|N5Gr602;>ToNGt$&4qro{;cFnc#bGcQA`Xuy6Np3_nL=UF=ya|g zn{C236j+JPOr4}MYah9@V}yr~XG(B*a8Z0pd{b^w&Tvgr)uyh#_Cq661J6$_jGX~E z4G8dD?@;H##xW@EKSRk6GKm6M`LoWs0@7z9lD+=g~k$5s4No-m1zuMMAp$2l64q{00NQ@oll}b z(0Bk`5}C@;CQ}Wx$vP1F+9Uw-3P|8J5`}6&)}e7IR619OM(0s!3_g{vE1)r$hICz) z5re5`%+zCxSZsZnZKRfA^$7Q zu6b8oQ{`e&S?*v;MnXeaWKa%teXOi4UHJm8n4&{wz{0pkP=d7&NbRuLe3i!w5QyE3L|molz&k20Zbk20|w zVwWf_on4!4rJtI4QAzM z59bu-j^vl*jR68ol~tF_R@Rj-RMnTSudFSbE2%6T2Z3;JYDQvHR9tw8e~?eAi^4Gk zD!| zt;9eS&@8Zw8Zxm>Sul6X+hyfme$>vl;jB||=LZ3I5{T_?k%O1L6DDs4q%No|KxFy?bE#jKV)<+{HI>(Ag_?oufxo zyMtR;lf7$5t(|jVrHzwciA?TOVC~?QYh~||ZDsGCDYbJ;m)a>(CAKa}mNw1_7S@ij z7S{4;b1R1^b1VBu3jj-NhbW1SJle|EDOP6hl3?qoNOo{`PjggwWjee2^}W-(Az(w7WDR8Gq;(~yCpO0>MpuPJ1{e4R z`lPyhx<<>L>;kN05{1ar*oMn95HWOV`XJz?zzef~!~OZ&DgVDEs-0JG+@b~&uZh4> z5oodj8pklf67{VJ6oC_oZt6#4%VJpq*F26mpg|~&9x}C0-y~HOKVj!vf5tha>w-u0 z&=udrsarwm>y=?Sn^Z1PZ1GM&g5AIh>;{Stl)rR4z*c}QfCQVAiN#CGgrfC#6AI^U z#urR~7hf=OH9mjrtN6T;&*SrkK90*BxDc1qcP=)2-P&gi#T0D~h|1gG7oI)m6PiBh9h@@k6`0uX84%y&5fInq?jO_P?ibza z<{R0h@CmPX^$MwR@eHnX_6RHoD0A@)EOYe=DtGe>pNB*TQIM!aD;zT}1{w!vs&_+L9Tjz6_3CqQ0?LxuIovkJvtSQK~39Wba#d+9kB( zeUIpYuY427zYk2C{W&xX1ipEjl+guSKr8_K|3c{cY*NM*ZB)h=Z&W4#B$jMYCY5eb zCYLTLQ_7a^rIs)KoL;ebC!=!lr_8Fw+ga6%x3a3&-^{L_|1rC2?z^n2nQyWxr!Hq! zj9<(s8~G%yWZ-;CVb7aM`JHDIa#~NsWi}p*Nw0k(I<<0NWOCWAh@_Hj;fY0C!V?NN zhQ;SEhQ{U0g~Vh{1xKfk2Sufh1V*L|21X_i1OWs`rwoS1qz;A0XN*QAW=+JV;Mb8z&HzVYdEBQpyhPcCk_ zIKO%M%7z^~zuU5B&yB77_TJpOZ_kgLcI~*fe(R=-Q;T!whbBi}?(FM2QrlF!Ex#mx zJTWz)IVdzR&&AC-N@8v4W+>!Km@Hi$EP^8t@FWZtgGZrN1FTf@d;WsGy#KkPvJC24 zXbmka83~AhBeE??bQ2G{zD+FK$h}x#5!xxXOPZ6o=I^ofu6))pu<=zzc*l9KnBLF* z5{9n^rB3`1l0N-oSmw-)@T}RJ5!ti1qH<<$$K=i3i7QyR3r_!^6H6BFCj%0smTy#M zRBcjb)ofAb)GaIX8n!75nzk#8nzt*9TL42HwMDf7q~N>y^1pOP`F*PQBGL-2XyTNAv#Ds?vqDthDa1sL&EOPerWM zTH?+VaLr*25C)6J!$z1t`tSc&l;6~Y3wWRfECLabKp&^AXGx+NyV3Nmqx1}2b9rU~ zjmFl|LuT@n^-|ZI9X6iDhaLPXk2?p|opujzdBZEJ<87bV?sI3G|DJ6xI&E zS5PzXc7Ao=>v>f@XLBpNPUn<&oX9C_dp^6Y_1Wyw=3_Z!%|~+q^2%F|7F4!AQ&`=0 zytuag+0y#X=gJ$pUZ`y9ezB@$-HDpEo>TRmeW#n&4W4c5A9=lNX#DNovFY=JQ?nPK z1sI!K|H;I{;-^!KOP@_IEqyk%xc=ku`PuV>ljEc-k_g=Iz4DVeEV z;Zb2_9^USW*0$E(hDL@~bX__J*8i*jhB}^K#+|SF`~R!_<|cGC)x{Z>0{4gEhEHjyl{&&)o4T;iOvAal#!YVTFB+tIJ&pi5xI5x0<< z=RG4DPy5ESy%Ctu^(gP%oZk6wz)pZq4Nc=pG%^7TJuR&TtYTek&RfNkL9 z->EEX->t0Z+N-SU-lwcyw@+Eqvrk#uyBA=OvaWYGz%FH7&klfX%G!0ycWb*h->T`_ z_+w4y()H@jg{xH^bC)aIXD(K@O?_I?I`L6O%h(6y%_HZ^n}^>mZyJ27qG{lbispgW zE1L&it7=i<)#}!PS8Ce&&jP$$+tzocw!QCkZF}!ab?v>U>N|Q*HFou$YU=KLsbyXN z>DHcs(``NdFSYjcooHFt^L%qx_wlBVjwAK0t%s@_8+MmgRc^{FDVoX1%^FNdO=^pX ziLCMq^2>H{bBPB2zL(HgC}Zj|1w?Hk6}mdV=?}X~fJc_!^ajD$KwSfY1wpb75<}9* z;2FkvlD-rW!AXZH_NMDgLYZ8f7(IbQih;394&T(X)JPIgFP4S1TR6lFNS%`=ZQL`K z?uFdxTXV^Nwmb=^xkfN^nx=Tj6QFA4F#leV$M-{&h;p%=L_lg`3$m8}8=U zZw7AAHf3qs4rO@)odQEw>x{HvQPxx8b|S-lc1ez3ZIuzg*MWbE>MP8(4#m;~)k&QdZym1PFi+mew@v zFR8BGU06}IEw7|(LsmiIY+82CSWbIoBTD2Ys>qcPC+(fF;d&#LnOo&xU+)YLQ(kOa^j(gH+4poqFCEX4pr zpbK%@EK>qmU!tu8f@Qj)GnFOw(&b1(*@pJiq7t`=!a8lbV5$WCU#$@+@n220t zhn8=*4sE&FI<)!6)}c+`w+(H)-a5GSP3yq=uUq@)zijE7{k*w%`je)f$qS9$WAD{> z482j)*7tH%^STq|4IRfzYMY-btgPRkTUxa}tFUxqdS2mtN>=V9OoK)zBz1*GMK|~d zhm?Bw_+&XN6bZHt4xth&D{rxxsk6}7$d)e7`TKdbV)i|RT>ZKX*?1r0a|8Sb-EQ-|qOND34|6M-RVA#qeBTAPW%QF(Y0%ZyCp z+tKvIo-CeKILFvARcP*6ES3c}SUN;@Tf4-M*tw_7IQnF5a1AWj;Tc|b$S#@vkx~rmo~v&tA)`oByt`as7>wmJPQn+Bg4P-L)0C zKiicJeLIy+1G~WK{}3uGa35HKJ52*yZZ!{V{;_#r(+@2J8^3EAgv!6+TI;~#)t3H+ zOU-?=Uo`bhe*!H)edp-AwQYm1S2g#%R0iUJ;+mGH^DFB2XBSs)Ps=M_O3cWaj7d%# zh=@z*2#$zq@CynlbNBYimb{cv2J!2gzl}#WLsaPzQ2uGQqP$)Q; zAA>-`G7BxFh9+zVf=x1N4@VUKxt3L|%D;;0c3DFUt%bx=&^U?#fy6SU(E0WZwy8Ip zFN@@foYIUeJPO6ue%0o7AFt)jsuUb%zR{)O1XKRMS3wp}KAKTvhAv+b{+w zZ|r@!w7&a9adq3V{PM=bIVClFG78F{83bYWKT4*Ai z6NDqujYw1jD=O2-g~_q-*B8hlxyBBO0#la^V@r<$v9)i7rG0RNwNpfgts~QrRL5=CuNRC#HI9wM8$Umghe&Ln_z{vZ?2=lJ;he; z6eG2<4K}lscnM8R^YyC&%Pf$Z2(&f|L)66*sC*(BxJ7iX z4V5W$Vz5OXERMM!n=cLK7}-SeMGlEVGv{;@OSc?TE6+l68=o?XeL$79V{pBVb6B&T zYebuadsL^RXUsZh@3=l!-^4-pfaDR+pwtQPkn}0vu*@0%h^)DQ$n5#R$n3emsO;Im z$gJsr$jr%r$c%}A$n>$m$n?>`sPxgGs5FR?ps3WLpvdI@z=))tfbfJa|IoO0-{9zG z@4$#UPrr}~H}Ak=7Z2Y&M}=pGy|W@oX73m+kwK-G`k0uSDGZH_9XLF`l*ML?s5Ckk zDnAO1#;dQM{Hp>5cte`N9l~e<5+Kod8X8At;|Mf9fuw7!P0=$WQS~h;bgng3mv2Yc z6FTYYnCZ8g2Jwun!vrQa5r$&BXrZZnjIo(RoQZ{Ff>`2|Y$|n0 zHMdrzTgcopCARKaQag`qD?85|D|-l73*?byW$&J0W#^V|W$%{u0IAmYiib$Hws%Rg zvU5(bvUQ4++CT+&h_tY>3pJO>0!=Nf{6uD!UdCc`H=&8xnJ+Z9=kNvAY;f8Gr57`p zOd(W!5}Crn69`o3_Q3W>HPsfIRr%YCDtiQ{K7g1&LlcPuL?9wSYyikW1y+Fp8{%PO zJQh#U#}RZmurHXPO&1VJ452nz*O)|Mnviu^VhR+11jx_W#Wlg+nbvIP$SpQ~Q8X0mw@RuC-xUm#`abHVA&l`z>HOQs&jf~jX< zuFKLlWiZ(yhOVA5oxwDs(RB@BS+ow7#wF{(%ngM_)F$b|x_=y=po7KXNN5a(h(w~W zQ28I!>8ui9RaORq{E|IVWsX+Hpupj|>MFo25(HEn08K~~1O!G?Q`OXhRW-f0<$@=1#<1L^*XCDz^bgus;tVYtjema%Brl&s;tVYtjema%Brl&s;tVYtjema h%Brl&s;pV_{{fTa4_4KWXvY8m002ovPDHLkV1ivwJs$u7 literal 0 HcmV?d00001 diff --git a/rohd_devtools_extension/assets/third_party/elkjs/LICENSES/elkjs_LICENSES.txt b/rohd_devtools_extension/assets/third_party/elkjs/LICENSES/elkjs_LICENSES.txt new file mode 100644 index 0000000000..f3990c03d8 --- /dev/null +++ b/rohd_devtools_extension/assets/third_party/elkjs/LICENSES/elkjs_LICENSES.txt @@ -0,0 +1,159 @@ +Bundled component: ELK JavaScript layout engine +Bundled files: assets/js/elk.bundled.js +Origin: https://github.com/kieler/elkjs / Eclipse Layout Kernel project +Primary license in bundled header: Eclipse Public License 2.0 (SPDX: EPL-2.0) +Additional bundled code: web-worker shim copyright 2020 Google LLC, Apache License 2.0 + +Source availability statement (EPL-2.0 section 3.1): +This distribution contains an unmodified copy of elkjs 0.8.2 +lib/elk.bundled.js. Corresponding source code is available under EPL-2.0 from +the upstream tag https://github.com/kieler/elkjs/tree/0.8.2 and source tarball +https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz. The shipped asset SHA-256 is +cd56bf0ddb7ad2587583461d523fdd974dc56b59efd20cdfee954e1112ff1a49. +The bundled file retains its upstream copyright, license, and Apache-2.0 +web-worker-shim notices. + +The license texts below are included because rohd_schematic_viewer distributes a copy of elk.bundled.js as an application asset. + +================================================================================ +Eclipse Public License - v 2.0 +================================================================================ + +Eclipse Public License - v 2.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 content 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 changes or additions to the Program that are not Modified Works. +"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 or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other form, that is based on (or derived from) the Program and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that results from an addition to, deletion from, or modification of the contents of the Program, including, for purposes of clarity any new file in Source Code form that contains any contents of the Program. Modified Works shall not include works that contain only declarations, interfaces, types, classes, structures, or files of the Program solely in each case in order to link to, bind by name, or subclass the Program or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, Version 2.0, or any later versions of that license, including any exceptions or additional permissions as identified by the initial Contributor. + +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. +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 or other 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. +e) Notwithstanding the terms of any Secondary License, no Contributor makes additional grants to any Recipient (other than those set forth in this Agreement) as a result of such Recipient's receipt of the Program under the terms of a Secondary License (if permitted under the terms of Section 3). + +3. REQUIREMENTS +3.1 If a Contributor Distributes the Program in any form, then: + +a) the Program must also be made available as Source Code, in accordance with section 3.2, and the Contributor must accompany the Program with a statement that the Source Code for the Program is available under this Agreement, and informs Recipients how to obtain it in a reasonable manner on or through a medium customarily used for software exchange; and +b) the Contributor may Distribute the Program under a license different than this Agreement, provided that such license: +i) effectively disclaims on behalf of all other 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 other Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; +iii) does not attempt to limit or alter the recipients' rights in the Source Code under section 3.2; and +iv) requires any subsequent distribution of the Program by any party to be under a license that satisfies the requirements of this section 3. + +3.2 When the Program is Distributed as Source Code: + +a) it must be made available under this Agreement, or if the Program (i) is combined with other material in a separate file or files made available under a Secondary License, and (ii) the initial Contributor attached to the Source Code the notice described in Exhibit A of this Agreement, then the Program may be made available under the terms of such Secondary Licenses, and +b) a copy of this Agreement must be included with each copy of the Program. + +3.3 Contributors may not remove or alter any copyright, patent, trademark, attribution notices, disclaimers of warranty, or limitations of liability ('notices') contained within the Program from any copy of the Program which they Distribute, provided that Contributors may add their own appropriate notices. + +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 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, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, 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, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, 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. Nothing in this Agreement is intended to be enforceable by any entity that is not a Contributor or Recipient. No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice +"This Source Code may also be made available under the following Secondary Licenses when the conditions for such availability set forth in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), version(s), and exceptions or additional permissions here}." + +Simply including a copy of this Agreement, including this Exhibit A is not sufficient to license the Source Code under Secondary Licenses. + +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. + +================================================================================ +Apache License 2.0 +================================================================================ + +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. + +"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. + +"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. + +"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 patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work. + +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; 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. + +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. + +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 on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND. + +8. Limitation of Liability. In no event and under no legal theory shall any Contributor be liable to You for damages arising as a result of this License or out of the use or inability to use the Work. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer support, warranty, indemnity, or other liability obligations and/or rights consistent with this License, but only on Your own behalf. + +END OF TERMS AND CONDITIONS diff --git a/rohd_devtools_extension/assets/third_party/elkjs/elk.bundled.js b/rohd_devtools_extension/assets/third_party/elkjs/elk.bundled.js new file mode 100644 index 0000000000..5973d0aace --- /dev/null +++ b/rohd_devtools_extension/assets/third_party/elkjs/elk.bundled.js @@ -0,0 +1,6444 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ELK = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$defaultLayoutOpt = _ref.defaultLayoutOptions, + defaultLayoutOptions = _ref$defaultLayoutOpt === undefined ? {} : _ref$defaultLayoutOpt, + _ref$algorithms = _ref.algorithms, + algorithms = _ref$algorithms === undefined ? ['layered', 'stress', 'mrtree', 'radial', 'force', 'disco', 'sporeOverlap', 'sporeCompaction', 'rectpacking'] : _ref$algorithms, + workerFactory = _ref.workerFactory, + workerUrl = _ref.workerUrl; + + _classCallCheck(this, ELK); + + this.defaultLayoutOptions = defaultLayoutOptions; + this.initialized = false; + + // check valid worker construction possible + if (typeof workerUrl === 'undefined' && typeof workerFactory === 'undefined') { + throw new Error("Cannot construct an ELK without both 'workerUrl' and 'workerFactory'."); + } + var factory = workerFactory; + if (typeof workerUrl !== 'undefined' && typeof workerFactory === 'undefined') { + // use default Web Worker + factory = function factory(url) { + return new Worker(url); + }; + } + + // create the worker + var worker = factory(workerUrl); + if (typeof worker.postMessage !== 'function') { + throw new TypeError("Created worker does not provide" + " the required 'postMessage' function."); + } + + // wrap the worker to return promises + this.worker = new PromisedWorker(worker); + + // initially register algorithms + this.worker.postMessage({ + cmd: 'register', + algorithms: algorithms + }).then(function (r) { + return _this.initialized = true; + }).catch(console.err); + } + + _createClass(ELK, [{ + key: 'layout', + value: function layout(graph) { + var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + _ref2$layoutOptions = _ref2.layoutOptions, + layoutOptions = _ref2$layoutOptions === undefined ? this.defaultLayoutOptions : _ref2$layoutOptions, + _ref2$logging = _ref2.logging, + logging = _ref2$logging === undefined ? false : _ref2$logging, + _ref2$measureExecutio = _ref2.measureExecutionTime, + measureExecutionTime = _ref2$measureExecutio === undefined ? false : _ref2$measureExecutio; + + if (!graph) { + return Promise.reject(new Error("Missing mandatory parameter 'graph'.")); + } + return this.worker.postMessage({ + cmd: 'layout', + graph: graph, + layoutOptions: layoutOptions, + options: { + logging: logging, + measureExecutionTime: measureExecutionTime + } + }); + } + }, { + key: 'knownLayoutAlgorithms', + value: function knownLayoutAlgorithms() { + return this.worker.postMessage({ cmd: 'algorithms' }); + } + }, { + key: 'knownLayoutOptions', + value: function knownLayoutOptions() { + return this.worker.postMessage({ cmd: 'options' }); + } + }, { + key: 'knownLayoutCategories', + value: function knownLayoutCategories() { + return this.worker.postMessage({ cmd: 'categories' }); + } + }, { + key: 'terminateWorker', + value: function terminateWorker() { + this.worker.terminate(); + } + }]); + + return ELK; +}(); + +exports.default = ELK; + +var PromisedWorker = function () { + function PromisedWorker(worker) { + var _this2 = this; + + _classCallCheck(this, PromisedWorker); + + if (worker === undefined) { + throw new Error("Missing mandatory parameter 'worker'."); + } + this.resolvers = {}; + this.worker = worker; + this.worker.onmessage = function (answer) { + // why is this necessary? + setTimeout(function () { + _this2.receive(_this2, answer); + }, 0); + }; + } + + _createClass(PromisedWorker, [{ + key: 'postMessage', + value: function postMessage(msg) { + var id = this.id || 0; + this.id = id + 1; + msg.id = id; + var self = this; + return new Promise(function (resolve, reject) { + // prepare the resolver + self.resolvers[id] = function (err, res) { + if (err) { + self.convertGwtStyleError(err); + reject(err); + } else { + resolve(res); + } + }; + // post the message + self.worker.postMessage(msg); + }); + } + }, { + key: 'receive', + value: function receive(self, answer) { + var json = answer.data; + var resolver = self.resolvers[json.id]; + if (resolver) { + delete self.resolvers[json.id]; + if (json.error) { + resolver(json.error); + } else { + resolver(null, json.data); + } + } + } + }, { + key: 'terminate', + value: function terminate() { + if (this.worker.terminate) { + this.worker.terminate(); + } + } + }, { + key: 'convertGwtStyleError', + value: function convertGwtStyleError(err) { + if (!err) { + return; + } + // Somewhat flatten the way GWT stores nested exception(s) + var javaException = err['__java$exception']; + if (javaException) { + // Note that the property name of the nested exception is different + // in the non-minified ('cause') and the minified (not deterministic) version. + // Hence, the version below only works for the non-minified version. + // However, as the minified stack trace is not of much use anyway, one + // should switch the used version for debugging in such a case. + if (javaException.cause && javaException.cause.backingJsObject) { + err.cause = javaException.cause.backingJsObject; + this.convertGwtStyleError(err.cause); + } + delete err['__java$exception']; + } + } + }]); + + return PromisedWorker; +}(); +},{}],2:[function(require,module,exports){ +(function (global){(function (){ +'use strict'; + +// -------------- FAKE ELEMENTS GWT ASSUMES EXIST -------------- +var $wnd; +if (typeof window !== 'undefined') + $wnd = window +else if (typeof global !== 'undefined') + $wnd = global // nodejs +else if (typeof self !== 'undefined') + $wnd = self // web worker + +var $moduleName, + $moduleBase; + +// -------------- WORKAROUND STRICT MODE, SEE #127 -------------- +var g, i, o; + +// -------------- GENERATED CODE -------------- +function nb(){} +function xb(){} +function Fd(){} +function $g(){} +function _p(){} +function yq(){} +function Sq(){} +function Es(){} +function Jw(){} +function Vw(){} +function VA(){} +function dA(){} +function MA(){} +function PA(){} +function PB(){} +function bx(){} +function cx(){} +function vy(){} +function Nz(){} +function Yz(){} +function Ylb(){} +function Ymb(){} +function xmb(){} +function Fmb(){} +function Qmb(){} +function gcb(){} +function ccb(){} +function jcb(){} +function jtb(){} +function otb(){} +function qtb(){} +function _fb(){} +function bpb(){} +function kpb(){} +function ppb(){} +function Gpb(){} +function drb(){} +function dzb(){} +function fzb(){} +function fxb(){} +function Vxb(){} +function Ovb(){} +function byb(){} +function zyb(){} +function Zyb(){} +function _yb(){} +function hzb(){} +function jzb(){} +function lzb(){} +function nzb(){} +function rzb(){} +function zzb(){} +function Czb(){} +function Ezb(){} +function Gzb(){} +function Izb(){} +function Mzb(){} +function bBb(){} +function NBb(){} +function PBb(){} +function RBb(){} +function iCb(){} +function OCb(){} +function SCb(){} +function GDb(){} +function JDb(){} +function fEb(){} +function xEb(){} +function CEb(){} +function GEb(){} +function yFb(){} +function KGb(){} +function tIb(){} +function vIb(){} +function xIb(){} +function zIb(){} +function OIb(){} +function SIb(){} +function TJb(){} +function VJb(){} +function XJb(){} +function XKb(){} +function fKb(){} +function VKb(){} +function VLb(){} +function jLb(){} +function nLb(){} +function GLb(){} +function KLb(){} +function MLb(){} +function OLb(){} +function RLb(){} +function YLb(){} +function bMb(){} +function gMb(){} +function lMb(){} +function pMb(){} +function wMb(){} +function zMb(){} +function CMb(){} +function FMb(){} +function LMb(){} +function zNb(){} +function PNb(){} +function kOb(){} +function pOb(){} +function tOb(){} +function yOb(){} +function FOb(){} +function GPb(){} +function aQb(){} +function cQb(){} +function eQb(){} +function gQb(){} +function iQb(){} +function CQb(){} +function MQb(){} +function OQb(){} +function ASb(){} +function fTb(){} +function kTb(){} +function STb(){} +function fUb(){} +function DUb(){} +function VUb(){} +function YUb(){} +function _Ub(){} +function _Wb(){} +function QWb(){} +function XWb(){} +function jVb(){} +function DVb(){} +function VVb(){} +function $Vb(){} +function dXb(){} +function hXb(){} +function lXb(){} +function gYb(){} +function HYb(){} +function SYb(){} +function VYb(){} +function dZb(){} +function P$b(){} +function T$b(){} +function h1b(){} +function m1b(){} +function q1b(){} +function u1b(){} +function y1b(){} +function C1b(){} +function e2b(){} +function g2b(){} +function m2b(){} +function q2b(){} +function u2b(){} +function S2b(){} +function U2b(){} +function W2b(){} +function _2b(){} +function e3b(){} +function h3b(){} +function p3b(){} +function t3b(){} +function w3b(){} +function y3b(){} +function A3b(){} +function M3b(){} +function Q3b(){} +function U3b(){} +function Y3b(){} +function l4b(){} +function q4b(){} +function s4b(){} +function u4b(){} +function w4b(){} +function y4b(){} +function L4b(){} +function N4b(){} +function P4b(){} +function R4b(){} +function T4b(){} +function X4b(){} +function I5b(){} +function Q5b(){} +function T5b(){} +function Z5b(){} +function l6b(){} +function o6b(){} +function t6b(){} +function z6b(){} +function L6b(){} +function M6b(){} +function P6b(){} +function X6b(){} +function $6b(){} +function a7b(){} +function c7b(){} +function g7b(){} +function j7b(){} +function m7b(){} +function r7b(){} +function x7b(){} +function D7b(){} +function D9b(){} +function b9b(){} +function h9b(){} +function j9b(){} +function l9b(){} +function w9b(){} +function F9b(){} +function hac(){} +function jac(){} +function pac(){} +function uac(){} +function Iac(){} +function Kac(){} +function Sac(){} +function obc(){} +function rbc(){} +function vbc(){} +function Fbc(){} +function Jbc(){} +function Xbc(){} +function ccc(){} +function fcc(){} +function lcc(){} +function occ(){} +function tcc(){} +function ycc(){} +function Acc(){} +function Ccc(){} +function Ecc(){} +function Gcc(){} +function Zcc(){} +function _cc(){} +function bdc(){} +function fdc(){} +function jdc(){} +function pdc(){} +function sdc(){} +function ydc(){} +function Adc(){} +function Cdc(){} +function Edc(){} +function Idc(){} +function Ndc(){} +function Qdc(){} +function Sdc(){} +function Udc(){} +function Wdc(){} +function Ydc(){} +function aec(){} +function hec(){} +function jec(){} +function lec(){} +function nec(){} +function uec(){} +function wec(){} +function yec(){} +function Aec(){} +function Fec(){} +function Jec(){} +function Lec(){} +function Nec(){} +function Rec(){} +function Uec(){} +function Zec(){} +function Zfc(){} +function lfc(){} +function tfc(){} +function xfc(){} +function zfc(){} +function Ffc(){} +function Jfc(){} +function Nfc(){} +function Pfc(){} +function Vfc(){} +function _fc(){} +function fgc(){} +function jgc(){} +function lgc(){} +function Bgc(){} +function ehc(){} +function ghc(){} +function ihc(){} +function khc(){} +function mhc(){} +function ohc(){} +function qhc(){} +function yhc(){} +function Ahc(){} +function Ghc(){} +function Ihc(){} +function Khc(){} +function Mhc(){} +function Shc(){} +function Uhc(){} +function Whc(){} +function dic(){} +function dlc(){} +function blc(){} +function flc(){} +function hlc(){} +function jlc(){} +function Glc(){} +function Ilc(){} +function Klc(){} +function Mlc(){} +function Mjc(){} +function Qjc(){} +function Qlc(){} +function Ulc(){} +function Ylc(){} +function Lkc(){} +function Nkc(){} +function Pkc(){} +function Rkc(){} +function Xkc(){} +function _kc(){} +function gmc(){} +function kmc(){} +function zmc(){} +function Fmc(){} +function Wmc(){} +function $mc(){} +function anc(){} +function mnc(){} +function wnc(){} +function Hnc(){} +function Jnc(){} +function Lnc(){} +function Nnc(){} +function Pnc(){} +function Ync(){} +function eoc(){} +function Aoc(){} +function Coc(){} +function Eoc(){} +function Joc(){} +function Loc(){} +function Zoc(){} +function _oc(){} +function bpc(){} +function hpc(){} +function kpc(){} +function ppc(){} +function pFc(){} +function Ryc(){} +function QCc(){} +function PDc(){} +function xGc(){} +function HGc(){} +function JGc(){} +function NGc(){} +function GIc(){} +function iKc(){} +function mKc(){} +function wKc(){} +function yKc(){} +function AKc(){} +function EKc(){} +function KKc(){} +function OKc(){} +function QKc(){} +function SKc(){} +function UKc(){} +function YKc(){} +function aLc(){} +function fLc(){} +function hLc(){} +function nLc(){} +function pLc(){} +function tLc(){} +function vLc(){} +function zLc(){} +function BLc(){} +function DLc(){} +function FLc(){} +function sMc(){} +function JMc(){} +function hNc(){} +function RNc(){} +function ZNc(){} +function _Nc(){} +function bOc(){} +function dOc(){} +function fOc(){} +function hOc(){} +function hRc(){} +function jRc(){} +function KRc(){} +function NRc(){} +function NQc(){} +function LQc(){} +function _Qc(){} +function cPc(){} +function iPc(){} +function kPc(){} +function mPc(){} +function xPc(){} +function zPc(){} +function zSc(){} +function BSc(){} +function GSc(){} +function ISc(){} +function NSc(){} +function TSc(){} +function NTc(){} +function NVc(){} +function oVc(){} +function SVc(){} +function VVc(){} +function XVc(){} +function ZVc(){} +function bWc(){} +function bXc(){} +function CXc(){} +function FXc(){} +function IXc(){} +function MXc(){} +function UXc(){} +function bYc(){} +function fYc(){} +function oYc(){} +function qYc(){} +function uYc(){} +function pZc(){} +function G$c(){} +function h0c(){} +function N0c(){} +function k1c(){} +function I1c(){} +function Q1c(){} +function f2c(){} +function i2c(){} +function k2c(){} +function w2c(){} +function O2c(){} +function S2c(){} +function Z2c(){} +function v3c(){} +function x3c(){} +function R3c(){} +function U3c(){} +function e4c(){} +function w4c(){} +function x4c(){} +function z4c(){} +function B4c(){} +function D4c(){} +function F4c(){} +function H4c(){} +function J4c(){} +function L4c(){} +function N4c(){} +function P4c(){} +function R4c(){} +function T4c(){} +function V4c(){} +function X4c(){} +function Z4c(){} +function _4c(){} +function _7c(){} +function b5c(){} +function d5c(){} +function f5c(){} +function h5c(){} +function H5c(){} +function Hfd(){} +function Zfd(){} +function Zed(){} +function ged(){} +function Jed(){} +function Ned(){} +function Red(){} +function Ved(){} +function bbd(){} +function mdd(){} +function _fd(){} +function fgd(){} +function kgd(){} +function Mgd(){} +function Ahd(){} +function Ald(){} +function Tld(){} +function xkd(){} +function rmd(){} +function knd(){} +function Jod(){} +function JCd(){} +function Bpd(){} +function BFd(){} +function oFd(){} +function bqd(){} +function bvd(){} +function jvd(){} +function yud(){} +function Hxd(){} +function EBd(){} +function aDd(){} +function MGd(){} +function vHd(){} +function RHd(){} +function wNd(){} +function zNd(){} +function CNd(){} +function KNd(){} +function XNd(){} +function $Nd(){} +function HPd(){} +function lUd(){} +function XUd(){} +function DWd(){} +function GWd(){} +function JWd(){} +function MWd(){} +function PWd(){} +function SWd(){} +function VWd(){} +function YWd(){} +function _Wd(){} +function xYd(){} +function BYd(){} +function mZd(){} +function EZd(){} +function GZd(){} +function JZd(){} +function MZd(){} +function PZd(){} +function SZd(){} +function VZd(){} +function YZd(){} +function _Zd(){} +function c$d(){} +function f$d(){} +function i$d(){} +function l$d(){} +function o$d(){} +function r$d(){} +function u$d(){} +function x$d(){} +function A$d(){} +function D$d(){} +function G$d(){} +function J$d(){} +function M$d(){} +function P$d(){} +function S$d(){} +function V$d(){} +function Y$d(){} +function _$d(){} +function c_d(){} +function f_d(){} +function i_d(){} +function l_d(){} +function o_d(){} +function r_d(){} +function u_d(){} +function x_d(){} +function A_d(){} +function D_d(){} +function G_d(){} +function J_d(){} +function M_d(){} +function P_d(){} +function S_d(){} +function V_d(){} +function Y_d(){} +function h5d(){} +function U6d(){} +function U9d(){} +function _8d(){} +function fae(){} +function hae(){} +function kae(){} +function nae(){} +function qae(){} +function tae(){} +function wae(){} +function zae(){} +function Cae(){} +function Fae(){} +function Iae(){} +function Lae(){} +function Oae(){} +function Rae(){} +function Uae(){} +function Xae(){} +function $ae(){} +function bbe(){} +function ebe(){} +function hbe(){} +function kbe(){} +function nbe(){} +function qbe(){} +function tbe(){} +function wbe(){} +function zbe(){} +function Cbe(){} +function Fbe(){} +function Ibe(){} +function Lbe(){} +function Obe(){} +function Rbe(){} +function Ube(){} +function Xbe(){} +function $be(){} +function bce(){} +function ece(){} +function hce(){} +function kce(){} +function nce(){} +function qce(){} +function tce(){} +function wce(){} +function zce(){} +function Cce(){} +function Fce(){} +function Ice(){} +function Lce(){} +function Oce(){} +function Rce(){} +function Uce(){} +function Xce(){} +function ude(){} +function Vge(){} +function dhe(){} +function s_b(a){} +function jSd(a){} +function ol(){wb()} +function oPb(){nPb()} +function EPb(){CPb()} +function gFb(){fFb()} +function TRb(){SRb()} +function ySb(){wSb()} +function PSb(){OSb()} +function dTb(){bTb()} +function i4b(){b4b()} +function D2b(){x2b()} +function J6b(){D6b()} +function u9b(){q9b()} +function $9b(){I9b()} +function Umc(){Imc()} +function abc(){Vac()} +function ZCc(){VCc()} +function kCc(){hCc()} +function rCc(){oCc()} +function Tcc(){Occ()} +function xkc(){gkc()} +function xDc(){rDc()} +function iDc(){cDc()} +function kwc(){jwc()} +function tJc(){jJc()} +function dJc(){aJc()} +function Pyc(){Nyc()} +function VBc(){SBc()} +function CFc(){yFc()} +function CUc(){wUc()} +function lUc(){fUc()} +function sUc(){pUc()} +function IUc(){GUc()} +function IWc(){HWc()} +function _Wc(){ZWc()} +function fHc(){dHc()} +function f0c(){d0c()} +function B0c(){A0c()} +function L0c(){J0c()} +function LTc(){JTc()} +function sTc(){rTc()} +function KLc(){ILc()} +function wNc(){tNc()} +function PYc(){OYc()} +function nZc(){lZc()} +function q3c(){p3c()} +function Z7c(){X7c()} +function Z9c(){Y9c()} +function _ad(){Zad()} +function kdd(){idd()} +function $md(){Smd()} +function HGd(){tGd()} +function hLd(){NKd()} +function J6d(){Uge()} +function Mvb(a){uCb(a)} +function Yb(a){this.a=a} +function cc(a){this.a=a} +function cj(a){this.a=a} +function ij(a){this.a=a} +function Dj(a){this.a=a} +function df(a){this.a=a} +function kf(a){this.a=a} +function ah(a){this.a=a} +function lh(a){this.a=a} +function th(a){this.a=a} +function Ph(a){this.a=a} +function vi(a){this.a=a} +function Ci(a){this.a=a} +function Fk(a){this.a=a} +function Ln(a){this.a=a} +function ap(a){this.a=a} +function zp(a){this.a=a} +function Yp(a){this.a=a} +function qq(a){this.a=a} +function Dq(a){this.a=a} +function wr(a){this.a=a} +function Ir(a){this.b=a} +function sj(a){this.c=a} +function sw(a){this.a=a} +function fw(a){this.a=a} +function xw(a){this.a=a} +function Cw(a){this.a=a} +function Qw(a){this.a=a} +function Rw(a){this.a=a} +function Xw(a){this.a=a} +function Xv(a){this.a=a} +function Sv(a){this.a=a} +function eu(a){this.a=a} +function Zx(a){this.a=a} +function _x(a){this.a=a} +function xy(a){this.a=a} +function xB(a){this.a=a} +function HB(a){this.a=a} +function TB(a){this.a=a} +function fC(a){this.a=a} +function wB(){this.a=[]} +function MBb(a,b){a.a=b} +function w_b(a,b){a.a=b} +function x_b(a,b){a.b=b} +function YOb(a,b){a.b=b} +function $Ob(a,b){a.b=b} +function ZGb(a,b){a.j=b} +function qNb(a,b){a.g=b} +function rNb(a,b){a.i=b} +function dRb(a,b){a.c=b} +function eRb(a,b){a.d=b} +function z_b(a,b){a.d=b} +function y_b(a,b){a.c=b} +function __b(a,b){a.k=b} +function E0b(a,b){a.c=b} +function njc(a,b){a.c=b} +function mjc(a,b){a.a=b} +function dFc(a,b){a.a=b} +function eFc(a,b){a.f=b} +function nOc(a,b){a.a=b} +function oOc(a,b){a.b=b} +function pOc(a,b){a.d=b} +function qOc(a,b){a.i=b} +function rOc(a,b){a.o=b} +function sOc(a,b){a.r=b} +function $Pc(a,b){a.a=b} +function _Pc(a,b){a.b=b} +function DVc(a,b){a.e=b} +function EVc(a,b){a.f=b} +function FVc(a,b){a.g=b} +function SZc(a,b){a.e=b} +function TZc(a,b){a.f=b} +function c$c(a,b){a.f=b} +function bJd(a,b){a.n=b} +function A1d(a,b){a.a=b} +function J1d(a,b){a.a=b} +function B1d(a,b){a.c=b} +function K1d(a,b){a.c=b} +function L1d(a,b){a.d=b} +function M1d(a,b){a.e=b} +function N1d(a,b){a.g=b} +function d2d(a,b){a.a=b} +function e2d(a,b){a.c=b} +function f2d(a,b){a.d=b} +function g2d(a,b){a.e=b} +function h2d(a,b){a.f=b} +function i2d(a,b){a.j=b} +function Z8d(a,b){a.a=b} +function $8d(a,b){a.b=b} +function g9d(a,b){a.a=b} +function Cic(a){a.b=a.a} +function Dg(a){a.c=a.d.d} +function vib(a){this.d=a} +function eib(a){this.a=a} +function Pib(a){this.a=a} +function Vib(a){this.a=a} +function $ib(a){this.a=a} +function mcb(a){this.a=a} +function Mcb(a){this.a=a} +function Xcb(a){this.a=a} +function Ndb(a){this.a=a} +function _db(a){this.a=a} +function teb(a){this.a=a} +function Qeb(a){this.a=a} +function djb(a){this.a=a} +function Gjb(a){this.a=a} +function Njb(a){this.a=a} +function Bjb(a){this.b=a} +function lnb(a){this.b=a} +function Dnb(a){this.b=a} +function anb(a){this.a=a} +function Mob(a){this.a=a} +function Rob(a){this.a=a} +function iob(a){this.c=a} +function olb(a){this.c=a} +function qub(a){this.c=a} +function Tub(a){this.a=a} +function Vub(a){this.a=a} +function Xub(a){this.a=a} +function Zub(a){this.a=a} +function tpb(a){this.a=a} +function _pb(a){this.a=a} +function Wqb(a){this.a=a} +function nsb(a){this.a=a} +function Rxb(a){this.a=a} +function Txb(a){this.a=a} +function Xxb(a){this.a=a} +function bzb(a){this.a=a} +function tzb(a){this.a=a} +function vzb(a){this.a=a} +function xzb(a){this.a=a} +function Kzb(a){this.a=a} +function Ozb(a){this.a=a} +function iAb(a){this.a=a} +function kAb(a){this.a=a} +function mAb(a){this.a=a} +function BAb(a){this.a=a} +function hBb(a){this.a=a} +function jBb(a){this.a=a} +function nBb(a){this.a=a} +function TBb(a){this.a=a} +function XBb(a){this.a=a} +function QCb(a){this.a=a} +function WCb(a){this.a=a} +function _Cb(a){this.a=a} +function dEb(a){this.a=a} +function QGb(a){this.a=a} +function YGb(a){this.a=a} +function tKb(a){this.a=a} +function CLb(a){this.a=a} +function JMb(a){this.a=a} +function RNb(a){this.a=a} +function kQb(a){this.a=a} +function mQb(a){this.a=a} +function FQb(a){this.a=a} +function ETb(a){this.a=a} +function UTb(a){this.a=a} +function dUb(a){this.a=a} +function hUb(a){this.a=a} +function EZb(a){this.a=a} +function j$b(a){this.a=a} +function v$b(a){this.e=a} +function J0b(a){this.a=a} +function M0b(a){this.a=a} +function R0b(a){this.a=a} +function U0b(a){this.a=a} +function i2b(a){this.a=a} +function k2b(a){this.a=a} +function o2b(a){this.a=a} +function s2b(a){this.a=a} +function G2b(a){this.a=a} +function I2b(a){this.a=a} +function K2b(a){this.a=a} +function M2b(a){this.a=a} +function W3b(a){this.a=a} +function $3b(a){this.a=a} +function V4b(a){this.a=a} +function u5b(a){this.a=a} +function A7b(a){this.a=a} +function G7b(a){this.a=a} +function J7b(a){this.a=a} +function M7b(a){this.a=a} +function Mbc(a){this.a=a} +function Pbc(a){this.a=a} +function lac(a){this.a=a} +function nac(a){this.a=a} +function qcc(a){this.a=a} +function Gdc(a){this.a=a} +function $dc(a){this.a=a} +function cec(a){this.a=a} +function _ec(a){this.a=a} +function pfc(a){this.a=a} +function Bfc(a){this.a=a} +function Lfc(a){this.a=a} +function ygc(a){this.a=a} +function Dgc(a){this.a=a} +function shc(a){this.a=a} +function uhc(a){this.a=a} +function whc(a){this.a=a} +function Chc(a){this.a=a} +function Ehc(a){this.a=a} +function Ohc(a){this.a=a} +function Yhc(a){this.a=a} +function Tkc(a){this.a=a} +function Vkc(a){this.a=a} +function Olc(a){this.a=a} +function pnc(a){this.a=a} +function rnc(a){this.a=a} +function dpc(a){this.a=a} +function fpc(a){this.a=a} +function GCc(a){this.a=a} +function KCc(a){this.a=a} +function mDc(a){this.a=a} +function jEc(a){this.a=a} +function HEc(a){this.a=a} +function FEc(a){this.c=a} +function qoc(a){this.b=a} +function bFc(a){this.a=a} +function GFc(a){this.a=a} +function iGc(a){this.a=a} +function kGc(a){this.a=a} +function mGc(a){this.a=a} +function $Gc(a){this.a=a} +function hIc(a){this.a=a} +function lIc(a){this.a=a} +function pIc(a){this.a=a} +function tIc(a){this.a=a} +function xIc(a){this.a=a} +function zIc(a){this.a=a} +function CIc(a){this.a=a} +function LIc(a){this.a=a} +function CKc(a){this.a=a} +function IKc(a){this.a=a} +function MKc(a){this.a=a} +function $Kc(a){this.a=a} +function cLc(a){this.a=a} +function jLc(a){this.a=a} +function rLc(a){this.a=a} +function xLc(a){this.a=a} +function OMc(a){this.a=a} +function ZOc(a){this.a=a} +function ZRc(a){this.a=a} +function aSc(a){this.a=a} +function I$c(a){this.a=a} +function K$c(a){this.a=a} +function M$c(a){this.a=a} +function O$c(a){this.a=a} +function U$c(a){this.a=a} +function n1c(a){this.a=a} +function z1c(a){this.a=a} +function B1c(a){this.a=a} +function Q2c(a){this.a=a} +function U2c(a){this.a=a} +function z3c(a){this.a=a} +function med(a){this.a=a} +function Xed(a){this.a=a} +function _ed(a){this.a=a} +function Qfd(a){this.a=a} +function Bgd(a){this.a=a} +function $gd(a){this.a=a} +function lrd(a){this.a=a} +function urd(a){this.a=a} +function vrd(a){this.a=a} +function wrd(a){this.a=a} +function xrd(a){this.a=a} +function yrd(a){this.a=a} +function zrd(a){this.a=a} +function Ard(a){this.a=a} +function Brd(a){this.a=a} +function Crd(a){this.a=a} +function Ird(a){this.a=a} +function Krd(a){this.a=a} +function Lrd(a){this.a=a} +function Mrd(a){this.a=a} +function Nrd(a){this.a=a} +function Prd(a){this.a=a} +function Srd(a){this.a=a} +function Yrd(a){this.a=a} +function Zrd(a){this.a=a} +function _rd(a){this.a=a} +function asd(a){this.a=a} +function bsd(a){this.a=a} +function csd(a){this.a=a} +function dsd(a){this.a=a} +function msd(a){this.a=a} +function osd(a){this.a=a} +function qsd(a){this.a=a} +function ssd(a){this.a=a} +function Wsd(a){this.a=a} +function Lsd(a){this.b=a} +function thd(a){this.f=a} +function qtd(a){this.a=a} +function yBd(a){this.a=a} +function GBd(a){this.a=a} +function MBd(a){this.a=a} +function SBd(a){this.a=a} +function iCd(a){this.a=a} +function YMd(a){this.a=a} +function GNd(a){this.a=a} +function EPd(a){this.a=a} +function EQd(a){this.a=a} +function NTd(a){this.a=a} +function qOd(a){this.b=a} +function lVd(a){this.c=a} +function VVd(a){this.e=a} +function iYd(a){this.a=a} +function RYd(a){this.a=a} +function ZYd(a){this.a=a} +function z0d(a){this.a=a} +function O0d(a){this.a=a} +function s0d(a){this.d=a} +function W5d(a){this.a=a} +function cge(a){this.a=a} +function xfe(a){this.e=a} +function Tfd(){this.a=0} +function jkb(){Vjb(this)} +function Rkb(){Ckb(this)} +function Lqb(){Uhb(this)} +function lEb(){kEb(this)} +function A_b(){s_b(this)} +function UQd(){this.c=FQd} +function v6d(a,b){b.Wb(a)} +function moc(a,b){a.b+=b} +function yXb(a){a.b=new Ji} +function vbb(a){return a.e} +function DB(a){return a.a} +function LB(a){return a.a} +function ZB(a){return a.a} +function lC(a){return a.a} +function EC(a){return a.a} +function wC(){return null} +function SB(){return null} +function hcb(){mvd();ovd()} +function zJb(a){a.b.tf(a.e)} +function j5b(a,b){a.b=b-a.b} +function g5b(a,b){a.a=b-a.a} +function PXc(a,b){b.ad(a.a)} +function plc(a,b){G0b(b,a)} +function hp(a,b,c){a.Od(c,b)} +function As(a,b){a.e=b;b.b=a} +function Zl(a){Ql();this.a=a} +function jq(a){Ql();this.a=a} +function sq(a){Ql();this.a=a} +function Fq(a){im();this.a=a} +function Sz(a){Rz();Qz.be(a)} +function gz(){Xy.call(this)} +function xcb(){Xy.call(this)} +function pcb(){gz.call(this)} +function tcb(){gz.call(this)} +function Bdb(){gz.call(this)} +function Vdb(){gz.call(this)} +function Ydb(){gz.call(this)} +function Geb(){gz.call(this)} +function bgb(){gz.call(this)} +function Apb(){gz.call(this)} +function Jpb(){gz.call(this)} +function utb(){gz.call(this)} +function x2c(){gz.call(this)} +function rQd(){this.a=this} +function MPd(){this.Bb|=256} +function tTb(){this.b=new mt} +function fA(){fA=ccb;new Lqb} +function rcb(){pcb.call(this)} +function dCb(a,b){a.length=b} +function Tvb(a,b){Ekb(a.a,b)} +function sKb(a,b){UHb(a.c,b)} +function SMc(a,b){Qqb(a.b,b)} +function vBd(a,b){uAd(a.a,b)} +function wBd(a,b){vAd(a.a,b)} +function GLd(a,b){Uhd(a.e,b)} +function d7d(a){D2d(a.c,a.b)} +function mj(a,b){a.kc().Nb(b)} +function Odb(a){this.a=Tdb(a)} +function Tqb(){this.a=new Lqb} +function gyb(){this.a=new Lqb} +function Wvb(){this.a=new Rkb} +function KFb(){this.a=new Rkb} +function PFb(){this.a=new Rkb} +function FFb(){this.a=new yFb} +function pGb(){this.a=new MFb} +function ZQb(){this.a=new MQb} +function Gxb(){this.a=new Pwb} +function jUb(){this.a=new PTb} +function sDb(){this.a=new oDb} +function zDb(){this.a=new tDb} +function CWb(){this.a=new Rkb} +function HXb(){this.a=new Rkb} +function nYb(){this.a=new Rkb} +function BYb(){this.a=new Rkb} +function fLb(){this.d=new Rkb} +function vYb(){this.a=new Tqb} +function a2b(){this.a=new Lqb} +function wZb(){this.b=new Lqb} +function TCc(){this.b=new Rkb} +function zJc(){this.e=new Rkb} +function uMc(){this.d=new Rkb} +function wdc(){this.a=new xkc} +function vKc(){Rkb.call(this)} +function twb(){Wvb.call(this)} +function oHb(){$Gb.call(this)} +function LXb(){HXb.call(this)} +function L_b(){H_b.call(this)} +function H_b(){A_b.call(this)} +function p0b(){A_b.call(this)} +function s0b(){p0b.call(this)} +function WMc(){VMc.call(this)} +function bNc(){VMc.call(this)} +function EPc(){CPc.call(this)} +function JPc(){CPc.call(this)} +function OPc(){CPc.call(this)} +function w1c(){s1c.call(this)} +function s7c(){Psb.call(this)} +function apd(){Ald.call(this)} +function ppd(){Ald.call(this)} +function lDd(){YCd.call(this)} +function NDd(){YCd.call(this)} +function mFd(){Lqb.call(this)} +function vFd(){Lqb.call(this)} +function GFd(){Lqb.call(this)} +function KPd(){Tqb.call(this)} +function OJd(){hJd.call(this)} +function aQd(){MPd.call(this)} +function SSd(){FId.call(this)} +function rUd(){FId.call(this)} +function oUd(){Lqb.call(this)} +function NYd(){Lqb.call(this)} +function cZd(){Lqb.call(this)} +function R8d(){MGd.call(this)} +function o9d(){MGd.call(this)} +function i9d(){R8d.call(this)} +function hee(){ude.call(this)} +function Dd(a){yd.call(this,a)} +function Hd(a){yd.call(this,a)} +function ph(a){lh.call(this,a)} +function Sh(a){Wc.call(this,a)} +function oi(a){Sh.call(this,a)} +function Ii(a){Wc.call(this,a)} +function Zdd(){this.a=new Psb} +function CPc(){this.a=new Tqb} +function s1c(){this.a=new Lqb} +function QSc(){this.a=new Rkb} +function D2c(){this.j=new Rkb} +function QXc(){this.a=new UXc} +function e_c(){this.a=new d_c} +function YCd(){this.a=new aDd} +function _k(){_k=ccb;$k=new al} +function Lk(){Lk=ccb;Kk=new Mk} +function wb(){wb=ccb;vb=new xb} +function hs(){hs=ccb;gs=new is} +function rs(a){Sh.call(this,a)} +function Gp(a){Sh.call(this,a)} +function xp(a){Lo.call(this,a)} +function Ep(a){Lo.call(this,a)} +function Tp(a){Wn.call(this,a)} +function wx(a){un.call(this,a)} +function ov(a){dv.call(this,a)} +function Mv(a){Br.call(this,a)} +function Ov(a){Br.call(this,a)} +function Lw(a){Br.call(this,a)} +function hz(a){Yy.call(this,a)} +function MB(a){hz.call(this,a)} +function eC(){fC.call(this,{})} +function Ftb(a){Atb();this.a=a} +function zwb(a){a.b=null;a.c=0} +function Vy(a,b){a.e=b;Sy(a,b)} +function LVb(a,b){a.a=b;NVb(a)} +function lIb(a,b,c){a.a[b.g]=c} +function vfd(a,b,c){Dfd(c,a,b)} +function Odc(a,b){rjc(b.i,a.n)} +function Wyc(a,b){Xyc(a).td(b)} +function ERb(a,b){return a*a/b} +function Xr(a,b){return a.g-b.g} +function tC(a){return new TB(a)} +function vC(a){return new yC(a)} +function ocb(a){hz.call(this,a)} +function qcb(a){hz.call(this,a)} +function ucb(a){hz.call(this,a)} +function vcb(a){Yy.call(this,a)} +function fGc(a){LFc();this.a=a} +function c0d(a){kzd();this.a=a} +function bhd(a){Rgd();this.f=a} +function dhd(a){Rgd();this.f=a} +function Cdb(a){hz.call(this,a)} +function Wdb(a){hz.call(this,a)} +function Zdb(a){hz.call(this,a)} +function Feb(a){hz.call(this,a)} +function Heb(a){hz.call(this,a)} +function Ccb(a){return uCb(a),a} +function Edb(a){return uCb(a),a} +function Gdb(a){return uCb(a),a} +function jfb(a){return uCb(a),a} +function tfb(a){return uCb(a),a} +function akb(a){return a.b==a.c} +function Hwb(a){return !!a&&a.b} +function pIb(a){return !!a&&a.k} +function qIb(a){return !!a&&a.j} +function amb(a){uCb(a);this.a=a} +function wVb(a){qVb(a);return a} +function Blb(a){Glb(a,a.length)} +function cgb(a){hz.call(this,a)} +function cqd(a){hz.call(this,a)} +function n8d(a){hz.call(this,a)} +function y2c(a){hz.call(this,a)} +function z2c(a){hz.call(this,a)} +function mde(a){hz.call(this,a)} +function pc(a){qc.call(this,a,0)} +function Ji(){Ki.call(this,12,3)} +function Kz(){Kz=ccb;Jz=new Nz} +function jz(){jz=ccb;iz=new nb} +function KA(){KA=ccb;JA=new MA} +function OB(){OB=ccb;NB=new PB} +function jc(){throw vbb(new bgb)} +function zh(){throw vbb(new bgb)} +function Pi(){throw vbb(new bgb)} +function Pj(){throw vbb(new bgb)} +function Qj(){throw vbb(new bgb)} +function Ym(){throw vbb(new bgb)} +function Gb(){this.a=GD(Qb(She))} +function oy(a){Ql();this.a=Qb(a)} +function Bs(a,b){a.Td(b);b.Sd(a)} +function iw(a,b){a.a.ec().Mc(b)} +function CYb(a,b,c){a.c.lf(b,c)} +function scb(a){qcb.call(this,a)} +function Oeb(a){Wdb.call(this,a)} +function Hfb(){mcb.call(this,'')} +function Ifb(){mcb.call(this,'')} +function Ufb(){mcb.call(this,'')} +function Vfb(){mcb.call(this,'')} +function Xfb(a){qcb.call(this,a)} +function zob(a){lnb.call(this,a)} +function Yob(a){Inb.call(this,a)} +function Gob(a){zob.call(this,a)} +function Mk(){Fk.call(this,null)} +function al(){Fk.call(this,null)} +function Az(){Az=ccb;!!(Rz(),Qz)} +function wrb(){wrb=ccb;vrb=yrb()} +function Mtb(a){return a.a?a.b:0} +function Vtb(a){return a.a?a.b:0} +function Lcb(a,b){return a.a-b.a} +function Wcb(a,b){return a.a-b.a} +function Peb(a,b){return a.a-b.a} +function eCb(a,b){return PC(a,b)} +function GC(a,b){return rdb(a,b)} +function _B(b,a){return a in b.a} +function _Db(a,b){a.f=b;return a} +function ZDb(a,b){a.b=b;return a} +function $Db(a,b){a.c=b;return a} +function aEb(a,b){a.g=b;return a} +function HGb(a,b){a.a=b;return a} +function IGb(a,b){a.f=b;return a} +function JGb(a,b){a.k=b;return a} +function dLb(a,b){a.a=b;return a} +function eLb(a,b){a.e=b;return a} +function zVb(a,b){a.e=b;return a} +function AVb(a,b){a.f=b;return a} +function KOb(a,b){a.b=true;a.d=b} +function DHb(a,b){a.b=new g7c(b)} +function uvb(a,b,c){b.td(a.a[c])} +function zvb(a,b,c){b.we(a.a[c])} +function wJc(a,b){return a.b-b.b} +function kOc(a,b){return a.g-b.g} +function WQc(a,b){return a.s-b.s} +function Lic(a,b){return a?0:b-1} +function SFc(a,b){return a?0:b-1} +function RFc(a,b){return a?b-1:0} +function M2c(a,b){return b.Yf(a)} +function M3c(a,b){a.b=b;return a} +function L3c(a,b){a.a=b;return a} +function N3c(a,b){a.c=b;return a} +function O3c(a,b){a.d=b;return a} +function P3c(a,b){a.e=b;return a} +function Q3c(a,b){a.f=b;return a} +function b4c(a,b){a.a=b;return a} +function c4c(a,b){a.b=b;return a} +function d4c(a,b){a.c=b;return a} +function z5c(a,b){a.c=b;return a} +function y5c(a,b){a.b=b;return a} +function A5c(a,b){a.d=b;return a} +function B5c(a,b){a.e=b;return a} +function C5c(a,b){a.f=b;return a} +function D5c(a,b){a.g=b;return a} +function E5c(a,b){a.a=b;return a} +function F5c(a,b){a.i=b;return a} +function G5c(a,b){a.j=b;return a} +function Vdd(a,b){a.k=b;return a} +function Wdd(a,b){a.j=b;return a} +function ykc(a,b){gkc();F0b(b,a)} +function T$c(a,b,c){R$c(a.a,b,c)} +function RGc(a){cEc.call(this,a)} +function iHc(a){cEc.call(this,a)} +function t7c(a){Qsb.call(this,a)} +function aPb(a){_Ob.call(this,a)} +function Ixd(a){zud.call(this,a)} +function dCd(a){ZBd.call(this,a)} +function fCd(a){ZBd.call(this,a)} +function p_b(){q_b.call(this,'')} +function d7c(){this.a=0;this.b=0} +function aPc(){this.b=0;this.a=0} +function NJd(a,b){a.b=0;DId(a,b)} +function X1d(a,b){a.c=b;a.b=true} +function Oc(a,b){return a.c._b(b)} +function gdb(a){return a.e&&a.e()} +function Vd(a){return !a?null:a.d} +function sn(a,b){return Gv(a.b,b)} +function Fv(a){return !a?null:a.g} +function Kv(a){return !a?null:a.i} +function hdb(a){fdb(a);return a.o} +function Fhd(){Fhd=ccb;Ehd=ond()} +function Hhd(){Hhd=ccb;Ghd=Cod()} +function LFd(){LFd=ccb;KFd=qZd()} +function p8d(){p8d=ccb;o8d=Y9d()} +function r8d(){r8d=ccb;q8d=dae()} +function mvd(){mvd=ccb;lvd=n4c()} +function Srb(){throw vbb(new bgb)} +function enb(){throw vbb(new bgb)} +function fnb(){throw vbb(new bgb)} +function gnb(){throw vbb(new bgb)} +function jnb(){throw vbb(new bgb)} +function Cnb(){throw vbb(new bgb)} +function Uqb(a){this.a=new Mqb(a)} +function tgb(a){lgb();ngb(this,a)} +function Hxb(a){this.a=new Qwb(a)} +function _ub(a,b){while(a.ye(b));} +function Sub(a,b){while(a.sd(b));} +function Bfb(a,b){a.a+=b;return a} +function Cfb(a,b){a.a+=b;return a} +function Ffb(a,b){a.a+=b;return a} +function Lfb(a,b){a.a+=b;return a} +function WAb(a){Tzb(a);return a.a} +function Wsb(a){return a.b!=a.d.c} +function pD(a){return a.l|a.m<<22} +function aIc(a,b){return a.d[b.p]} +function h2c(a,b){return c2c(a,b)} +function cCb(a,b,c){a.splice(b,c)} +function WHb(a){a.c?VHb(a):XHb(a)} +function jVc(a){this.a=0;this.b=a} +function ZUc(){this.a=new L2c(K$)} +function tRc(){this.b=new L2c(h$)} +function Q$c(){this.b=new L2c(J_)} +function d_c(){this.b=new L2c(J_)} +function OCd(){throw vbb(new bgb)} +function PCd(){throw vbb(new bgb)} +function QCd(){throw vbb(new bgb)} +function RCd(){throw vbb(new bgb)} +function SCd(){throw vbb(new bgb)} +function TCd(){throw vbb(new bgb)} +function UCd(){throw vbb(new bgb)} +function VCd(){throw vbb(new bgb)} +function WCd(){throw vbb(new bgb)} +function XCd(){throw vbb(new bgb)} +function ahe(){throw vbb(new utb)} +function bhe(){throw vbb(new utb)} +function Rge(a){this.a=new ege(a)} +function ege(a){dge(this,a,Vee())} +function Fhe(a){return !a||Ehe(a)} +function dde(a){return $ce[a]!=-1} +function Iz(){xz!=0&&(xz=0);zz=-1} +function Ybb(){Wbb==null&&(Wbb=[])} +function ONd(a,b){Rxd(ZKd(a.a),b)} +function TNd(a,b){Rxd(ZKd(a.a),b)} +function Yf(a,b){zf.call(this,a,b)} +function $f(a,b){Yf.call(this,a,b)} +function Hf(a,b){this.b=a;this.c=b} +function rk(a,b){this.b=a;this.a=b} +function ek(a,b){this.a=a;this.b=b} +function gk(a,b){this.a=a;this.b=b} +function pk(a,b){this.a=a;this.b=b} +function yk(a,b){this.a=a;this.b=b} +function Ak(a,b){this.a=a;this.b=b} +function Fj(a,b){this.a=a;this.b=b} +function _j(a,b){this.a=a;this.b=b} +function dr(a,b){this.a=a;this.b=b} +function zr(a,b){this.b=a;this.a=b} +function So(a,b){this.b=a;this.a=b} +function qp(a,b){this.b=a;this.a=b} +function $q(a,b){this.b=a;this.a=b} +function $r(a,b){this.f=a;this.g=b} +function ne(a,b){this.e=a;this.d=b} +function Wo(a,b){this.g=a;this.i=b} +function bu(a,b){this.a=a;this.b=b} +function qu(a,b){this.a=a;this.f=b} +function qv(a,b){this.b=a;this.c=b} +function ox(a,b){this.a=a;this.b=b} +function Px(a,b){this.a=a;this.b=b} +function mC(a,b){this.a=a;this.b=b} +function Wc(a){Lb(a.dc());this.c=a} +function rf(a){this.b=BD(Qb(a),83)} +function Zv(a){this.a=BD(Qb(a),83)} +function dv(a){this.a=BD(Qb(a),15)} +function $u(a){this.a=BD(Qb(a),15)} +function Br(a){this.b=BD(Qb(a),47)} +function eB(){this.q=new $wnd.Date} +function Zfb(){Zfb=ccb;Yfb=new jcb} +function Emb(){Emb=ccb;Dmb=new Fmb} +function Vhb(a){return a.f.c+a.g.c} +function hnb(a,b){return a.b.Hc(b)} +function inb(a,b){return a.b.Ic(b)} +function knb(a,b){return a.b.Qc(b)} +function Dob(a,b){return a.b.Hc(b)} +function dob(a,b){return a.c.uc(b)} +function Rqb(a,b){return a.a._b(b)} +function fob(a,b){return pb(a.c,b)} +function jt(a,b){return Mhb(a.b,b)} +function Lp(a,b){return a>b&&b0} +function Gbb(a,b){return ybb(a,b)<0} +function Crb(a,b){return a.a.get(b)} +function icb(b,a){return a.split(b)} +function Vrb(a,b){return Mhb(a.e,b)} +function Nvb(a){return uCb(a),false} +function Rub(a){Kub.call(this,a,21)} +function wcb(a,b){Zy.call(this,a,b)} +function mxb(a,b){$r.call(this,a,b)} +function Gyb(a,b){$r.call(this,a,b)} +function zx(a){yx();Wn.call(this,a)} +function zlb(a,b){Dlb(a,a.length,b)} +function Alb(a,b){Flb(a,a.length,b)} +function ABb(a,b,c){b.ud(a.a.Ge(c))} +function uBb(a,b,c){b.we(a.a.Fe(c))} +function GBb(a,b,c){b.td(a.a.Kb(c))} +function Zq(a,b,c){a.Mb(c)&&b.td(c)} +function aCb(a,b,c){a.splice(b,0,c)} +function lDb(a,b){return uqb(a.e,b)} +function pjb(a,b){this.d=a;this.e=b} +function kqb(a,b){this.b=a;this.a=b} +function VBb(a,b){this.b=a;this.a=b} +function BEb(a,b){this.b=a;this.a=b} +function sBb(a,b){this.a=a;this.b=b} +function yBb(a,b){this.a=a;this.b=b} +function EBb(a,b){this.a=a;this.b=b} +function KBb(a,b){this.a=a;this.b=b} +function aDb(a,b){this.a=a;this.b=b} +function tMb(a,b){this.b=a;this.a=b} +function oOb(a,b){this.b=a;this.a=b} +function SOb(a,b){$r.call(this,a,b)} +function SMb(a,b){$r.call(this,a,b)} +function NEb(a,b){$r.call(this,a,b)} +function VEb(a,b){$r.call(this,a,b)} +function sFb(a,b){$r.call(this,a,b)} +function hHb(a,b){$r.call(this,a,b)} +function OHb(a,b){$r.call(this,a,b)} +function FIb(a,b){$r.call(this,a,b)} +function wLb(a,b){$r.call(this,a,b)} +function YRb(a,b){$r.call(this,a,b)} +function zTb(a,b){$r.call(this,a,b)} +function rUb(a,b){$r.call(this,a,b)} +function oWb(a,b){$r.call(this,a,b)} +function SXb(a,b){$r.call(this,a,b)} +function k0b(a,b){$r.call(this,a,b)} +function z5b(a,b){$r.call(this,a,b)} +function T8b(a,b){$r.call(this,a,b)} +function ibc(a,b){$r.call(this,a,b)} +function Cec(a,b){this.a=a;this.b=b} +function rfc(a,b){this.a=a;this.b=b} +function Rfc(a,b){this.a=a;this.b=b} +function Tfc(a,b){this.a=a;this.b=b} +function bgc(a,b){this.a=a;this.b=b} +function ngc(a,b){this.a=a;this.b=b} +function Qhc(a,b){this.a=a;this.b=b} +function $hc(a,b){this.a=a;this.b=b} +function Z0b(a,b){this.a=a;this.b=b} +function ZVb(a,b){this.b=a;this.a=b} +function Dfc(a,b){this.b=a;this.a=b} +function dgc(a,b){this.b=a;this.a=b} +function Bmc(a,b){this.b=a;this.a=b} +function cWb(a,b){this.c=a;this.d=b} +function I$b(a,b){this.e=a;this.d=b} +function Unc(a,b){this.a=a;this.b=b} +function Oic(a,b){this.b=b;this.c=a} +function Bjc(a,b){$r.call(this,a,b)} +function Yjc(a,b){$r.call(this,a,b)} +function Gkc(a,b){$r.call(this,a,b)} +function Bpc(a,b){$r.call(this,a,b)} +function Jpc(a,b){$r.call(this,a,b)} +function Tpc(a,b){$r.call(this,a,b)} +function cqc(a,b){$r.call(this,a,b)} +function oqc(a,b){$r.call(this,a,b)} +function yqc(a,b){$r.call(this,a,b)} +function Hqc(a,b){$r.call(this,a,b)} +function Uqc(a,b){$r.call(this,a,b)} +function arc(a,b){$r.call(this,a,b)} +function mrc(a,b){$r.call(this,a,b)} +function zrc(a,b){$r.call(this,a,b)} +function Prc(a,b){$r.call(this,a,b)} +function Yrc(a,b){$r.call(this,a,b)} +function fsc(a,b){$r.call(this,a,b)} +function nsc(a,b){$r.call(this,a,b)} +function nzc(a,b){$r.call(this,a,b)} +function zzc(a,b){$r.call(this,a,b)} +function Kzc(a,b){$r.call(this,a,b)} +function Xzc(a,b){$r.call(this,a,b)} +function Dtc(a,b){$r.call(this,a,b)} +function lAc(a,b){$r.call(this,a,b)} +function uAc(a,b){$r.call(this,a,b)} +function CAc(a,b){$r.call(this,a,b)} +function LAc(a,b){$r.call(this,a,b)} +function UAc(a,b){$r.call(this,a,b)} +function aBc(a,b){$r.call(this,a,b)} +function uBc(a,b){$r.call(this,a,b)} +function DBc(a,b){$r.call(this,a,b)} +function MBc(a,b){$r.call(this,a,b)} +function sGc(a,b){$r.call(this,a,b)} +function VIc(a,b){$r.call(this,a,b)} +function EIc(a,b){this.b=a;this.a=b} +function qKc(a,b){this.a=a;this.b=b} +function GKc(a,b){this.a=a;this.b=b} +function lLc(a,b){this.a=a;this.b=b} +function mMc(a,b){this.a=a;this.b=b} +function fMc(a,b){$r.call(this,a,b)} +function ZLc(a,b){$r.call(this,a,b)} +function ZMc(a,b){this.b=a;this.d=b} +function IOc(a,b){$r.call(this,a,b)} +function GQc(a,b){$r.call(this,a,b)} +function PQc(a,b){this.a=a;this.b=b} +function RQc(a,b){this.a=a;this.b=b} +function ARc(a,b){$r.call(this,a,b)} +function rSc(a,b){$r.call(this,a,b)} +function TTc(a,b){$r.call(this,a,b)} +function _Tc(a,b){$r.call(this,a,b)} +function RUc(a,b){$r.call(this,a,b)} +function uVc(a,b){$r.call(this,a,b)} +function hWc(a,b){$r.call(this,a,b)} +function rWc(a,b){$r.call(this,a,b)} +function kXc(a,b){$r.call(this,a,b)} +function uXc(a,b){$r.call(this,a,b)} +function AYc(a,b){$r.call(this,a,b)} +function l$c(a,b){$r.call(this,a,b)} +function Z$c(a,b){$r.call(this,a,b)} +function D_c(a,b){$r.call(this,a,b)} +function O_c(a,b){$r.call(this,a,b)} +function c1c(a,b){$r.call(this,a,b)} +function cVb(a,b){return uqb(a.c,b)} +function nnc(a,b){return uqb(b.b,a)} +function x1c(a,b){return -a.b.Je(b)} +function D3c(a,b){return uqb(a.g,b)} +function O5c(a,b){$r.call(this,a,b)} +function a6c(a,b){$r.call(this,a,b)} +function m2c(a,b){this.a=a;this.b=b} +function W2c(a,b){this.a=a;this.b=b} +function f7c(a,b){this.a=a;this.b=b} +function G7c(a,b){$r.call(this,a,b)} +function j8c(a,b){$r.call(this,a,b)} +function iad(a,b){$r.call(this,a,b)} +function rad(a,b){$r.call(this,a,b)} +function Bad(a,b){$r.call(this,a,b)} +function Nad(a,b){$r.call(this,a,b)} +function ibd(a,b){$r.call(this,a,b)} +function tbd(a,b){$r.call(this,a,b)} +function Ibd(a,b){$r.call(this,a,b)} +function Ubd(a,b){$r.call(this,a,b)} +function gcd(a,b){$r.call(this,a,b)} +function scd(a,b){$r.call(this,a,b)} +function Ycd(a,b){$r.call(this,a,b)} +function udd(a,b){$r.call(this,a,b)} +function Jdd(a,b){$r.call(this,a,b)} +function Eed(a,b){$r.call(this,a,b)} +function bfd(a,b){this.a=a;this.b=b} +function dfd(a,b){this.a=a;this.b=b} +function ffd(a,b){this.a=a;this.b=b} +function Kfd(a,b){this.a=a;this.b=b} +function Mfd(a,b){this.a=a;this.b=b} +function Ofd(a,b){this.a=a;this.b=b} +function vgd(a,b){this.a=a;this.b=b} +function qgd(a,b){$r.call(this,a,b)} +function jrd(a,b){this.a=a;this.b=b} +function krd(a,b){this.a=a;this.b=b} +function mrd(a,b){this.a=a;this.b=b} +function nrd(a,b){this.a=a;this.b=b} +function qrd(a,b){this.a=a;this.b=b} +function rrd(a,b){this.a=a;this.b=b} +function srd(a,b){this.b=a;this.a=b} +function trd(a,b){this.b=a;this.a=b} +function Drd(a,b){this.b=a;this.a=b} +function Frd(a,b){this.b=a;this.a=b} +function Hrd(a,b){this.a=a;this.b=b} +function Jrd(a,b){this.a=a;this.b=b} +function Ord(a,b){Xqd(a.a,BD(b,56))} +function BIc(a,b){gIc(a.a,BD(b,11))} +function fIc(a,b){FHc();return b!=a} +function Arb(){wrb();return new vrb} +function CMc(){wMc();this.b=new Tqb} +function NNc(){FNc();this.a=new Tqb} +function eCc(){ZBc();aCc.call(this)} +function Dsd(a,b){$r.call(this,a,b)} +function Urd(a,b){this.a=a;this.b=b} +function Wrd(a,b){this.a=a;this.b=b} +function kGd(a,b){this.a=a;this.b=b} +function nGd(a,b){this.a=a;this.b=b} +function bUd(a,b){this.a=a;this.b=b} +function zVd(a,b){this.a=a;this.b=b} +function C1d(a,b){this.d=a;this.b=b} +function MLd(a,b){this.d=a;this.e=b} +function Wud(a,b){this.f=a;this.c=b} +function f7d(a,b){this.b=a;this.c=b} +function _zd(a,b){this.i=a;this.g=b} +function Y1d(a,b){this.e=a;this.a=b} +function c8d(a,b){this.a=a;this.b=b} +function $Id(a,b){a.i=null;_Id(a,b)} +function ivd(a,b){!!a&&Rhb(cvd,a,b)} +function hCd(a,b){return qAd(a.a,b)} +function e7d(a){return R2d(a.c,a.b)} +function Wd(a){return !a?null:a.dd()} +function PD(a){return a==null?null:a} +function KD(a){return typeof a===Khe} +function LD(a){return typeof a===Lhe} +function ND(a){return typeof a===Mhe} +function Em(a,b){return a.Hd().Xb(b)} +function Kq(a,b){return hr(a.Kc(),b)} +function Bbb(a,b){return ybb(a,b)==0} +function Ebb(a,b){return ybb(a,b)>=0} +function Kbb(a,b){return ybb(a,b)!=0} +function Jdb(a){return ''+(uCb(a),a)} +function pfb(a,b){return a.substr(b)} +function cg(a){ag(a);return a.d.gc()} +function oVb(a){pVb(a,a.c);return a} +function RD(a){CCb(a==null);return a} +function Dfb(a,b){a.a+=''+b;return a} +function Efb(a,b){a.a+=''+b;return a} +function Nfb(a,b){a.a+=''+b;return a} +function Pfb(a,b){a.a+=''+b;return a} +function Qfb(a,b){a.a+=''+b;return a} +function Mfb(a,b){return a.a+=''+b,a} +function Esb(a,b){Gsb(a,b,a.a,a.a.a)} +function Fsb(a,b){Gsb(a,b,a.c.b,a.c)} +function Mqd(a,b,c){Rpd(b,kqd(a,c))} +function Nqd(a,b,c){Rpd(b,kqd(a,c))} +function Dhe(a,b){Hhe(new Fyd(a),b)} +function cB(a,b){a.q.setTime(Sbb(b))} +function fvb(a,b){bvb.call(this,a,b)} +function jvb(a,b){bvb.call(this,a,b)} +function nvb(a,b){bvb.call(this,a,b)} +function Nqb(a){Uhb(this);Ld(this,a)} +function wmb(a){tCb(a,0);return null} +function X6c(a){a.a=0;a.b=0;return a} +function f3c(a,b){a.a=b.g+1;return a} +function PJc(a,b){return a.j[b.p]==2} +function _Pb(a){return VPb(BD(a,79))} +function yJb(){yJb=ccb;xJb=as(wJb())} +function Y8b(){Y8b=ccb;X8b=as(W8b())} +function mt(){this.b=new Mqb(Cv(12))} +function Otb(){this.b=0;this.a=false} +function Wtb(){this.b=0;this.a=false} +function sl(a){this.a=a;ol.call(this)} +function vl(a){this.a=a;ol.call(this)} +function Nsd(a,b){Msd.call(this,a,b)} +function $zd(a,b){Cyd.call(this,a,b)} +function nNd(a,b){_zd.call(this,a,b)} +function s4d(a,b){p4d.call(this,a,b)} +function w4d(a,b){qRd.call(this,a,b)} +function rEd(a,b){pEd();Rhb(oEd,a,b)} +function lcb(a,b){return qfb(a.a,0,b)} +function ww(a,b){return a.a.a.a.cc(b)} +function mb(a,b){return PD(a)===PD(b)} +function Mdb(a,b){return Kdb(a.a,b.a)} +function $db(a,b){return beb(a.a,b.a)} +function seb(a,b){return ueb(a.a,b.a)} +function hfb(a,b){return a.indexOf(b)} +function Ny(a,b){return a==b?0:a?1:-1} +function kB(a){return a<10?'0'+a:''+a} +function Mq(a){return Qb(a),new sl(a)} +function SC(a){return TC(a.l,a.m,a.h)} +function Hdb(a){return QD((uCb(a),a))} +function Idb(a){return QD((uCb(a),a))} +function NIb(a,b){return beb(a.g,b.g)} +function Fbb(a){return typeof a===Lhe} +function mWb(a){return a==hWb||a==kWb} +function nWb(a){return a==hWb||a==iWb} +function G1b(a){return Jkb(a.b.b,a,0)} +function lrb(a){this.a=Arb();this.b=a} +function Frb(a){this.a=Arb();this.b=a} +function swb(a,b){Ekb(a.a,b);return b} +function Z1c(a,b){Ekb(a.c,b);return a} +function E2c(a,b){d3c(a.a,b);return a} +function _gc(a,b){Hgc();return b.a+=a} +function bhc(a,b){Hgc();return b.a+=a} +function ahc(a,b){Hgc();return b.c+=a} +function Nlb(a,b){Klb(a,0,a.length,b)} +function zsb(){Wqb.call(this,new $rb)} +function I_b(){B_b.call(this,0,0,0,0)} +function I6c(){J6c.call(this,0,0,0,0)} +function g7c(a){this.a=a.a;this.b=a.b} +function fad(a){return a==aad||a==bad} +function gad(a){return a==dad||a==_9c} +function Jzc(a){return a==Fzc||a==Ezc} +function fcd(a){return a!=bcd&&a!=ccd} +function oid(a){return a.Lg()&&a.Mg()} +function Gfd(a){return Kkd(BD(a,118))} +function k3c(a){return d3c(new j3c,a)} +function y2d(a,b){return new p4d(b,a)} +function z2d(a,b){return new p4d(b,a)} +function ukd(a,b,c){vkd(a,b);wkd(a,c)} +function _kd(a,b,c){cld(a,b);ald(a,c)} +function bld(a,b,c){dld(a,b);eld(a,c)} +function gmd(a,b,c){hmd(a,b);imd(a,c)} +function nmd(a,b,c){omd(a,b);pmd(a,c)} +function iKd(a,b){$Jd(a,b);_Jd(a,a.D)} +function _ud(a){Wud.call(this,a,true)} +function Xg(a,b,c){Vg.call(this,a,b,c)} +function Ygb(a){Hgb();Zgb.call(this,a)} +function rxb(){mxb.call(this,'Head',1)} +function wxb(){mxb.call(this,'Tail',3)} +function Ckb(a){a.c=KC(SI,Uhe,1,0,5,1)} +function Vjb(a){a.a=KC(SI,Uhe,1,8,5,1)} +function MGb(a){Hkb(a.xf(),new QGb(a))} +function xtb(a){return a!=null?tb(a):0} +function b2b(a,b){return ntd(b,mpd(a))} +function c2b(a,b){return ntd(b,mpd(a))} +function dAb(a,b){return a[a.length]=b} +function gAb(a,b){return a[a.length]=b} +function Vq(a){return lr(a.b.Kc(),a.a)} +function dqd(a,b){return _o(qo(a.d),b)} +function eqd(a,b){return _o(qo(a.g),b)} +function fqd(a,b){return _o(qo(a.j),b)} +function Osd(a,b){Msd.call(this,a.b,b)} +function q0b(a){B_b.call(this,a,a,a,a)} +function HOb(a){a.b&&LOb(a);return a.a} +function IOb(a){a.b&&LOb(a);return a.c} +function uyb(a,b){if(lyb){return}a.b=b} +function lzd(a,b,c){NC(a,b,c);return c} +function mBc(a,b,c){NC(a.c[b.g],b.g,c)} +function _Hd(a,b,c){BD(a.c,69).Xh(b,c)} +function wfd(a,b,c){bld(c,c.i+a,c.j+b)} +function UOd(a,b){wtd(VKd(a.a),XOd(b))} +function bTd(a,b){wtd(QSd(a.a),eTd(b))} +function Lge(a){wfe();xfe.call(this,a)} +function CAd(a){return a==null?0:tb(a)} +function fNc(){fNc=ccb;eNc=new Rpb(v1)} +function h0d(){h0d=ccb;new i0d;new Rkb} +function i0d(){new Lqb;new Lqb;new Lqb} +function GA(){GA=ccb;fA();FA=new Lqb} +function Iy(){Iy=ccb;$wnd.Math.log(2)} +function UVd(){UVd=ccb;TVd=(AFd(),zFd)} +function _ge(){throw vbb(new cgb(Cxe))} +function ohe(){throw vbb(new cgb(Cxe))} +function che(){throw vbb(new cgb(Dxe))} +function rhe(){throw vbb(new cgb(Dxe))} +function Mg(a){this.a=a;Gg.call(this,a)} +function up(a){this.a=a;rf.call(this,a)} +function Bp(a){this.a=a;rf.call(this,a)} +function Okb(a,b){Mlb(a.c,a.c.length,b)} +function llb(a){return a.ab?1:0} +function Deb(a,b){return ybb(a,b)>0?a:b} +function TC(a,b,c){return {l:a,m:b,h:c}} +function Ctb(a,b){a.a!=null&&BIc(b,a.a)} +function Csb(a){a.a=new jtb;a.c=new jtb} +function hDb(a){this.b=a;this.a=new Rkb} +function dOb(a){this.b=new pOb;this.a=a} +function q_b(a){n_b.call(this);this.a=a} +function txb(){mxb.call(this,'Range',2)} +function bUb(){ZTb();this.a=new L2c(zP)} +function Bh(a,b){Qb(b);Ah(a).Jc(new Vw)} +function fKc(a,b){FJc();return b.n.b+=a} +function Tgc(a,b,c){return Rhb(a.g,c,b)} +function LJc(a,b,c){return Rhb(a.k,c,b)} +function r1c(a,b){return Rhb(a.a,b.a,b)} +function jBc(a,b,c){return hBc(b,c,a.c)} +function E6c(a){return new f7c(a.c,a.d)} +function F6c(a){return new f7c(a.c,a.d)} +function R6c(a){return new f7c(a.a,a.b)} +function CQd(a,b){return hA(a.a,b,null)} +function fec(a){QZb(a,null);RZb(a,null)} +function AOc(a){BOc(a,null);COc(a,null)} +function u4d(){qRd.call(this,null,null)} +function y4d(){RRd.call(this,null,null)} +function a7d(a){this.a=a;Lqb.call(this)} +function Pp(a){this.b=(mmb(),new iob(a))} +function Py(a){a.j=KC(VI,nie,310,0,0,1)} +function oAd(a,b,c){a.c.Vc(b,BD(c,133))} +function GAd(a,b,c){a.c.ji(b,BD(c,133))} +function JLd(a,b){Uxd(a);a.Gc(BD(b,15))} +function b7d(a,b){return t2d(a.c,a.b,b)} +function Bv(a,b){return new Qv(a.Kc(),b)} +function Lq(a,b){return rr(a.Kc(),b)!=-1} +function Sqb(a,b){return a.a.Bc(b)!=null} +function pr(a){return a.Ob()?a.Pb():null} +function yfb(a){return zfb(a,0,a.length)} +function JD(a,b){return a!=null&&AD(a,b)} +function $A(a,b){a.q.setHours(b);YA(a,b)} +function Yrb(a,b){if(a.c){jsb(b);isb(b)}} +function nk(a,b,c){BD(a.Kb(c),164).Nb(b)} +function RJc(a,b,c){SJc(a,b,c);return c} +function Eub(a,b,c){a.a=b^1502;a.b=c^kke} +function xHb(a,b,c){return a.a[b.g][c.g]} +function REc(a,b){return a.a[b.c.p][b.p]} +function aEc(a,b){return a.e[b.c.p][b.p]} +function tEc(a,b){return a.c[b.c.p][b.p]} +function OJc(a,b){return a.j[b.p]=aKc(b)} +function k5c(a,b){return cfb(a.f,b.tg())} +function Isd(a,b){return cfb(a.b,b.tg())} +function Sfd(a,b){return a.a0?b*b/a:b*b*100} +function CRb(a,b){return a>0?b/(a*a):b*100} +function G2c(a,b,c){return Ekb(b,I2c(a,c))} +function t3c(a,b,c){p3c();a.Xe(b)&&c.td(a)} +function St(a,b,c){var d;d=a.Zc(b);d.Rb(c)} +function O6c(a,b,c){a.a+=b;a.b+=c;return a} +function Z6c(a,b,c){a.a*=b;a.b*=c;return a} +function b7c(a,b,c){a.a-=b;a.b-=c;return a} +function a7c(a,b){a.a=b.a;a.b=b.b;return a} +function V6c(a){a.a=-a.a;a.b=-a.b;return a} +function Dic(a){this.c=a;this.a=1;this.b=1} +function xed(a){this.c=a;dld(a,0);eld(a,0)} +function u7c(a){Psb.call(this);n7c(this,a)} +function AXb(a){xXb();yXb(this);this.mf(a)} +function GRd(a,b){nRd();qRd.call(this,a,b)} +function dSd(a,b){LRd();RRd.call(this,a,b)} +function hSd(a,b){LRd();RRd.call(this,a,b)} +function fSd(a,b){LRd();dSd.call(this,a,b)} +function sId(a,b,c){dId.call(this,a,b,c,2)} +function zXd(a,b){UVd();nXd.call(this,a,b)} +function BXd(a,b){UVd();zXd.call(this,a,b)} +function DXd(a,b){UVd();zXd.call(this,a,b)} +function FXd(a,b){UVd();DXd.call(this,a,b)} +function PXd(a,b){UVd();nXd.call(this,a,b)} +function RXd(a,b){UVd();PXd.call(this,a,b)} +function XXd(a,b){UVd();nXd.call(this,a,b)} +function pAd(a,b){return a.c.Fc(BD(b,133))} +function w1d(a,b,c){return V1d(p1d(a,b),c)} +function N2d(a,b,c){return b.Qk(a.e,a.c,c)} +function P2d(a,b,c){return b.Rk(a.e,a.c,c)} +function a3d(a,b){return xid(a.e,BD(b,49))} +function aTd(a,b,c){vtd(QSd(a.a),b,eTd(c))} +function TOd(a,b,c){vtd(VKd(a.a),b,XOd(c))} +function ypb(a,b){b.$modCount=a.$modCount} +function MUc(){MUc=ccb;LUc=new Lsd('root')} +function LCd(){LCd=ccb;KCd=new lDd;new NDd} +function KVc(){this.a=new Hp;this.b=new Hp} +function FUd(){hJd.call(this);this.Bb|=Tje} +function t_c(){$r.call(this,'GROW_TREE',0)} +function C9d(a){return a==null?null:cde(a)} +function G9d(a){return a==null?null:jde(a)} +function J9d(a){return a==null?null:fcb(a)} +function K9d(a){return a==null?null:fcb(a)} +function fdb(a){if(a.o!=null){return}vdb(a)} +function DD(a){CCb(a==null||KD(a));return a} +function ED(a){CCb(a==null||LD(a));return a} +function GD(a){CCb(a==null||ND(a));return a} +function gB(a){this.q=new $wnd.Date(Sbb(a))} +function Mf(a,b){this.c=a;ne.call(this,a,b)} +function Sf(a,b){this.a=a;Mf.call(this,a,b)} +function Hg(a,b){this.d=a;Dg(this);this.b=b} +function bAb(a,b){Vzb.call(this,a);this.a=b} +function vAb(a,b){Vzb.call(this,a);this.a=b} +function sNb(a){pNb.call(this,0,0);this.f=a} +function Vg(a,b,c){dg.call(this,a,b,c,null)} +function Yg(a,b,c){dg.call(this,a,b,c,null)} +function Pxb(a,b,c){return a.ue(b,c)<=0?c:b} +function Qxb(a,b,c){return a.ue(b,c)<=0?b:c} +function g4c(a,b){return BD(Wrb(a.b,b),149)} +function i4c(a,b){return BD(Wrb(a.c,b),229)} +function wic(a){return BD(Ikb(a.a,a.b),287)} +function B6c(a){return new f7c(a.c,a.d+a.a)} +function eLc(a){return FJc(),Jzc(BD(a,197))} +function $Jb(){$Jb=ccb;ZJb=pqb((tdd(),sdd))} +function fOb(a,b){b.a?gOb(a,b):Fxb(a.a,b.b)} +function qyb(a,b){if(lyb){return}Ekb(a.a,b)} +function F2b(a,b){x2b();return f_b(b.d.i,a)} +function _9b(a,b){I9b();return new gac(b,a)} +function _Hb(a,b){ytb(b,lle);a.f=b;return a} +function Kld(a,b,c){c=_hd(a,b,3,c);return c} +function bmd(a,b,c){c=_hd(a,b,6,c);return c} +function kpd(a,b,c){c=_hd(a,b,9,c);return c} +function Cvd(a,b,c){++a.j;a.Ki();Atd(a,b,c)} +function Avd(a,b,c){++a.j;a.Hi(b,a.oi(b,c))} +function bRd(a,b,c){var d;d=a.Zc(b);d.Rb(c)} +function c7d(a,b,c){return C2d(a.c,a.b,b,c)} +function DAd(a,b){return (b&Ohe)%a.d.length} +function Msd(a,b){Lsd.call(this,a);this.a=b} +function uVd(a,b){lVd.call(this,a);this.a=b} +function sYd(a,b){lVd.call(this,a);this.a=b} +function zyd(a,b){this.c=a;zud.call(this,b)} +function YOd(a,b){this.a=a;qOd.call(this,b)} +function fTd(a,b){this.a=a;qOd.call(this,b)} +function Xp(a){this.a=(Xj(a,Jie),new Skb(a))} +function cq(a){this.a=(Xj(a,Jie),new Skb(a))} +function LA(a){!a.a&&(a.a=new VA);return a.a} +function XMb(a){if(a>8){return 0}return a+1} +function Ecb(a,b){Bcb();return a==b?0:a?1:-1} +function Opb(a,b,c){return Npb(a,BD(b,22),c)} +function Bz(a,b,c){return a.apply(b,c);var d} +function Sfb(a,b,c){a.a+=zfb(b,0,c);return a} +function ijb(a,b){var c;c=a.e;a.e=b;return c} +function trb(a,b){var c;c=a[hke];c.call(a,b)} +function urb(a,b){var c;c=a[hke];c.call(a,b)} +function Aib(a,b){a.a.Vc(a.b,b);++a.b;a.c=-1} +function Urb(a){Uhb(a.e);a.d.b=a.d;a.d.a=a.d} +function _f(a){a.b?_f(a.b):a.f.c.zc(a.e,a.d)} +function _Ab(a,b,c){EAb();MBb(a,b.Ce(a.a,c))} +function Bxb(a,b){return Vd(Cwb(a.a,b,true))} +function Cxb(a,b){return Vd(Dwb(a.a,b,true))} +function _Bb(a,b){return eCb(new Array(b),a)} +function HD(a){return String.fromCharCode(a)} +function mz(a){return a==null?null:a.message} +function gRb(){this.a=new Rkb;this.b=new Rkb} +function iTb(){this.a=new MQb;this.b=new tTb} +function tDb(){this.b=new d7c;this.c=new Rkb} +function _Qb(){this.d=new d7c;this.e=new d7c} +function n_b(){this.n=new d7c;this.o=new d7c} +function $Gb(){this.n=new p0b;this.i=new I6c} +function sec(){this.a=new Umc;this.b=new mnc} +function NIc(){this.a=new Rkb;this.d=new Rkb} +function LDc(){this.b=new Tqb;this.a=new Tqb} +function hSc(){this.b=new Lqb;this.a=new Lqb} +function HRc(){this.b=new tRc;this.a=new hRc} +function aHb(){$Gb.call(this);this.a=new d7c} +function Ywb(a){Zwb.call(this,a,(lxb(),hxb))} +function J_b(a,b,c,d){B_b.call(this,a,b,c,d)} +function sqd(a,b,c){c!=null&&kmd(b,Wqd(a,c))} +function tqd(a,b,c){c!=null&&lmd(b,Wqd(a,c))} +function Tod(a,b,c){c=_hd(a,b,11,c);return c} +function P6c(a,b){a.a+=b.a;a.b+=b.b;return a} +function c7c(a,b){a.a-=b.a;a.b-=b.b;return a} +function u7b(a,b){return a.n.a=(uCb(b),b)+10} +function v7b(a,b){return a.n.a=(uCb(b),b)+10} +function dLd(a,b){return b==a||pud(UKd(b),a)} +function PYd(a,b){return Rhb(a.a,b,'')==null} +function E2b(a,b){x2b();return !f_b(b.d.i,a)} +function rjc(a,b){fad(a.f)?sjc(a,b):tjc(a,b)} +function h1d(a,b){var c;c=b.Hh(a.a);return c} +function Cyd(a,b){qcb.call(this,gve+a+mue+b)} +function gUd(a,b,c,d){cUd.call(this,a,b,c,d)} +function Q4d(a,b,c,d){cUd.call(this,a,b,c,d)} +function U4d(a,b,c,d){Q4d.call(this,a,b,c,d)} +function n5d(a,b,c,d){i5d.call(this,a,b,c,d)} +function p5d(a,b,c,d){i5d.call(this,a,b,c,d)} +function v5d(a,b,c,d){i5d.call(this,a,b,c,d)} +function t5d(a,b,c,d){p5d.call(this,a,b,c,d)} +function A5d(a,b,c,d){p5d.call(this,a,b,c,d)} +function y5d(a,b,c,d){v5d.call(this,a,b,c,d)} +function D5d(a,b,c,d){A5d.call(this,a,b,c,d)} +function d6d(a,b,c,d){Y5d.call(this,a,b,c,d)} +function Vp(a,b,c){this.a=a;qc.call(this,b,c)} +function tk(a,b,c){this.c=b;this.b=c;this.a=a} +function ik(a,b,c){return a.d=BD(b.Kb(c),164)} +function j6d(a,b){return a.Aj().Nh().Kh(a,b)} +function h6d(a,b){return a.Aj().Nh().Ih(a,b)} +function Fdb(a,b){return uCb(a),PD(a)===PD(b)} +function dfb(a,b){return uCb(a),PD(a)===PD(b)} +function Dxb(a,b){return Vd(Cwb(a.a,b,false))} +function Exb(a,b){return Vd(Dwb(a.a,b,false))} +function vBb(a,b){return a.b.sd(new yBb(a,b))} +function BBb(a,b){return a.b.sd(new EBb(a,b))} +function HBb(a,b){return a.b.sd(new KBb(a,b))} +function lfb(a,b,c){return a.lastIndexOf(b,c)} +function uTb(a,b,c){return Kdb(a[b.b],a[c.b])} +function RTb(a,b){return yNb(b,(Nyc(),Cwc),a)} +function fmc(a,b){return beb(b.a.d.p,a.a.d.p)} +function emc(a,b){return beb(a.a.d.p,b.a.d.p)} +function _Oc(a,b){return Kdb(a.c-a.s,b.c-b.s)} +function S_b(a){return !a.c?-1:Jkb(a.c.a,a,0)} +function Vxd(a){return a<100?null:new Ixd(a)} +function ecd(a){return a==Zbd||a==_bd||a==$bd} +function zAd(a,b){return JD(b,15)&&Btd(a.c,b)} +function vyb(a,b){if(lyb){return}!!b&&(a.d=b)} +function ujb(a,b){var c;c=b;return !!Awb(a,c)} +function czd(a,b){this.c=a;Pyd.call(this,a,b)} +function fBb(a){this.c=a;nvb.call(this,rie,0)} +function Avb(a,b){Bvb.call(this,a,a.length,b)} +function aId(a,b,c){return BD(a.c,69).lk(b,c)} +function bId(a,b,c){return BD(a.c,69).mk(b,c)} +function O2d(a,b,c){return N2d(a,BD(b,332),c)} +function Q2d(a,b,c){return P2d(a,BD(b,332),c)} +function i3d(a,b,c){return h3d(a,BD(b,332),c)} +function k3d(a,b,c){return j3d(a,BD(b,332),c)} +function tn(a,b){return b==null?null:Hv(a.b,b)} +function Kcb(a){return LD(a)?(uCb(a),a):a.ke()} +function Ldb(a){return !isNaN(a)&&!isFinite(a)} +function Wn(a){Ql();this.a=(mmb(),new zob(a))} +function dIc(a){FHc();this.d=a;this.a=new jkb} +function xqb(a,b,c){this.a=a;this.b=b;this.c=c} +function Nrb(a,b,c){this.a=a;this.b=b;this.c=c} +function $sb(a,b,c){this.d=a;this.b=c;this.a=b} +function Qsb(a){Csb(this);Osb(this);ye(this,a)} +function Tkb(a){Ckb(this);bCb(this.c,0,a.Pc())} +function Xwb(a){uib(a.a);Kwb(a.c,a.b);a.b=null} +function iyb(a){this.a=a;Zfb();Cbb(Date.now())} +function JCb(){JCb=ccb;GCb=new nb;ICb=new nb} +function ntb(){ntb=ccb;ltb=new otb;mtb=new qtb} +function kzd(){kzd=ccb;jzd=KC(SI,Uhe,1,0,5,1)} +function tGd(){tGd=ccb;sGd=KC(SI,Uhe,1,0,5,1)} +function $Gd(){$Gd=ccb;ZGd=KC(SI,Uhe,1,0,5,1)} +function Ql(){Ql=ccb;new Zl((mmb(),mmb(),jmb))} +function pxb(a){lxb();return es((zxb(),yxb),a)} +function Hyb(a){Fyb();return es((Kyb(),Jyb),a)} +function OEb(a){MEb();return es((REb(),QEb),a)} +function WEb(a){UEb();return es((ZEb(),YEb),a)} +function tFb(a){rFb();return es((wFb(),vFb),a)} +function iHb(a){gHb();return es((lHb(),kHb),a)} +function PHb(a){NHb();return es((SHb(),RHb),a)} +function GIb(a){EIb();return es((JIb(),IIb),a)} +function vJb(a){qJb();return es((yJb(),xJb),a)} +function xLb(a){vLb();return es((ALb(),zLb),a)} +function TMb(a){RMb();return es((WMb(),VMb),a)} +function TOb(a){ROb();return es((WOb(),VOb),a)} +function ePb(a){cPb();return es((hPb(),gPb),a)} +function ZRb(a){XRb();return es((aSb(),_Rb),a)} +function ATb(a){yTb();return es((DTb(),CTb),a)} +function sUb(a){qUb();return es((vUb(),uUb),a)} +function rWb(a){lWb();return es((uWb(),tWb),a)} +function TXb(a){RXb();return es((WXb(),VXb),a)} +function Mb(a,b){if(!a){throw vbb(new Wdb(b))}} +function l0b(a){j0b();return es((o0b(),n0b),a)} +function r0b(a){B_b.call(this,a.d,a.c,a.a,a.b)} +function K_b(a){B_b.call(this,a.d,a.c,a.a,a.b)} +function mKb(a,b,c){this.b=a;this.c=b;this.a=c} +function BZb(a,b,c){this.b=a;this.a=b;this.c=c} +function TNb(a,b,c){this.a=a;this.b=b;this.c=c} +function uOb(a,b,c){this.a=a;this.b=b;this.c=c} +function S3b(a,b,c){this.a=a;this.b=b;this.c=c} +function Z6b(a,b,c){this.a=a;this.b=b;this.c=c} +function n9b(a,b,c){this.b=a;this.a=b;this.c=c} +function x$b(a,b,c){this.e=b;this.b=a;this.d=c} +function $Ab(a,b,c){EAb();a.a.Od(b,c);return b} +function LGb(a){var b;b=new KGb;b.e=a;return b} +function iLb(a){var b;b=new fLb;b.b=a;return b} +function D6b(){D6b=ccb;B6b=new M6b;C6b=new P6b} +function Hgc(){Hgc=ccb;Fgc=new ghc;Ggc=new ihc} +function jbc(a){gbc();return es((mbc(),lbc),a)} +function Cjc(a){Ajc();return es((Fjc(),Ejc),a)} +function Clc(a){Alc();return es((Flc(),Elc),a)} +function Cpc(a){Apc();return es((Fpc(),Epc),a)} +function Kpc(a){Ipc();return es((Npc(),Mpc),a)} +function Wpc(a){Rpc();return es((Zpc(),Ypc),a)} +function $jc(a){Xjc();return es((bkc(),akc),a)} +function Hkc(a){Fkc();return es((Kkc(),Jkc),a)} +function dqc(a){bqc();return es((gqc(),fqc),a)} +function rqc(a){mqc();return es((uqc(),tqc),a)} +function zqc(a){xqc();return es((Cqc(),Bqc),a)} +function Iqc(a){Gqc();return es((Lqc(),Kqc),a)} +function Vqc(a){Sqc();return es((Yqc(),Xqc),a)} +function brc(a){_qc();return es((erc(),drc),a)} +function nrc(a){lrc();return es((qrc(),prc),a)} +function Arc(a){yrc();return es((Drc(),Crc),a)} +function Qrc(a){Orc();return es((Trc(),Src),a)} +function Zrc(a){Xrc();return es((asc(),_rc),a)} +function gsc(a){esc();return es((jsc(),isc),a)} +function osc(a){msc();return es((rsc(),qsc),a)} +function Etc(a){Ctc();return es((Htc(),Gtc),a)} +function qzc(a){lzc();return es((tzc(),szc),a)} +function Azc(a){xzc();return es((Dzc(),Czc),a)} +function Mzc(a){Izc();return es((Pzc(),Ozc),a)} +function MAc(a){KAc();return es((PAc(),OAc),a)} +function mAc(a){kAc();return es((pAc(),oAc),a)} +function vAc(a){tAc();return es((yAc(),xAc),a)} +function DAc(a){BAc();return es((GAc(),FAc),a)} +function VAc(a){TAc();return es((YAc(),XAc),a)} +function $zc(a){Vzc();return es((bAc(),aAc),a)} +function bBc(a){_Ac();return es((eBc(),dBc),a)} +function vBc(a){tBc();return es((yBc(),xBc),a)} +function EBc(a){CBc();return es((HBc(),GBc),a)} +function NBc(a){LBc();return es((QBc(),PBc),a)} +function tGc(a){rGc();return es((wGc(),vGc),a)} +function WIc(a){UIc();return es((ZIc(),YIc),a)} +function $Lc(a){YLc();return es((bMc(),aMc),a)} +function gMc(a){eMc();return es((jMc(),iMc),a)} +function JOc(a){HOc();return es((MOc(),LOc),a)} +function HQc(a){FQc();return es((KQc(),JQc),a)} +function DRc(a){yRc();return es((GRc(),FRc),a)} +function tSc(a){qSc();return es((wSc(),vSc),a)} +function UTc(a){STc();return es((XTc(),WTc),a)} +function UUc(a){PUc();return es((XUc(),WUc),a)} +function aUc(a){$Tc();return es((dUc(),cUc),a)} +function wVc(a){tVc();return es((zVc(),yVc),a)} +function iWc(a){fWc();return es((lWc(),kWc),a)} +function sWc(a){pWc();return es((vWc(),uWc),a)} +function lXc(a){iXc();return es((oXc(),nXc),a)} +function vXc(a){sXc();return es((yXc(),xXc),a)} +function BYc(a){zYc();return es((EYc(),DYc),a)} +function m$c(a){k$c();return es((p$c(),o$c),a)} +function $$c(a){Y$c();return es((b_c(),a_c),a)} +function n_c(a){i_c();return es((q_c(),p_c),a)} +function w_c(a){s_c();return es((z_c(),y_c),a)} +function E_c(a){C_c();return es((H_c(),G_c),a)} +function P_c(a){N_c();return es((S_c(),R_c),a)} +function W0c(a){R0c();return es((Z0c(),Y0c),a)} +function f1c(a){a1c();return es((i1c(),h1c),a)} +function P5c(a){N5c();return es((S5c(),R5c),a)} +function b6c(a){_5c();return es((e6c(),d6c),a)} +function H7c(a){F7c();return es((K7c(),J7c),a)} +function k8c(a){i8c();return es((n8c(),m8c),a)} +function V8b(a){S8b();return es((Y8b(),X8b),a)} +function A5b(a){y5b();return es((D5b(),C5b),a)} +function jad(a){ead();return es((mad(),lad),a)} +function sad(a){qad();return es((vad(),uad),a)} +function Cad(a){Aad();return es((Fad(),Ead),a)} +function Oad(a){Mad();return es((Rad(),Qad),a)} +function jbd(a){hbd();return es((mbd(),lbd),a)} +function ubd(a){rbd();return es((xbd(),wbd),a)} +function Kbd(a){Hbd();return es((Nbd(),Mbd),a)} +function Vbd(a){Tbd();return es((Ybd(),Xbd),a)} +function hcd(a){dcd();return es((kcd(),jcd),a)} +function vcd(a){rcd();return es((ycd(),xcd),a)} +function vdd(a){tdd();return es((ydd(),xdd),a)} +function Kdd(a){Idd();return es((Ndd(),Mdd),a)} +function $cd(a){Ucd();return es((cdd(),bdd),a)} +function Fed(a){Ded();return es((Ied(),Hed),a)} +function rgd(a){pgd();return es((ugd(),tgd),a)} +function Esd(a){Csd();return es((Hsd(),Gsd),a)} +function Yoc(a,b){return (uCb(a),a)+(uCb(b),b)} +function NNd(a,b){Zfb();return wtd(ZKd(a.a),b)} +function SNd(a,b){Zfb();return wtd(ZKd(a.a),b)} +function bPc(a,b){this.c=a;this.a=b;this.b=b-a} +function nYc(a,b,c){this.a=a;this.b=b;this.c=c} +function L1c(a,b,c){this.a=a;this.b=b;this.c=c} +function T1c(a,b,c){this.a=a;this.b=b;this.c=c} +function Rrd(a,b,c){this.a=a;this.b=b;this.c=c} +function zCd(a,b,c){this.a=a;this.b=b;this.c=c} +function IVd(a,b,c){this.e=a;this.a=b;this.c=c} +function kWd(a,b,c){UVd();cWd.call(this,a,b,c)} +function HXd(a,b,c){UVd();oXd.call(this,a,b,c)} +function TXd(a,b,c){UVd();oXd.call(this,a,b,c)} +function ZXd(a,b,c){UVd();oXd.call(this,a,b,c)} +function JXd(a,b,c){UVd();HXd.call(this,a,b,c)} +function LXd(a,b,c){UVd();HXd.call(this,a,b,c)} +function NXd(a,b,c){UVd();LXd.call(this,a,b,c)} +function VXd(a,b,c){UVd();TXd.call(this,a,b,c)} +function _Xd(a,b,c){UVd();ZXd.call(this,a,b,c)} +function $j(a,b){Qb(a);Qb(b);return new _j(a,b)} +function Nq(a,b){Qb(a);Qb(b);return new Wq(a,b)} +function Rq(a,b){Qb(a);Qb(b);return new ar(a,b)} +function lr(a,b){Qb(a);Qb(b);return new zr(a,b)} +function BD(a,b){CCb(a==null||AD(a,b));return a} +function Nu(a){var b;b=new Rkb;fr(b,a);return b} +function Ex(a){var b;b=new Tqb;fr(b,a);return b} +function Hx(a){var b;b=new Gxb;Jq(b,a);return b} +function Ru(a){var b;b=new Psb;Jq(b,a);return b} +function YEc(a){!a.e&&(a.e=new Rkb);return a.e} +function SMd(a){!a.c&&(a.c=new xYd);return a.c} +function Ekb(a,b){a.c[a.c.length]=b;return true} +function WA(a,b){this.c=a;this.b=b;this.a=false} +function Gg(a){this.d=a;Dg(this);this.b=ed(a.d)} +function pzb(){this.a=';,;';this.b='';this.c=''} +function Bvb(a,b,c){qvb.call(this,b,c);this.a=a} +function fAb(a,b,c){this.b=a;fvb.call(this,b,c)} +function lsb(a,b,c){this.c=a;pjb.call(this,b,c)} +function bCb(a,b,c){$Bb(c,0,a,b,c.length,false)} +function HVb(a,b,c,d,e){a.b=b;a.c=c;a.d=d;a.a=e} +function eBb(a,b){if(b){a.b=b;a.a=(Tzb(b),b.a)}} +function v_b(a,b,c,d,e){a.d=b;a.c=c;a.a=d;a.b=e} +function h5b(a){var b,c;b=a.b;c=a.c;a.b=c;a.c=b} +function k5b(a){var b,c;c=a.d;b=a.a;a.d=b;a.a=c} +function Lbb(a){return zbb(iD(Fbb(a)?Rbb(a):a))} +function rlc(a,b){return beb(D0b(a.d),D0b(b.d))} +function uic(a,b){return b==(Ucd(),Tcd)?a.c:a.d} +function FHc(){FHc=ccb;DHc=(Ucd(),Tcd);EHc=zcd} +function DRb(){this.b=Edb(ED(Ksd((wSb(),vSb))))} +function aBb(a){return EAb(),KC(SI,Uhe,1,a,5,1)} +function C6c(a){return new f7c(a.c+a.b,a.d+a.a)} +function Vmc(a,b){Imc();return beb(a.d.p,b.d.p)} +function Lsb(a){sCb(a.b!=0);return Nsb(a,a.a.a)} +function Msb(a){sCb(a.b!=0);return Nsb(a,a.c.b)} +function rCb(a,b){if(!a){throw vbb(new ucb(b))}} +function mCb(a,b){if(!a){throw vbb(new Wdb(b))}} +function dWb(a,b,c){cWb.call(this,a,b);this.b=c} +function pMd(a,b,c){MLd.call(this,a,b);this.c=c} +function Dnc(a,b,c){Cnc.call(this,b,c);this.d=a} +function _Gd(a){$Gd();MGd.call(this);this.th(a)} +function PNd(a,b,c){this.a=a;nNd.call(this,b,c)} +function UNd(a,b,c){this.a=a;nNd.call(this,b,c)} +function k2d(a,b,c){MLd.call(this,a,b);this.c=c} +function y1d(){T0d();z1d.call(this,(yFd(),xFd))} +function gFd(a){return a!=null&&!OEd(a,CEd,DEd)} +function dFd(a,b){return (jFd(a)<<4|jFd(b))&aje} +function ln(a,b){return Vm(),Wj(a,b),new iy(a,b)} +function Sdd(a,b){var c;if(a.n){c=b;Ekb(a.f,c)}} +function Upd(a,b,c){var d;d=new yC(c);cC(a,b,d)} +function WUd(a,b){var c;c=a.c;VUd(a,b);return c} +function Ydd(a,b){b<0?(a.g=-1):(a.g=b);return a} +function $6c(a,b){W6c(a);a.a*=b;a.b*=b;return a} +function G6c(a,b,c,d,e){a.c=b;a.d=c;a.b=d;a.a=e} +function Dsb(a,b){Gsb(a,b,a.c.b,a.c);return true} +function jsb(a){a.a.b=a.b;a.b.a=a.a;a.a=a.b=null} +function Aq(a){this.b=a;this.a=Wm(this.b.a).Ed()} +function Wq(a,b){this.b=a;this.a=b;ol.call(this)} +function ar(a,b){this.a=a;this.b=b;ol.call(this)} +function vvb(a,b){qvb.call(this,b,1040);this.a=a} +function Eeb(a){return a==0||isNaN(a)?a:a<0?-1:1} +function WPb(a){QPb();return jtd(a)==Xod(ltd(a))} +function XPb(a){QPb();return ltd(a)==Xod(jtd(a))} +function iYb(a,b){return hYb(a,new cWb(b.a,b.b))} +function NZb(a){return !OZb(a)&&a.c.i.c==a.d.i.c} +function _Gb(a){var b;b=a.n;return a.a.b+b.d+b.a} +function YHb(a){var b;b=a.n;return a.e.b+b.d+b.a} +function ZHb(a){var b;b=a.n;return a.e.a+b.b+b.c} +function zfe(a){wfe();++vfe;return new ige(0,a)} +function o_b(a){if(a.a){return a.a}return JZb(a)} +function CCb(a){if(!a){throw vbb(new Cdb(null))}} +function X6d(){X6d=ccb;W6d=(mmb(),new anb(Fwe))} +function ex(){ex=ccb;new gx((_k(),$k),(Lk(),Kk))} +function oeb(){oeb=ccb;neb=KC(JI,nie,19,256,0,1)} +function d$c(a,b,c,d){e$c.call(this,a,b,c,d,0,0)} +function sQc(a,b,c){return Rhb(a.b,BD(c.b,17),b)} +function tQc(a,b,c){return Rhb(a.b,BD(c.b,17),b)} +function xfd(a,b){return Ekb(a,new f7c(b.a,b.b))} +function Bic(a,b){return a.c=b){throw vbb(new rcb)}} +function Pyb(a,b,c){NC(b,0,Bzb(b[0],c[0]));return b} +function _yc(a,b,c){b.Ye(c,Edb(ED(Ohb(a.b,c)))*a.a)} +function n6c(a,b,c){i6c();return m6c(a,b)&&m6c(a,c)} +function tcd(a){rcd();return !a.Hc(ncd)&&!a.Hc(pcd)} +function D6c(a){return new f7c(a.c+a.b/2,a.d+a.a/2)} +function oOd(a,b){return b.kh()?xid(a.b,BD(b,49)):b} +function bvb(a,b){this.e=a;this.d=(b&64)!=0?b|oie:b} +function qvb(a,b){this.c=0;this.d=a;this.b=b|64|oie} +function gub(a){this.b=new Skb(11);this.a=(ipb(),a)} +function Qwb(a){this.b=null;this.a=(ipb(),!a?fpb:a)} +function nHc(a){this.a=lHc(a.a);this.b=new Tkb(a.b)} +function Pzd(a){this.b=a;Oyd.call(this,a);Ozd(this)} +function Xzd(a){this.b=a;bzd.call(this,a);Wzd(this)} +function jUd(a,b,c){this.a=a;gUd.call(this,b,c,5,6)} +function Y5d(a,b,c,d){this.b=a;xMd.call(this,b,c,d)} +function nSd(a,b,c,d,e){oSd.call(this,a,b,c,d,e,-1)} +function DSd(a,b,c,d,e){ESd.call(this,a,b,c,d,e,-1)} +function cUd(a,b,c,d){xMd.call(this,a,b,c);this.b=d} +function i5d(a,b,c,d){pMd.call(this,a,b,c);this.b=d} +function x0d(a){Wud.call(this,a,false);this.a=false} +function Lj(a,b){this.b=a;sj.call(this,a.b);this.a=b} +function px(a,b){im();ox.call(this,a,Dm(new amb(b)))} +function Cfe(a,b){wfe();++vfe;return new Dge(a,b,0)} +function Efe(a,b){wfe();++vfe;return new Dge(6,a,b)} +function nfb(a,b){return dfb(a.substr(0,b.length),b)} +function Mhb(a,b){return ND(b)?Qhb(a,b):!!irb(a.f,b)} +function Rrb(a,b){uCb(b);while(a.Ob()){b.td(a.Pb())}} +function Vgb(a,b,c){Hgb();this.e=a;this.d=b;this.a=c} +function amc(a,b,c,d){var e;e=a.i;e.i=b;e.a=c;e.b=d} +function xJc(a){var b;b=a;while(b.f){b=b.f}return b} +function fkb(a){var b;b=bkb(a);sCb(b!=null);return b} +function gkb(a){var b;b=ckb(a);sCb(b!=null);return b} +function cv(a,b){var c;c=a.a.gc();Sb(b,c);return c-b} +function Glb(a,b){var c;for(c=0;c0?$wnd.Math.log(a/b):-100} +function ueb(a,b){return ybb(a,b)<0?-1:ybb(a,b)>0?1:0} +function HMb(a,b,c){return IMb(a,BD(b,46),BD(c,167))} +function iq(a,b){return BD(Rl(Wm(a.a)).Xb(b),42).cd()} +function Olb(a,b){return avb(b,a.length),new vvb(a,b)} +function Pyd(a,b){this.d=a;Fyd.call(this,a);this.e=b} +function Lub(a){this.d=(uCb(a),a);this.a=0;this.c=rie} +function rge(a,b){xfe.call(this,1);this.a=a;this.b=b} +function Rzb(a,b){!a.c?Ekb(a.b,b):Rzb(a.c,b);return a} +function uB(a,b,c){var d;d=tB(a,b);vB(a,b,c);return d} +function ZBb(a,b){var c;c=a.slice(0,b);return PC(c,a)} +function Flb(a,b,c){var d;for(d=0;d=a.g} +function NHc(a,b,c){var d;d=THc(a,b,c);return MHc(a,d)} +function Qpd(a,b){var c;c=a.a.length;tB(a,c);vB(a,c,b)} +function gCb(a,b){var c;c=console[a];c.call(console,b)} +function Bvd(a,b){var c;++a.j;c=a.Vi();a.Ii(a.oi(c,b))} +function E1c(a,b,c){BD(b.b,65);Hkb(b.a,new L1c(a,c,b))} +function oXd(a,b,c){VVd.call(this,b);this.a=a;this.b=c} +function Dge(a,b,c){xfe.call(this,a);this.a=b;this.b=c} +function dYd(a,b,c){this.a=a;lVd.call(this,b);this.b=c} +function f0d(a,b,c){this.a=a;mxd.call(this,8,b,null,c)} +function z1d(a){this.a=(uCb(Rve),Rve);this.b=a;new oUd} +function ct(a){this.c=a;this.b=this.c.a;this.a=this.c.e} +function usb(a){this.c=a;this.b=a.a.d.a;ypb(a.a.e,this)} +function uib(a){yCb(a.c!=-1);a.d.$c(a.c);a.b=a.c;a.c=-1} +function U6c(a){return $wnd.Math.sqrt(a.a*a.a+a.b*a.b)} +function Uvb(a,b){return _vb(b,a.a.c.length),Ikb(a.a,b)} +function Hb(a,b){return PD(a)===PD(b)||a!=null&&pb(a,b)} +function oAb(a){if(0>=a){return new yAb}return pAb(a-1)} +function Nfe(a){if(!bfe)return false;return Qhb(bfe,a)} +function Ehe(a){if(a)return a.dc();return !a.Kc().Ob()} +function Q_b(a){if(!a.a&&!!a.c){return a.c.b}return a.a} +function LHd(a){!a.a&&(a.a=new xMd(m5,a,4));return a.a} +function LQd(a){!a.d&&(a.d=new xMd(j5,a,1));return a.d} +function uCb(a){if(a==null){throw vbb(new Geb)}return a} +function Qzb(a){if(!a.c){a.d=true;Szb(a)}else{a.c.He()}} +function Tzb(a){if(!a.c){Uzb(a);a.d=true}else{Tzb(a.c)}} +function Kpb(a){Ae(a.a);a.b=KC(SI,Uhe,1,a.b.length,5,1)} +function qlc(a,b){return beb(b.j.c.length,a.j.c.length)} +function igd(a,b){a.c<0||a.b.b=0?a.Bh(c):vid(a,b)} +function WHc(a){var b,c;b=a.c.i.c;c=a.d.i.c;return b==c} +function Wwd(a){if(a.p!=4)throw vbb(new Ydb);return a.e} +function Vwd(a){if(a.p!=3)throw vbb(new Ydb);return a.e} +function Ywd(a){if(a.p!=6)throw vbb(new Ydb);return a.f} +function fxd(a){if(a.p!=6)throw vbb(new Ydb);return a.k} +function cxd(a){if(a.p!=3)throw vbb(new Ydb);return a.j} +function dxd(a){if(a.p!=4)throw vbb(new Ydb);return a.j} +function AYd(a){!a.b&&(a.b=new RYd(new NYd));return a.b} +function $1d(a){a.c==-2&&e2d(a,X0d(a.g,a.b));return a.c} +function pdb(a,b){var c;c=ldb('',a);c.n=b;c.i=1;return c} +function MNb(a,b){$Nb(BD(b.b,65),a);Hkb(b.a,new RNb(a))} +function Cnd(a,b){wtd((!a.a&&(a.a=new fTd(a,a)),a.a),b)} +function Qzd(a,b){this.b=a;Pyd.call(this,a,b);Ozd(this)} +function Yzd(a,b){this.b=a;czd.call(this,a,b);Wzd(this)} +function Ms(a,b,c,d){Wo.call(this,a,b);this.d=c;this.a=d} +function $o(a,b,c,d){Wo.call(this,a,c);this.a=b;this.f=d} +function iy(a,b){Pp.call(this,umb(Qb(a),Qb(b)));this.a=b} +function cae(){fod.call(this,Ewe,(p8d(),o8d));$9d(this)} +function AZd(){fod.call(this,_ve,(LFd(),KFd));uZd(this)} +function T0c(){$r.call(this,'DELAUNAY_TRIANGULATION',0)} +function vfb(a){return String.fromCharCode.apply(null,a)} +function Rhb(a,b,c){return ND(b)?Shb(a,b,c):jrb(a.f,b,c)} +function tmb(a){mmb();return !a?(ipb(),ipb(),hpb):a.ve()} +function d2c(a,b,c){Y1c();return c.pg(a,BD(b.cd(),146))} +function ix(a,b){ex();return new gx(new il(a),new Uk(b))} +function Iu(a){Xj(a,Mie);return Oy(wbb(wbb(5,a),a/10|0))} +function Vm(){Vm=ccb;Um=new wx(OC(GC(CK,1),zie,42,0,[]))} +function hob(a){!a.d&&(a.d=new lnb(a.c.Cc()));return a.d} +function eob(a){!a.a&&(a.a=new Gob(a.c.vc()));return a.a} +function gob(a){!a.b&&(a.b=new zob(a.c.ec()));return a.b} +function keb(a,b){while(b-->0){a=a<<1|(a<0?1:0)}return a} +function wtb(a,b){return PD(a)===PD(b)||a!=null&&pb(a,b)} +function Gbc(a,b){return Bcb(),BD(b.b,19).ad&&++d;return d} +function Nnd(a){var b,c;c=(b=new UQd,b);NQd(c,a);return c} +function Ond(a){var b,c;c=(b=new UQd,b);RQd(c,a);return c} +function hqd(a,b){var c;c=Ohb(a.f,b);Yqd(b,c);return null} +function JZb(a){var b;b=P2b(a);if(b){return b}return null} +function Wod(a){!a.b&&(a.b=new cUd(B2,a,12,3));return a.b} +function YEd(a){return a!=null&&hnb(GEd,a.toLowerCase())} +function ied(a,b){return Kdb(red(a)*qed(a),red(b)*qed(b))} +function jed(a,b){return Kdb(red(a)*qed(a),red(b)*qed(b))} +function wEb(a,b){return Kdb(a.d.c+a.d.b/2,b.d.c+b.d.b/2)} +function UVb(a,b){return Kdb(a.g.c+a.g.b/2,b.g.c+b.g.b/2)} +function pQb(a,b,c){c.a?eld(a,b.b-a.f/2):dld(a,b.a-a.g/2)} +function prd(a,b,c,d){this.a=a;this.b=b;this.c=c;this.d=d} +function ord(a,b,c,d){this.a=a;this.b=b;this.c=c;this.d=d} +function JVd(a,b,c,d){this.e=a;this.a=b;this.c=c;this.d=d} +function ZVd(a,b,c,d){this.a=a;this.c=b;this.d=c;this.b=d} +function cXd(a,b,c,d){UVd();mWd.call(this,b,c,d);this.a=a} +function jXd(a,b,c,d){UVd();mWd.call(this,b,c,d);this.a=a} +function Ng(a,b){this.a=a;Hg.call(this,a,BD(a.d,15).Zc(b))} +function ZBd(a){this.f=a;this.c=this.f.e;a.f>0&&YBd(this)} +function lBb(a,b,c,d){this.b=a;this.c=d;nvb.call(this,b,c)} +function tib(a){sCb(a.b=0&&dfb(a.substr(c,b.length),b)} +function H2d(a,b,c,d,e,f,g){return new O7d(a.e,b,c,d,e,f,g)} +function Cxd(a,b,c,d,e,f){this.a=a;nxd.call(this,b,c,d,e,f)} +function vyd(a,b,c,d,e,f){this.a=a;nxd.call(this,b,c,d,e,f)} +function $Ec(a,b){this.g=a;this.d=OC(GC(OQ,1),kne,10,0,[b])} +function KVd(a,b){this.e=a;this.a=SI;this.b=R5d(b);this.c=b} +function cIb(a,b){$Gb.call(this);THb(this);this.a=a;this.c=b} +function kBc(a,b,c,d){NC(a.c[b.g],c.g,d);NC(a.c[c.g],b.g,d)} +function nBc(a,b,c,d){NC(a.c[b.g],b.g,c);NC(a.b[b.g],b.g,d)} +function cBc(){_Ac();return OC(GC(fX,1),Kie,376,0,[$Ac,ZAc])} +function crc(){_qc();return OC(GC(MW,1),Kie,479,0,[$qc,Zqc])} +function Aqc(){xqc();return OC(GC(JW,1),Kie,419,0,[vqc,wqc])} +function Lpc(){Ipc();return OC(GC(FW,1),Kie,422,0,[Gpc,Hpc])} +function psc(){msc();return OC(GC(SW,1),Kie,420,0,[ksc,lsc])} +function EAc(){BAc();return OC(GC(cX,1),Kie,421,0,[zAc,AAc])} +function XIc(){UIc();return OC(GC(mY,1),Kie,523,0,[TIc,SIc])} +function KOc(){HOc();return OC(GC(DZ,1),Kie,520,0,[GOc,FOc])} +function _Lc(){YLc();return OC(GC(fZ,1),Kie,516,0,[XLc,WLc])} +function hMc(){eMc();return OC(GC(gZ,1),Kie,515,0,[cMc,dMc])} +function IQc(){FQc();return OC(GC(YZ,1),Kie,455,0,[DQc,EQc])} +function bUc(){$Tc();return OC(GC(F$,1),Kie,425,0,[ZTc,YTc])} +function VTc(){STc();return OC(GC(E$,1),Kie,480,0,[QTc,RTc])} +function VUc(){PUc();return OC(GC(K$,1),Kie,495,0,[NUc,OUc])} +function jWc(){fWc();return OC(GC(X$,1),Kie,426,0,[dWc,eWc])} +function g1c(){a1c();return OC(GC(X_,1),Kie,429,0,[_0c,$0c])} +function F_c(){C_c();return OC(GC(P_,1),Kie,430,0,[B_c,A_c])} +function PEb(){MEb();return OC(GC(aN,1),Kie,428,0,[LEb,KEb])} +function XEb(){UEb();return OC(GC(bN,1),Kie,427,0,[SEb,TEb])} +function $Rb(){XRb();return OC(GC(gP,1),Kie,424,0,[VRb,WRb])} +function B5b(){y5b();return OC(GC(ZR,1),Kie,511,0,[x5b,w5b])} +function lid(a,b,c,d){return c>=0?a.jh(b,c,d):a.Sg(null,c,d)} +function hgd(a){if(a.b.b==0){return a.a.$e()}return Lsb(a.b)} +function Xwd(a){if(a.p!=5)throw vbb(new Ydb);return Tbb(a.f)} +function exd(a){if(a.p!=5)throw vbb(new Ydb);return Tbb(a.k)} +function pNd(a){PD(a.a)===PD((NKd(),MKd))&&qNd(a);return a.a} +function by(a){this.a=BD(Qb(a),271);this.b=(mmb(),new Zob(a))} +function bQc(a,b){$Pc(this,new f7c(a.a,a.b));_Pc(this,Ru(b))} +function FQc(){FQc=ccb;DQc=new GQc(jle,0);EQc=new GQc(kle,1)} +function YLc(){YLc=ccb;XLc=new ZLc(kle,0);WLc=new ZLc(jle,1)} +function Hp(){Gp.call(this,new Mqb(Cv(12)));Lb(true);this.a=2} +function Hge(a,b,c){wfe();xfe.call(this,a);this.b=b;this.a=c} +function cWd(a,b,c){UVd();VVd.call(this,b);this.a=a;this.b=c} +function aIb(a){$Gb.call(this);THb(this);this.a=a;this.c=true} +function isb(a){var b;b=a.c.d.b;a.b=b;a.a=a.c.d;b.a=a.c.d.b=a} +function $Cb(a){var b;NGb(a.a);MGb(a.a);b=new YGb(a.a);UGb(b)} +function iKb(a,b){hKb(a,true);Hkb(a.e.wf(),new mKb(a,true,b))} +function tlb(a,b){pCb(b);return vlb(a,KC(WD,oje,25,b,15,1),b)} +function YPb(a,b){QPb();return a==Xod(jtd(b))||a==Xod(ltd(b))} +function Phb(a,b){return b==null?Wd(irb(a.f,null)):Crb(a.g,b)} +function Ksb(a){return a.b==0?null:(sCb(a.b!=0),Nsb(a,a.a.a))} +function QD(a){return Math.max(Math.min(a,Ohe),-2147483648)|0} +function uz(a,b){var c=tz[a.charCodeAt(0)];return c==null?a:c} +function Cx(a,b){Rb(a,'set1');Rb(b,'set2');return new Px(a,b)} +function QUb(a,b){var c;c=zUb(a.f,b);return P6c(V6c(c),a.f.d)} +function Jwb(a,b){var c,d;c=b;d=new fxb;Lwb(a,c,d);return d.d} +function NJb(a,b,c,d){var e;e=new aHb;b.a[c.g]=e;Npb(a.b,d,e)} +function zid(a,b,c){var d;d=a.Yg(b);d>=0?a.sh(d,c):uid(a,b,c)} +function hvd(a,b,c){evd();!!a&&Rhb(dvd,a,b);!!a&&Rhb(cvd,a,c)} +function g_c(a,b,c){this.i=new Rkb;this.b=a;this.g=b;this.a=c} +function VZc(a,b,c){this.c=new Rkb;this.e=a;this.f=b;this.b=c} +function b$c(a,b,c){this.a=new Rkb;this.e=a;this.f=b;this.c=c} +function Zy(a,b){Py(this);this.f=b;this.g=a;Ry(this);this._d()} +function ZA(a,b){var c;c=a.q.getHours();a.q.setDate(b);YA(a,c)} +function no(a,b){var c;Qb(b);for(c=a.a;c;c=c.c){b.Od(c.g,c.i)}} +function Fx(a){var b;b=new Uqb(Cv(a.length));nmb(b,a);return b} +function ecb(a){function b(){} +;b.prototype=a||{};return new b} +function dkb(a,b){if(Zjb(a,b)){wkb(a);return true}return false} +function aC(a,b){if(b==null){throw vbb(new Geb)}return bC(a,b)} +function tdb(a){if(a.qe()){return null}var b=a.n;return _bb[b]} +function Mld(a){if(a.Db>>16!=3)return null;return BD(a.Cb,33)} +function mpd(a){if(a.Db>>16!=9)return null;return BD(a.Cb,33)} +function fmd(a){if(a.Db>>16!=6)return null;return BD(a.Cb,79)} +function Ind(a){if(a.Db>>16!=7)return null;return BD(a.Cb,235)} +function Fod(a){if(a.Db>>16!=7)return null;return BD(a.Cb,160)} +function Xod(a){if(a.Db>>16!=11)return null;return BD(a.Cb,33)} +function nid(a,b){var c;c=a.Yg(b);return c>=0?a.lh(c):tid(a,b)} +function Dtd(a,b){var c;c=new Bsb(b);Ve(c,a);return new Tkb(c)} +function Uud(a){var b;b=a.d;b=a.si(a.f);wtd(a,b);return b.Ob()} +function t_b(a,b){a.b+=b.b;a.c+=b.c;a.d+=b.d;a.a+=b.a;return a} +function A4b(a,b){return $wnd.Math.abs(a)<$wnd.Math.abs(b)?a:b} +function Zod(a){return !a.a&&(a.a=new cUd(E2,a,10,11)),a.a.i>0} +function oDb(){this.a=new zsb;this.e=new Tqb;this.g=0;this.i=0} +function BGc(a){this.a=a;this.b=KC(SX,nie,1944,a.e.length,0,2)} +function RHc(a,b,c){var d;d=SHc(a,b,c);a.b=new BHc(d.c.length)} +function eMc(){eMc=ccb;cMc=new fMc(vle,0);dMc=new fMc('UP',1)} +function STc(){STc=ccb;QTc=new TTc(Yqe,0);RTc=new TTc('FAN',1)} +function evd(){evd=ccb;dvd=new Lqb;cvd=new Lqb;ivd(hK,new jvd)} +function Swd(a){if(a.p!=0)throw vbb(new Ydb);return Kbb(a.f,0)} +function _wd(a){if(a.p!=0)throw vbb(new Ydb);return Kbb(a.k,0)} +function MHd(a){if(a.Db>>16!=3)return null;return BD(a.Cb,147)} +function ZJd(a){if(a.Db>>16!=6)return null;return BD(a.Cb,235)} +function WId(a){if(a.Db>>16!=17)return null;return BD(a.Cb,26)} +function rdb(a,b){var c=a.a=a.a||[];return c[b]||(c[b]=a.le(b))} +function hrb(a,b){var c;c=a.a.get(b);return c==null?new Array:c} +function aB(a,b){var c;c=a.q.getHours();a.q.setMonth(b);YA(a,c)} +function Shb(a,b,c){return b==null?jrb(a.f,null,c):Drb(a.g,b,c)} +function FLd(a,b,c,d,e,f){return new pSd(a.e,b,a.aj(),c,d,e,f)} +function Tfb(a,b,c){a.a=qfb(a.a,0,b)+(''+c)+pfb(a.a,b);return a} +function bq(a,b,c){Ekb(a.a,(Vm(),Wj(b,c),new Wo(b,c)));return a} +function uu(a){ot(a.c);a.e=a.a=a.c;a.c=a.c.c;++a.d;return a.a.f} +function vu(a){ot(a.e);a.c=a.a=a.e;a.e=a.e.e;--a.d;return a.a.f} +function RZb(a,b){!!a.d&&Lkb(a.d.e,a);a.d=b;!!a.d&&Ekb(a.d.e,a)} +function QZb(a,b){!!a.c&&Lkb(a.c.g,a);a.c=b;!!a.c&&Ekb(a.c.g,a)} +function $_b(a,b){!!a.c&&Lkb(a.c.a,a);a.c=b;!!a.c&&Ekb(a.c.a,a)} +function F0b(a,b){!!a.i&&Lkb(a.i.j,a);a.i=b;!!a.i&&Ekb(a.i.j,a)} +function jDb(a,b,c){this.a=b;this.c=a;this.b=(Qb(c),new Tkb(c))} +function qXb(a,b,c){this.a=b;this.c=a;this.b=(Qb(c),new Tkb(c))} +function aOb(a,b){this.a=a;this.c=R6c(this.a);this.b=new K6c(b)} +function IAb(a){var b;Uzb(a);b=new Tqb;return JAb(a,new jBb(b))} +function wCb(a,b){if(a<0||a>b){throw vbb(new qcb(Ake+a+Bke+b))}} +function Ppb(a,b){return vqb(a.a,b)?Qpb(a,BD(b,22).g,null):null} +function WUb(a){LUb();return Bcb(),BD(a.a,81).d.e!=0?true:false} +function qs(){qs=ccb;ps=as((hs(),OC(GC(yG,1),Kie,538,0,[gs])))} +function SBc(){SBc=ccb;RBc=c3c(new j3c,(qUb(),pUb),(S8b(),J8b))} +function ZBc(){ZBc=ccb;YBc=c3c(new j3c,(qUb(),pUb),(S8b(),J8b))} +function oCc(){oCc=ccb;nCc=c3c(new j3c,(qUb(),pUb),(S8b(),J8b))} +function aJc(){aJc=ccb;_Ic=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))} +function FJc(){FJc=ccb;EJc=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))} +function ILc(){ILc=ccb;HLc=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))} +function wMc(){wMc=ccb;vMc=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))} +function fUc(){fUc=ccb;eUc=c3c(new j3c,(yRc(),xRc),(qSc(),kSc))} +function DOc(a,b,c,d){this.c=a;this.d=d;BOc(this,b);COc(this,c)} +function W3c(a){this.c=new Psb;this.b=a.b;this.d=a.c;this.a=a.a} +function e7c(a){this.a=$wnd.Math.cos(a);this.b=$wnd.Math.sin(a)} +function BOc(a,b){!!a.a&&Lkb(a.a.k,a);a.a=b;!!a.a&&Ekb(a.a.k,a)} +function COc(a,b){!!a.b&&Lkb(a.b.f,a);a.b=b;!!a.b&&Ekb(a.b.f,a)} +function D1c(a,b){E1c(a,a.b,a.c);BD(a.b.b,65);!!b&&BD(b.b,65).b} +function BUd(a,b){CUd(a,b);JD(a.Cb,88)&&XMd($Kd(BD(a.Cb,88)),2)} +function cJd(a,b){JD(a.Cb,88)&&XMd($Kd(BD(a.Cb,88)),4);pnd(a,b)} +function lKd(a,b){JD(a.Cb,179)&&(BD(a.Cb,179).tb=null);pnd(a,b)} +function T2d(a,b){return Q6d(),YId(b)?new R7d(b,a):new f7d(b,a)} +function jsd(a,b){var c,d;c=b.c;d=c!=null;d&&Qpd(a,new yC(b.c))} +function XOd(a){var b,c;c=(LFd(),b=new UQd,b);NQd(c,a);return c} +function eTd(a){var b,c;c=(LFd(),b=new UQd,b);NQd(c,a);return c} +function yCc(a,b){var c;c=new H1b(a);b.c[b.c.length]=c;return c} +function Aw(a,b){var c;c=BD(Hv(nd(a.a),b),14);return !c?0:c.gc()} +function UAb(a){var b;Uzb(a);b=(ipb(),ipb(),gpb);return VAb(a,b)} +function nr(a){var b;while(true){b=a.Pb();if(!a.Ob()){return b}}} +function Ki(a,b){Ii.call(this,new Mqb(Cv(a)));Xj(b,mie);this.a=b} +function Jib(a,b,c){xCb(b,c,a.gc());this.c=a;this.a=b;this.b=c-b} +function Mkb(a,b,c){var d;xCb(b,c,a.c.length);d=c-b;cCb(a.c,b,d)} +function Fub(a,b){Eub(a,Tbb(xbb(Obb(b,24),nke)),Tbb(xbb(b,nke)))} +function tCb(a,b){if(a<0||a>=b){throw vbb(new qcb(Ake+a+Bke+b))}} +function BCb(a,b){if(a<0||a>=b){throw vbb(new Xfb(Ake+a+Bke+b))}} +function Kub(a,b){this.b=(uCb(a),a);this.a=(b&Rje)==0?b|64|oie:b} +function kkb(a){Vjb(this);dCb(this.a,geb($wnd.Math.max(8,a))<<1)} +function A0b(a){return l7c(OC(GC(m1,1),nie,8,0,[a.i.n,a.n,a.a]))} +function Iyb(){Fyb();return OC(GC(xL,1),Kie,132,0,[Cyb,Dyb,Eyb])} +function jHb(){gHb();return OC(GC(pN,1),Kie,232,0,[dHb,eHb,fHb])} +function QHb(){NHb();return OC(GC(sN,1),Kie,461,0,[LHb,KHb,MHb])} +function HIb(){EIb();return OC(GC(zN,1),Kie,462,0,[DIb,CIb,BIb])} +function UXb(){RXb();return OC(GC(hQ,1),Kie,423,0,[QXb,PXb,OXb])} +function BTb(){yTb();return OC(GC(oP,1),Kie,379,0,[wTb,vTb,xTb])} +function Bzc(){xzc();return OC(GC(ZW,1),Kie,378,0,[uzc,vzc,wzc])} +function Xpc(){Rpc();return OC(GC(GW,1),Kie,314,0,[Ppc,Opc,Qpc])} +function eqc(){bqc();return OC(GC(HW,1),Kie,337,0,[$pc,aqc,_pc])} +function Jqc(){Gqc();return OC(GC(KW,1),Kie,450,0,[Eqc,Dqc,Fqc])} +function Ikc(){Fkc();return OC(GC(vV,1),Kie,361,0,[Ekc,Dkc,Ckc])} +function hsc(){esc();return OC(GC(RW,1),Kie,303,0,[csc,dsc,bsc])} +function $rc(){Xrc();return OC(GC(QW,1),Kie,292,0,[Vrc,Wrc,Urc])} +function NAc(){KAc();return OC(GC(dX,1),Kie,452,0,[JAc,HAc,IAc])} +function wAc(){tAc();return OC(GC(bX,1),Kie,339,0,[rAc,qAc,sAc])} +function WAc(){TAc();return OC(GC(eX,1),Kie,375,0,[QAc,RAc,SAc])} +function OBc(){LBc();return OC(GC(jX,1),Kie,377,0,[JBc,KBc,IBc])} +function wBc(){tBc();return OC(GC(hX,1),Kie,336,0,[qBc,rBc,sBc])} +function FBc(){CBc();return OC(GC(iX,1),Kie,338,0,[BBc,zBc,ABc])} +function uGc(){rGc();return OC(GC(PX,1),Kie,454,0,[oGc,pGc,qGc])} +function xVc(){tVc();return OC(GC(O$,1),Kie,442,0,[sVc,qVc,rVc])} +function tWc(){pWc();return OC(GC(Y$,1),Kie,380,0,[mWc,nWc,oWc])} +function CYc(){zYc();return OC(GC(q_,1),Kie,381,0,[xYc,yYc,wYc])} +function wXc(){sXc();return OC(GC(b_,1),Kie,293,0,[qXc,rXc,pXc])} +function _$c(){Y$c();return OC(GC(J_,1),Kie,437,0,[V$c,W$c,X$c])} +function kbd(){hbd();return OC(GC(z1,1),Kie,334,0,[fbd,ebd,gbd])} +function tad(){qad();return OC(GC(u1,1),Kie,272,0,[nad,oad,pad])} +function o3d(a,b){return p3d(a,b,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)} +function LZc(a,b,c){var d;d=MZc(a,b,false);return d.b<=b&&d.a<=c} +function tMc(a,b,c){var d;d=new sMc;d.b=b;d.a=c;++b.b;Ekb(a.d,d)} +function fs(a,b){var c;c=(uCb(a),a).g;lCb(!!c);uCb(b);return c(b)} +function av(a,b){var c,d;d=cv(a,b);c=a.a.Zc(d);return new qv(a,c)} +function cKd(a){if(a.Db>>16!=6)return null;return BD(aid(a),235)} +function Uwd(a){if(a.p!=2)throw vbb(new Ydb);return Tbb(a.f)&aje} +function bxd(a){if(a.p!=2)throw vbb(new Ydb);return Tbb(a.k)&aje} +function Z1d(a){a.a==(T0d(),S0d)&&d2d(a,U0d(a.g,a.b));return a.a} +function _1d(a){a.d==(T0d(),S0d)&&f2d(a,Y0d(a.g,a.b));return a.d} +function mlb(a){sCb(a.ad?1:0} +function bjc(a,b){var c,d;c=ajc(b);d=c;return BD(Ohb(a.c,d),19).a} +function iSc(a,b){var c;c=a+'';while(c.length0&&a.a[--a.d]==0);a.a[a.d++]==0&&(a.e=0)} +function wwb(a){return !a.a?a.c:a.e.length==0?a.a.a:a.a.a+(''+a.e)} +function RSd(a){return !!a.a&&QSd(a.a.a).i!=0&&!(!!a.b&&QTd(a.b))} +function cLd(a){return !!a.u&&VKd(a.u.a).i!=0&&!(!!a.n&&FMd(a.n))} +function $i(a){return Zj(a.e.Hd().gc()*a.c.Hd().gc(),16,new ij(a))} +function XA(a,b){return ueb(Cbb(a.q.getTime()),Cbb(b.q.getTime()))} +function k_b(a){return BD(Qkb(a,KC(AQ,jne,17,a.c.length,0,1)),474)} +function l_b(a){return BD(Qkb(a,KC(OQ,kne,10,a.c.length,0,1)),193)} +function cKc(a){FJc();return !OZb(a)&&!(!OZb(a)&&a.c.i.c==a.d.i.c)} +function kDb(a,b,c){var d;d=(Qb(a),new Tkb(a));iDb(new jDb(d,b,c))} +function rXb(a,b,c){var d;d=(Qb(a),new Tkb(a));pXb(new qXb(d,b,c))} +function Nwb(a,b){var c;c=1-b;a.a[c]=Owb(a.a[c],c);return Owb(a,b)} +function YXc(a,b){var c;a.e=new QXc;c=gVc(b);Okb(c,a.c);ZXc(a,c,0)} +function o4c(a,b,c,d){var e;e=new w4c;e.a=b;e.b=c;e.c=d;Dsb(a.a,e)} +function p4c(a,b,c,d){var e;e=new w4c;e.a=b;e.b=c;e.c=d;Dsb(a.b,e)} +function i6d(a){var b,c,d;b=new A6d;c=s6d(b,a);z6d(b);d=c;return d} +function vZd(){var a,b,c;b=(c=(a=new UQd,a),c);Ekb(rZd,b);return b} +function H2c(a){a.j.c=KC(SI,Uhe,1,0,5,1);Ae(a.c);h3c(a.a);return a} +function tgc(a){qgc();if(JD(a.g,10)){return BD(a.g,10)}return null} +function Zw(a){if(Ah(a).dc()){return false}Bh(a,new bx);return true} +function _y(b){if(!('stack' in b)){try{throw b}catch(a){}}return b} +function Pb(a,b){if(a<0||a>=b){throw vbb(new qcb(Ib(a,b)))}return a} +function Tb(a,b,c){if(a<0||bc){throw vbb(new qcb(Kb(a,b,c)))}} +function eVb(a,b){Qqb(a.a,b);if(b.d){throw vbb(new hz(Hke))}b.d=a} +function xpb(a,b){if(b.$modCount!=a.$modCount){throw vbb(new Apb)}} +function $pb(a,b){if(JD(b,42)){return Jd(a.a,BD(b,42))}return false} +function dib(a,b){if(JD(b,42)){return Jd(a.a,BD(b,42))}return false} +function msb(a,b){if(JD(b,42)){return Jd(a.a,BD(b,42))}return false} +function qAb(a,b){if(a.a<=a.b){b.ud(a.a++);return true}return false} +function Sbb(a){var b;if(Fbb(a)){b=a;return b==-0.?0:b}return oD(a)} +function tAb(a){var b;Tzb(a);b=new drb;_ub(a.a,new BAb(b));return b} +function Yzb(a){var b;Tzb(a);b=new Gpb;_ub(a.a,new mAb(b));return b} +function Bib(a,b){this.a=a;vib.call(this,a);wCb(b,a.gc());this.b=b} +function orb(a){this.e=a;this.b=this.e.a.entries();this.a=new Array} +function Oi(a){return Zj(a.e.Hd().gc()*a.c.Hd().gc(),273,new cj(a))} +function Qu(a){return new Skb((Xj(a,Mie),Oy(wbb(wbb(5,a),a/10|0))))} +function m_b(a){return BD(Qkb(a,KC(aR,lne,11,a.c.length,0,1)),1943)} +function sMb(a,b,c){return c.f.c.length>0?HMb(a.a,b,c):HMb(a.b,b,c)} +function SZb(a,b,c){!!a.d&&Lkb(a.d.e,a);a.d=b;!!a.d&&Dkb(a.d.e,c,a)} +function a5b(a,b){i5b(b,a);k5b(a.d);k5b(BD(vNb(a,(Nyc(),wxc)),207))} +function _4b(a,b){f5b(b,a);h5b(a.d);h5b(BD(vNb(a,(Nyc(),wxc)),207))} +function Ypd(a,b){var c,d;c=aC(a,b);d=null;!!c&&(d=c.fe());return d} +function Zpd(a,b){var c,d;c=tB(a,b);d=null;!!c&&(d=c.ie());return d} +function $pd(a,b){var c,d;c=aC(a,b);d=null;!!c&&(d=c.ie());return d} +function _pd(a,b){var c,d;c=aC(a,b);d=null;!!c&&(d=aqd(c));return d} +function Tqd(a,b,c){var d;d=Wpd(c);ro(a.g,d,b);ro(a.i,b,c);return b} +function Ez(a,b,c){var d;d=Cz();try{return Bz(a,b,c)}finally{Fz(d)}} +function C6d(a){var b;b=a.Wg();this.a=JD(b,69)?BD(b,69).Zh():b.Kc()} +function j3c(){D2c.call(this);this.j.c=KC(SI,Uhe,1,0,5,1);this.a=-1} +function mxd(a,b,c,d){this.d=a;this.n=b;this.g=c;this.o=d;this.p=-1} +function jk(a,b,c,d){this.e=d;this.d=null;this.c=a;this.a=b;this.b=c} +function uEc(a,b,c){this.d=new HEc(this);this.e=a;this.i=b;this.f=c} +function msc(){msc=ccb;ksc=new nsc(gle,0);lsc=new nsc('TOP_LEFT',1)} +function cDc(){cDc=ccb;bDc=ix(meb(1),meb(4));aDc=ix(meb(1),meb(2))} +function z_c(){z_c=ccb;y_c=as((s_c(),OC(GC(O_,1),Kie,551,0,[r_c])))} +function q_c(){q_c=ccb;p_c=as((i_c(),OC(GC(N_,1),Kie,482,0,[h_c])))} +function Z0c(){Z0c=ccb;Y0c=as((R0c(),OC(GC(W_,1),Kie,530,0,[Q0c])))} +function hPb(){hPb=ccb;gPb=as((cPb(),OC(GC(GO,1),Kie,481,0,[bPb])))} +function yLb(){vLb();return OC(GC(PN,1),Kie,406,0,[uLb,rLb,sLb,tLb])} +function qxb(){lxb();return OC(GC(iL,1),Kie,297,0,[hxb,ixb,jxb,kxb])} +function UOb(){ROb();return OC(GC(CO,1),Kie,394,0,[OOb,NOb,POb,QOb])} +function UMb(){RMb();return OC(GC(jO,1),Kie,323,0,[OMb,NMb,PMb,QMb])} +function sWb(){lWb();return OC(GC(SP,1),Kie,405,0,[hWb,kWb,iWb,jWb])} +function kbc(){gbc();return OC(GC(VS,1),Kie,360,0,[fbc,dbc,ebc,cbc])} +function Vc(a,b,c,d){return JD(c,54)?new Cg(a,b,c,d):new qg(a,b,c,d)} +function Djc(){Ajc();return OC(GC(mV,1),Kie,411,0,[wjc,xjc,yjc,zjc])} +function okc(a){var b;return a.j==(Ucd(),Rcd)&&(b=pkc(a),uqb(b,zcd))} +function Mdc(a,b){var c;c=b.a;QZb(c,b.c.d);RZb(c,b.d.d);q7c(c.a,a.n)} +function Smc(a,b){return BD(Btb(QAb(BD(Qc(a.k,b),15).Oc(),Hmc)),113)} +function Tmc(a,b){return BD(Btb(RAb(BD(Qc(a.k,b),15).Oc(),Hmc)),113)} +function _w(a){return new Kub(rmb(BD(a.a.dd(),14).gc(),a.a.cd()),16)} +function Qq(a){if(JD(a,14)){return BD(a,14).dc()}return !a.Kc().Ob()} +function ugc(a){qgc();if(JD(a.g,145)){return BD(a.g,145)}return null} +function Ko(a){if(a.e.g!=a.b){throw vbb(new Apb)}return !!a.c&&a.d>0} +function Xsb(a){sCb(a.b!=a.d.c);a.c=a.b;a.b=a.b.a;++a.a;return a.c.c} +function Xjb(a,b){uCb(b);NC(a.a,a.c,b);a.c=a.c+1&a.a.length-1;_jb(a)} +function Wjb(a,b){uCb(b);a.b=a.b-1&a.a.length-1;NC(a.a,a.b,b);_jb(a)} +function A2c(a,b){var c;for(c=a.j.c.length;c0&&$fb(a.g,0,b,0,a.i);return b} +function qEd(a,b){pEd();var c;c=BD(Ohb(oEd,a),55);return !c||c.wj(b)} +function Twd(a){if(a.p!=1)throw vbb(new Ydb);return Tbb(a.f)<<24>>24} +function axd(a){if(a.p!=1)throw vbb(new Ydb);return Tbb(a.k)<<24>>24} +function gxd(a){if(a.p!=7)throw vbb(new Ydb);return Tbb(a.k)<<16>>16} +function Zwd(a){if(a.p!=7)throw vbb(new Ydb);return Tbb(a.f)<<16>>16} +function sr(a){var b;b=0;while(a.Ob()){a.Pb();b=wbb(b,1)}return Oy(b)} +function nx(a,b){var c;c=new Vfb;a.xd(c);c.a+='..';b.yd(c);return c.a} +function Sgc(a,b,c){var d;d=BD(Ohb(a.g,c),57);Ekb(a.a.c,new vgd(b,d))} +function VCb(a,b,c){return Ddb(ED(Wd(irb(a.f,b))),ED(Wd(irb(a.f,c))))} +function E2d(a,b,c){return F2d(a,b,c,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)} +function L2d(a,b,c){return M2d(a,b,c,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)} +function q3d(a,b,c){return r3d(a,b,c,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)} +function JJc(a,b){return a==(j0b(),h0b)&&b==h0b?4:a==h0b||b==h0b?8:32} +function Nd(a,b){return PD(b)===PD(a)?'(this Map)':b==null?Xhe:fcb(b)} +function kFd(a,b){return BD(b==null?Wd(irb(a.f,null)):Crb(a.g,b),281)} +function Rqd(a,b,c){var d;d=Wpd(c);Rhb(a.b,d,b);Rhb(a.c,b,c);return b} +function Bfd(a,b){var c;c=b;while(c){O6c(a,c.i,c.j);c=Xod(c)}return a} +function kt(a,b){var c;c=vmb(Nu(new wu(a,b)));ir(new wu(a,b));return c} +function R6d(a,b){Q6d();var c;c=BD(a,66).Mj();kVd(c,b);return c.Ok(b)} +function TOc(a,b,c,d,e){var f;f=OOc(e,c,d);Ekb(b,tOc(e,f));XOc(a,e,b)} +function mic(a,b,c){a.i=0;a.e=0;if(b==c){return}lic(a,b,c);kic(a,b,c)} +function dB(a,b){var c;c=a.q.getHours();a.q.setFullYear(b+nje);YA(a,c)} +function dC(d,a,b){if(b){var c=b.ee();d.a[a]=c(b)}else{delete d.a[a]}} +function vB(d,a,b){if(b){var c=b.ee();b=c(b)}else{b=undefined}d.a[a]=b} +function pCb(a){if(a<0){throw vbb(new Feb('Negative array size: '+a))}} +function VKd(a){if(!a.n){$Kd(a);a.n=new JMd(a,j5,a);_Kd(a)}return a.n} +function Fqb(a){sCb(a.a=0&&a.a[c]===b[c];c--);return c<0} +function Ucc(a,b){Occ();var c;c=a.j.g-b.j.g;if(c!=0){return c}return 0} +function Dtb(a,b){uCb(b);if(a.a!=null){return Itb(b.Kb(a.a))}return ztb} +function Gx(a){var b;if(a){return new Bsb(a)}b=new zsb;Jq(b,a);return b} +function GAb(a,b){var c;return b.b.Kb(SAb(a,b.c.Ee(),(c=new TBb(b),c)))} +function Hub(a){zub();Eub(this,Tbb(xbb(Obb(a,24),nke)),Tbb(xbb(a,nke)))} +function REb(){REb=ccb;QEb=as((MEb(),OC(GC(aN,1),Kie,428,0,[LEb,KEb])))} +function ZEb(){ZEb=ccb;YEb=as((UEb(),OC(GC(bN,1),Kie,427,0,[SEb,TEb])))} +function aSb(){aSb=ccb;_Rb=as((XRb(),OC(GC(gP,1),Kie,424,0,[VRb,WRb])))} +function D5b(){D5b=ccb;C5b=as((y5b(),OC(GC(ZR,1),Kie,511,0,[x5b,w5b])))} +function Cqc(){Cqc=ccb;Bqc=as((xqc(),OC(GC(JW,1),Kie,419,0,[vqc,wqc])))} +function erc(){erc=ccb;drc=as((_qc(),OC(GC(MW,1),Kie,479,0,[$qc,Zqc])))} +function eBc(){eBc=ccb;dBc=as((_Ac(),OC(GC(fX,1),Kie,376,0,[$Ac,ZAc])))} +function GAc(){GAc=ccb;FAc=as((BAc(),OC(GC(cX,1),Kie,421,0,[zAc,AAc])))} +function Npc(){Npc=ccb;Mpc=as((Ipc(),OC(GC(FW,1),Kie,422,0,[Gpc,Hpc])))} +function rsc(){rsc=ccb;qsc=as((msc(),OC(GC(SW,1),Kie,420,0,[ksc,lsc])))} +function MOc(){MOc=ccb;LOc=as((HOc(),OC(GC(DZ,1),Kie,520,0,[GOc,FOc])))} +function ZIc(){ZIc=ccb;YIc=as((UIc(),OC(GC(mY,1),Kie,523,0,[TIc,SIc])))} +function bMc(){bMc=ccb;aMc=as((YLc(),OC(GC(fZ,1),Kie,516,0,[XLc,WLc])))} +function jMc(){jMc=ccb;iMc=as((eMc(),OC(GC(gZ,1),Kie,515,0,[cMc,dMc])))} +function KQc(){KQc=ccb;JQc=as((FQc(),OC(GC(YZ,1),Kie,455,0,[DQc,EQc])))} +function dUc(){dUc=ccb;cUc=as(($Tc(),OC(GC(F$,1),Kie,425,0,[ZTc,YTc])))} +function XUc(){XUc=ccb;WUc=as((PUc(),OC(GC(K$,1),Kie,495,0,[NUc,OUc])))} +function XTc(){XTc=ccb;WTc=as((STc(),OC(GC(E$,1),Kie,480,0,[QTc,RTc])))} +function lWc(){lWc=ccb;kWc=as((fWc(),OC(GC(X$,1),Kie,426,0,[dWc,eWc])))} +function i1c(){i1c=ccb;h1c=as((a1c(),OC(GC(X_,1),Kie,429,0,[_0c,$0c])))} +function H_c(){H_c=ccb;G_c=as((C_c(),OC(GC(P_,1),Kie,430,0,[B_c,A_c])))} +function UIc(){UIc=ccb;TIc=new VIc('UPPER',0);SIc=new VIc('LOWER',1)} +function Lqd(a,b){var c;c=new eC;Spd(c,'x',b.a);Spd(c,'y',b.b);Qpd(a,c)} +function Oqd(a,b){var c;c=new eC;Spd(c,'x',b.a);Spd(c,'y',b.b);Qpd(a,c)} +function Jic(a,b){var c,d;d=false;do{c=Mic(a,b);d=d|c}while(c);return d} +function zHc(a,b){var c,d;c=b;d=0;while(c>0){d+=a.a[c];c-=c&-c}return d} +function Cfd(a,b){var c;c=b;while(c){O6c(a,-c.i,-c.j);c=Xod(c)}return a} +function reb(a,b){var c,d;uCb(b);for(d=a.Kc();d.Ob();){c=d.Pb();b.td(c)}} +function me(a,b){var c;c=b.cd();return new Wo(c,a.e.pc(c,BD(b.dd(),14)))} +function Gsb(a,b,c,d){var e;e=new jtb;e.c=b;e.b=c;e.a=d;d.b=c.a=e;++a.b} +function Nkb(a,b,c){var d;d=(tCb(b,a.c.length),a.c[b]);a.c[b]=c;return d} +function lFd(a,b,c){return BD(b==null?jrb(a.f,null,c):Drb(a.g,b,c),281)} +function fRb(a){return !!a.c&&!!a.d?oRb(a.c)+'->'+oRb(a.d):'e_'+FCb(a)} +function FAb(a,b){return (Uzb(a),WAb(new YAb(a,new qBb(b,a.a)))).sd(DAb)} +function tUb(){qUb();return OC(GC(zP,1),Kie,356,0,[lUb,mUb,nUb,oUb,pUb])} +function _cd(){Ucd();return OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])} +function Dz(b){Az();return function(){return Ez(b,this,arguments);var a}} +function sz(){if(Date.now){return Date.now()}return (new Date).getTime()} +function OZb(a){if(!a.c||!a.d){return false}return !!a.c.i&&a.c.i==a.d.i} +function pv(a){if(!a.c.Sb()){throw vbb(new utb)}a.a=true;return a.c.Ub()} +function ko(a){a.i=0;Alb(a.b,null);Alb(a.c,null);a.a=null;a.e=null;++a.g} +function ycb(a){wcb.call(this,a==null?Xhe:fcb(a),JD(a,78)?BD(a,78):null)} +function PYb(a){MYb();yXb(this);this.a=new Psb;NYb(this,a);Dsb(this.a,a)} +function jYb(){Ckb(this);this.b=new f7c(Pje,Pje);this.a=new f7c(Qje,Qje)} +function rAb(a,b){this.c=0;this.b=b;jvb.call(this,a,17493);this.a=this.c} +function wyb(a){oyb();if(lyb){return}this.c=a;this.e=true;this.a=new Rkb} +function oyb(){oyb=ccb;lyb=true;jyb=false;kyb=false;nyb=false;myb=false} +function C3c(a,b){if(JD(b,149)){return dfb(a.c,BD(b,149).c)}return false} +function zUc(a,b){var c;c=0;!!a&&(c+=a.f.a/2);!!b&&(c+=b.f.a/2);return c} +function j4c(a,b){var c;c=BD(Wrb(a.d,b),23);return c?c:BD(Wrb(a.e,b),23)} +function Lzd(a){this.b=a;Fyd.call(this,a);this.a=BD(Ajd(this.b.a,4),126)} +function Uzd(a){this.b=a;$yd.call(this,a);this.a=BD(Ajd(this.b.a,4),126)} +function $Kd(a){if(!a.t){a.t=new YMd(a);vtd(new c0d(a),0,a.t)}return a.t} +function kad(){ead();return OC(GC(t1,1),Kie,103,0,[cad,bad,aad,_9c,dad])} +function Wbd(){Tbd();return OC(GC(C1,1),Kie,249,0,[Qbd,Sbd,Obd,Pbd,Rbd])} +function Q5c(){N5c();return OC(GC(e1,1),Kie,175,0,[L5c,K5c,I5c,M5c,J5c])} +function Q_c(){N_c();return OC(GC(Q_,1),Kie,316,0,[I_c,J_c,M_c,K_c,L_c])} +function _zc(){Vzc();return OC(GC(_W,1),Kie,315,0,[Uzc,Rzc,Szc,Qzc,Tzc])} +function sqc(){mqc();return OC(GC(IW,1),Kie,335,0,[iqc,hqc,kqc,lqc,jqc])} +function n$c(){k$c();return OC(GC(y_,1),Kie,355,0,[g$c,f$c,i$c,h$c,j$c])} +function _jc(){Xjc();return OC(GC(uV,1),Kie,363,0,[Tjc,Vjc,Wjc,Ujc,Sjc])} +function Ftc(){Ctc();return OC(GC(TW,1),Kie,163,0,[Btc,xtc,ytc,ztc,Atc])} +function T0d(){T0d=ccb;var a,b;R0d=(LFd(),b=new MPd,b);S0d=(a=new OJd,a)} +function yUd(a){var b;if(!a.c){b=a.r;JD(b,88)&&(a.c=BD(b,26))}return a.c} +function zc(a){a.e=3;a.d=a.Yb();if(a.e!=2){a.e=0;return true}return false} +function RC(a){var b,c,d;b=a&Eje;c=a>>22&Eje;d=a<0?Fje:0;return TC(b,c,d)} +function uy(a){var b,c,d,e;for(c=a,d=0,e=c.length;d0?ihb(a,b):lhb(a,-b)} +function Rgb(a,b){if(b==0||a.e==0){return a}return b>0?lhb(a,b):ihb(a,-b)} +function Rr(a){if(Qr(a)){a.c=a.a;return a.a.Pb()}else{throw vbb(new utb)}} +function Yac(a){var b,c;b=a.c.i;c=a.d.i;return b.k==(j0b(),e0b)&&c.k==e0b} +function kZb(a){var b;b=new UZb;tNb(b,a);yNb(b,(Nyc(),jxc),null);return b} +function hid(a,b,c){var d;return d=a.Yg(b),d>=0?a._g(d,c,true):sid(a,b,c)} +function uHb(a,b,c,d){var e;for(e=0;eb){throw vbb(new qcb(Jb(a,b,'index')))}return a} +function zhb(a,b,c,d){var e;e=KC(WD,oje,25,b,15,1);Ahb(e,a,b,c,d);return e} +function _A(a,b){var c;c=a.q.getHours()+(b/60|0);a.q.setMinutes(b);YA(a,c)} +function A$c(a,b){return $wnd.Math.min(S6c(b.a,a.d.d.c),S6c(b.b,a.d.d.c))} +function Thb(a,b){return ND(b)?b==null?krb(a.f,null):Erb(a.g,b):krb(a.f,b)} +function b1b(a){this.c=a;this.a=new olb(this.c.a);this.b=new olb(this.c.b)} +function kRb(){this.e=new Rkb;this.c=new Rkb;this.d=new Rkb;this.b=new Rkb} +function MFb(){this.g=new PFb;this.b=new PFb;this.a=new Rkb;this.k=new Rkb} +function Gjc(a,b,c){this.a=a;this.c=b;this.d=c;Ekb(b.e,this);Ekb(c.b,this)} +function wBb(a,b){fvb.call(this,b.rd(),b.qd()&-6);uCb(a);this.a=a;this.b=b} +function CBb(a,b){jvb.call(this,b.rd(),b.qd()&-6);uCb(a);this.a=a;this.b=b} +function IBb(a,b){nvb.call(this,b.rd(),b.qd()&-6);uCb(a);this.a=a;this.b=b} +function BQc(a,b,c){this.a=a;this.b=b;this.c=c;Ekb(a.t,this);Ekb(b.i,this)} +function SRc(){this.b=new Psb;this.a=new Psb;this.b=new Psb;this.a=new Psb} +function g6c(){g6c=ccb;f6c=new Lsd('org.eclipse.elk.labels.labelManager')} +function Vac(){Vac=ccb;Uac=new Msd('separateLayerConnections',(gbc(),fbc))} +function HOc(){HOc=ccb;GOc=new IOc('REGULAR',0);FOc=new IOc('CRITICAL',1)} +function _Ac(){_Ac=ccb;$Ac=new aBc('STACKED',0);ZAc=new aBc('SEQUENCED',1)} +function C_c(){C_c=ccb;B_c=new D_c('FIXED',0);A_c=new D_c('CENTER_NODE',1)} +function PHc(a,b){var c;c=VHc(a,b);a.b=new BHc(c.c.length);return OHc(a,c)} +function KAd(a,b,c){var d;++a.e;--a.f;d=BD(a.d[b].$c(c),133);return d.dd()} +function JJd(a){var b;if(!a.a){b=a.r;JD(b,148)&&(a.a=BD(b,148))}return a.a} +function poc(a){if(a.a){if(a.e){return poc(a.e)}}else{return a}return null} +function ODc(a,b){if(a.pb.p){return -1}return 0} +function pvb(a,b){uCb(b);if(a.c=0,'Initial capacity must not be negative')} +function lHb(){lHb=ccb;kHb=as((gHb(),OC(GC(pN,1),Kie,232,0,[dHb,eHb,fHb])))} +function SHb(){SHb=ccb;RHb=as((NHb(),OC(GC(sN,1),Kie,461,0,[LHb,KHb,MHb])))} +function JIb(){JIb=ccb;IIb=as((EIb(),OC(GC(zN,1),Kie,462,0,[DIb,CIb,BIb])))} +function Kyb(){Kyb=ccb;Jyb=as((Fyb(),OC(GC(xL,1),Kie,132,0,[Cyb,Dyb,Eyb])))} +function DTb(){DTb=ccb;CTb=as((yTb(),OC(GC(oP,1),Kie,379,0,[wTb,vTb,xTb])))} +function WXb(){WXb=ccb;VXb=as((RXb(),OC(GC(hQ,1),Kie,423,0,[QXb,PXb,OXb])))} +function Zpc(){Zpc=ccb;Ypc=as((Rpc(),OC(GC(GW,1),Kie,314,0,[Ppc,Opc,Qpc])))} +function gqc(){gqc=ccb;fqc=as((bqc(),OC(GC(HW,1),Kie,337,0,[$pc,aqc,_pc])))} +function Lqc(){Lqc=ccb;Kqc=as((Gqc(),OC(GC(KW,1),Kie,450,0,[Eqc,Dqc,Fqc])))} +function Kkc(){Kkc=ccb;Jkc=as((Fkc(),OC(GC(vV,1),Kie,361,0,[Ekc,Dkc,Ckc])))} +function jsc(){jsc=ccb;isc=as((esc(),OC(GC(RW,1),Kie,303,0,[csc,dsc,bsc])))} +function asc(){asc=ccb;_rc=as((Xrc(),OC(GC(QW,1),Kie,292,0,[Vrc,Wrc,Urc])))} +function Dzc(){Dzc=ccb;Czc=as((xzc(),OC(GC(ZW,1),Kie,378,0,[uzc,vzc,wzc])))} +function YAc(){YAc=ccb;XAc=as((TAc(),OC(GC(eX,1),Kie,375,0,[QAc,RAc,SAc])))} +function yAc(){yAc=ccb;xAc=as((tAc(),OC(GC(bX,1),Kie,339,0,[rAc,qAc,sAc])))} +function PAc(){PAc=ccb;OAc=as((KAc(),OC(GC(dX,1),Kie,452,0,[JAc,HAc,IAc])))} +function QBc(){QBc=ccb;PBc=as((LBc(),OC(GC(jX,1),Kie,377,0,[JBc,KBc,IBc])))} +function yBc(){yBc=ccb;xBc=as((tBc(),OC(GC(hX,1),Kie,336,0,[qBc,rBc,sBc])))} +function HBc(){HBc=ccb;GBc=as((CBc(),OC(GC(iX,1),Kie,338,0,[BBc,zBc,ABc])))} +function wGc(){wGc=ccb;vGc=as((rGc(),OC(GC(PX,1),Kie,454,0,[oGc,pGc,qGc])))} +function zVc(){zVc=ccb;yVc=as((tVc(),OC(GC(O$,1),Kie,442,0,[sVc,qVc,rVc])))} +function vWc(){vWc=ccb;uWc=as((pWc(),OC(GC(Y$,1),Kie,380,0,[mWc,nWc,oWc])))} +function EYc(){EYc=ccb;DYc=as((zYc(),OC(GC(q_,1),Kie,381,0,[xYc,yYc,wYc])))} +function yXc(){yXc=ccb;xXc=as((sXc(),OC(GC(b_,1),Kie,293,0,[qXc,rXc,pXc])))} +function b_c(){b_c=ccb;a_c=as((Y$c(),OC(GC(J_,1),Kie,437,0,[V$c,W$c,X$c])))} +function mbd(){mbd=ccb;lbd=as((hbd(),OC(GC(z1,1),Kie,334,0,[fbd,ebd,gbd])))} +function vad(){vad=ccb;uad=as((qad(),OC(GC(u1,1),Kie,272,0,[nad,oad,pad])))} +function icd(){dcd();return OC(GC(D1,1),Kie,98,0,[ccd,bcd,acd,Zbd,_bd,$bd])} +function ikd(a,b){return !a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),qAd(a.o,b)} +function NAd(a){!a.g&&(a.g=new JCd);!a.g.d&&(a.g.d=new MBd(a));return a.g.d} +function yAd(a){!a.g&&(a.g=new JCd);!a.g.a&&(a.g.a=new SBd(a));return a.g.a} +function EAd(a){!a.g&&(a.g=new JCd);!a.g.b&&(a.g.b=new GBd(a));return a.g.b} +function FAd(a){!a.g&&(a.g=new JCd);!a.g.c&&(a.g.c=new iCd(a));return a.g.c} +function A2d(a,b,c){var d,e;e=new p4d(b,a);for(d=0;dc||b=0?a._g(c,true,true):sid(a,b,true)} +function s6b(a,b){return Kdb(Edb(ED(vNb(a,(wtc(),htc)))),Edb(ED(vNb(b,htc))))} +function pUc(){pUc=ccb;oUc=b3c(b3c(g3c(new j3c,(yRc(),vRc)),(qSc(),pSc)),lSc)} +function IHc(a,b,c){var d;d=SHc(a,b,c);a.b=new BHc(d.c.length);return KHc(a,d)} +function qhe(a){if(a.b<=0)throw vbb(new utb);--a.b;a.a-=a.c.c;return meb(a.a)} +function ptd(a){var b;if(!a.a){throw vbb(new vtb)}b=a.a;a.a=Xod(a.a);return b} +function dBb(a){while(!a.a){if(!HBb(a.c,new hBb(a))){return false}}return true} +function vr(a){var b;Qb(a);if(JD(a,198)){b=BD(a,198);return b}return new wr(a)} +function r3c(a){p3c();BD(a.We((Y9c(),x9c)),174).Fc((rcd(),ocd));a.Ye(w9c,null)} +function p3c(){p3c=ccb;m3c=new v3c;o3c=new x3c;n3c=mn((Y9c(),w9c),m3c,b9c,o3c)} +function fWc(){fWc=ccb;dWc=new hWc('LEAF_NUMBER',0);eWc=new hWc('NODE_SIZE',1)} +function UMc(a,b,c){a.a=b;a.c=c;a.b.a.$b();Osb(a.d);a.e.a.c=KC(SI,Uhe,1,0,5,1)} +function yHc(a){a.a=KC(WD,oje,25,a.b+1,15,1);a.c=KC(WD,oje,25,a.b,15,1);a.d=0} +function MWb(a,b){if(a.a.ue(b.d,a.b)>0){Ekb(a.c,new dWb(b.c,b.d,a.d));a.b=b.d}} +function nud(a,b){if(a.g==null||b>=a.i)throw vbb(new $zd(b,a.i));return a.g[b]} +function pOd(a,b,c){Itd(a,c);if(c!=null&&!a.wj(c)){throw vbb(new tcb)}return c} +function KLd(a){var b;if(a.Ek()){for(b=a.i-1;b>=0;--b){qud(a,b)}}return wud(a)} +function Bwb(a){var b,c;if(!a.b){return null}c=a.b;while(b=c.a[0]){c=b}return c} +function ulb(a,b){var c,d;pCb(b);return c=(d=a.slice(0,b),PC(d,a)),c.length=b,c} +function Klb(a,b,c,d){var e;d=(ipb(),!d?fpb:d);e=a.slice(b,c);Llb(e,a,b,c,-b,d)} +function bid(a,b,c,d,e){return b<0?sid(a,c,d):BD(c,66).Nj().Pj(a,a.yh(),b,d,e)} +function hZd(a){if(JD(a,172)){return ''+BD(a,172).a}return a==null?null:fcb(a)} +function iZd(a){if(JD(a,172)){return ''+BD(a,172).a}return a==null?null:fcb(a)} +function nDb(a,b){if(b.a){throw vbb(new hz(Hke))}Qqb(a.a,b);b.a=a;!a.j&&(a.j=b)} +function qBb(a,b){nvb.call(this,b.rd(),b.qd()&-16449);uCb(a);this.a=a;this.c=b} +function Ti(a,b){var c,d;d=b/a.c.Hd().gc()|0;c=b%a.c.Hd().gc();return Mi(a,d,c)} +function NHb(){NHb=ccb;LHb=new OHb(jle,0);KHb=new OHb(gle,1);MHb=new OHb(kle,2)} +function lxb(){lxb=ccb;hxb=new mxb('All',0);ixb=new rxb;jxb=new txb;kxb=new wxb} +function zxb(){zxb=ccb;yxb=as((lxb(),OC(GC(iL,1),Kie,297,0,[hxb,ixb,jxb,kxb])))} +function uWb(){uWb=ccb;tWb=as((lWb(),OC(GC(SP,1),Kie,405,0,[hWb,kWb,iWb,jWb])))} +function ALb(){ALb=ccb;zLb=as((vLb(),OC(GC(PN,1),Kie,406,0,[uLb,rLb,sLb,tLb])))} +function WMb(){WMb=ccb;VMb=as((RMb(),OC(GC(jO,1),Kie,323,0,[OMb,NMb,PMb,QMb])))} +function WOb(){WOb=ccb;VOb=as((ROb(),OC(GC(CO,1),Kie,394,0,[OOb,NOb,POb,QOb])))} +function GRc(){GRc=ccb;FRc=as((yRc(),OC(GC(h$,1),Kie,393,0,[uRc,vRc,wRc,xRc])))} +function mbc(){mbc=ccb;lbc=as((gbc(),OC(GC(VS,1),Kie,360,0,[fbc,dbc,ebc,cbc])))} +function oXc(){oXc=ccb;nXc=as((iXc(),OC(GC(a_,1),Kie,340,0,[hXc,fXc,gXc,eXc])))} +function Fjc(){Fjc=ccb;Ejc=as((Ajc(),OC(GC(mV,1),Kie,411,0,[wjc,xjc,yjc,zjc])))} +function Pzc(){Pzc=ccb;Ozc=as((Izc(),OC(GC($W,1),Kie,197,0,[Gzc,Hzc,Fzc,Ezc])))} +function ugd(){ugd=ccb;tgd=as((pgd(),OC(GC(k2,1),Kie,396,0,[mgd,ngd,lgd,ogd])))} +function xbd(){xbd=ccb;wbd=as((rbd(),OC(GC(A1,1),Kie,285,0,[qbd,nbd,obd,pbd])))} +function Fad(){Fad=ccb;Ead=as((Aad(),OC(GC(v1,1),Kie,218,0,[zad,xad,wad,yad])))} +function Ied(){Ied=ccb;Hed=as((Ded(),OC(GC(O1,1),Kie,311,0,[Ced,zed,Bed,Aed])))} +function ydd(){ydd=ccb;xdd=as((tdd(),OC(GC(I1,1),Kie,374,0,[rdd,sdd,qdd,pdd])))} +function A9d(){A9d=ccb;Smd();x9d=Pje;w9d=Qje;z9d=new Ndb(Pje);y9d=new Ndb(Qje)} +function _qc(){_qc=ccb;$qc=new arc(ane,0);Zqc=new arc('IMPROVE_STRAIGHTNESS',1)} +function eIc(a,b){FHc();return Ekb(a,new vgd(b,meb(b.e.c.length+b.g.c.length)))} +function gIc(a,b){FHc();return Ekb(a,new vgd(b,meb(b.e.c.length+b.g.c.length)))} +function PC(a,b){HC(b)!=10&&OC(rb(b),b.hm,b.__elementTypeId$,HC(b),a);return a} +function Lkb(a,b){var c;c=Jkb(a,b,0);if(c==-1){return false}Kkb(a,c);return true} +function Zrb(a,b){var c;c=BD(Thb(a.e,b),387);if(c){jsb(c);return c.e}return null} +function Jbb(a){var b;if(Fbb(a)){b=0-a;if(!isNaN(b)){return b}}return zbb(hD(a))} +function Jkb(a,b,c){for(;c=0?fid(a,c,true,true):sid(a,b,true)} +function vgc(a,b){qgc();var c,d;c=ugc(a);d=ugc(b);return !!c&&!!d&&!omb(c.k,d.k)} +function Gqd(a,b){dld(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))} +function Hqd(a,b){eld(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))} +function Iqd(a,b){cld(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))} +function Jqd(a,b){ald(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))} +function agd(a){(!this.q?(mmb(),mmb(),kmb):this.q).Ac(!a.q?(mmb(),mmb(),kmb):a.q)} +function S2d(a,b){return JD(b,99)&&(BD(b,18).Bb&Tje)!=0?new s4d(b,a):new p4d(b,a)} +function U2d(a,b){return JD(b,99)&&(BD(b,18).Bb&Tje)!=0?new s4d(b,a):new p4d(b,a)} +function INb(a,b){HNb=new tOb;FNb=b;GNb=a;BD(GNb.b,65);KNb(GNb,HNb,null);JNb(GNb)} +function uud(a,b,c){var d;d=a.g[b];mud(a,b,a.oi(b,c));a.gi(b,c,d);a.ci();return d} +function Ftd(a,b){var c;c=a.Xc(b);if(c>=0){a.$c(c);return true}else{return false}} +function YId(a){var b;if(a.d!=a.r){b=wId(a);a.e=!!b&&b.Cj()==Bve;a.d=b}return a.e} +function fr(a,b){var c;Qb(a);Qb(b);c=false;while(b.Ob()){c=c|a.Fc(b.Pb())}return c} +function Wrb(a,b){var c;c=BD(Ohb(a.e,b),387);if(c){Yrb(a,c);return c.e}return null} +function UA(a){var b,c;b=a/60|0;c=a%60;if(c==0){return ''+b}return ''+b+':'+(''+c)} +function LAb(a,b){var c,d;Uzb(a);d=new IBb(b,a.a);c=new fBb(d);return new YAb(a,c)} +function tB(d,a){var b=d.a[a];var c=(rC(),qC)[typeof b];return c?c(b):xC(typeof b)} +function yzc(a){switch(a.g){case 0:return Ohe;case 1:return -1;default:return 0;}} +function oD(a){if(eD(a,(wD(),vD))<0){return -aD(hD(a))}return a.l+a.m*Hje+a.h*Ije} +function HC(a){return a.__elementTypeCategory$==null?10:a.__elementTypeCategory$} +function dub(a){var b;b=a.b.c.length==0?null:Ikb(a.b,0);b!=null&&fub(a,0);return b} +function uA(a,b){while(b[0]=0){++b[0]}} +function sgb(a,b){this.e=b;this.a=vgb(a);this.a<54?(this.f=Sbb(a)):(this.c=ghb(a))} +function vge(a,b,c,d){wfe();xfe.call(this,26);this.c=a;this.a=b;this.d=c;this.b=d} +function EA(a,b,c){var d,e;d=10;for(e=0;ea.a[d]&&(d=c)}return d} +function fic(a,b){var c;c=Jy(a.e.c,b.e.c);if(c==0){return Kdb(a.e.d,b.e.d)}return c} +function Ogb(a,b){if(b.e==0){return Ggb}if(a.e==0){return Ggb}return Dhb(),Ehb(a,b)} +function nCb(a,b){if(!a){throw vbb(new Wdb(DCb('Enum constant undefined: %s',b)))}} +function AWb(){AWb=ccb;xWb=new XWb;yWb=new _Wb;vWb=new dXb;wWb=new hXb;zWb=new lXb} +function UEb(){UEb=ccb;SEb=new VEb('BY_SIZE',0);TEb=new VEb('BY_SIZE_AND_SHAPE',1)} +function XRb(){XRb=ccb;VRb=new YRb('EADES',0);WRb=new YRb('FRUCHTERMAN_REINGOLD',1)} +function xqc(){xqc=ccb;vqc=new yqc('READING_DIRECTION',0);wqc=new yqc('ROTATION',1)} +function uqc(){uqc=ccb;tqc=as((mqc(),OC(GC(IW,1),Kie,335,0,[iqc,hqc,kqc,lqc,jqc])))} +function bAc(){bAc=ccb;aAc=as((Vzc(),OC(GC(_W,1),Kie,315,0,[Uzc,Rzc,Szc,Qzc,Tzc])))} +function bkc(){bkc=ccb;akc=as((Xjc(),OC(GC(uV,1),Kie,363,0,[Tjc,Vjc,Wjc,Ujc,Sjc])))} +function Htc(){Htc=ccb;Gtc=as((Ctc(),OC(GC(TW,1),Kie,163,0,[Btc,xtc,ytc,ztc,Atc])))} +function S_c(){S_c=ccb;R_c=as((N_c(),OC(GC(Q_,1),Kie,316,0,[I_c,J_c,M_c,K_c,L_c])))} +function S5c(){S5c=ccb;R5c=as((N5c(),OC(GC(e1,1),Kie,175,0,[L5c,K5c,I5c,M5c,J5c])))} +function p$c(){p$c=ccb;o$c=as((k$c(),OC(GC(y_,1),Kie,355,0,[g$c,f$c,i$c,h$c,j$c])))} +function vUb(){vUb=ccb;uUb=as((qUb(),OC(GC(zP,1),Kie,356,0,[lUb,mUb,nUb,oUb,pUb])))} +function mad(){mad=ccb;lad=as((ead(),OC(GC(t1,1),Kie,103,0,[cad,bad,aad,_9c,dad])))} +function Ybd(){Ybd=ccb;Xbd=as((Tbd(),OC(GC(C1,1),Kie,249,0,[Qbd,Sbd,Obd,Pbd,Rbd])))} +function cdd(){cdd=ccb;bdd=as((Ucd(),OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])))} +function _1c(a,b){var c;c=BD(Ohb(a.a,b),134);if(!c){c=new zNb;Rhb(a.a,b,c)}return c} +function hoc(a){var b;b=BD(vNb(a,(wtc(),usc)),305);if(b){return b.a==a}return false} +function ioc(a){var b;b=BD(vNb(a,(wtc(),usc)),305);if(b){return b.i==a}return false} +function Jub(a,b){uCb(b);Iub(a);if(a.d.Ob()){b.td(a.d.Pb());return true}return false} +function Oy(a){if(ybb(a,Ohe)>0){return Ohe}if(ybb(a,Rie)<0){return Rie}return Tbb(a)} +function Cv(a){if(a<3){Xj(a,Hie);return a+1}if(a=0&&b=-0.01&&a.a<=ple&&(a.a=0);a.b>=-0.01&&a.b<=ple&&(a.b=0);return a} +function sfb(a,b){return b==(ntb(),ntb(),mtb)?a.toLocaleLowerCase():a.toLowerCase()} +function idb(a){return ((a.i&2)!=0?'interface ':(a.i&1)!=0?'':'class ')+(fdb(a),a.o)} +function Pnd(a){var b,c;c=(b=new SSd,b);wtd((!a.q&&(a.q=new cUd(n5,a,11,10)),a.q),c)} +function Pdd(a,b){var c;c=b>0?b-1:b;return Vdd(Wdd(Xdd(Ydd(new Zdd,c),a.n),a.j),a.k)} +function u2d(a,b,c,d){var e;a.j=-1;Qxd(a,I2d(a,b,c),(Q6d(),e=BD(b,66).Mj(),e.Ok(d)))} +function VWb(a){this.g=a;this.f=new Rkb;this.a=$wnd.Math.min(this.g.c.c,this.g.d.c)} +function mDb(a){this.b=new Rkb;this.a=new Rkb;this.c=new Rkb;this.d=new Rkb;this.e=a} +function Cnc(a,b){this.a=new Lqb;this.e=new Lqb;this.b=(xzc(),wzc);this.c=a;this.b=b} +function bIb(a,b,c){$Gb.call(this);THb(this);this.a=a;this.c=c;this.b=b.d;this.f=b.e} +function yd(a){this.d=a;this.c=a.c.vc().Kc();this.b=null;this.a=null;this.e=(hs(),gs)} +function zud(a){if(a<0){throw vbb(new Wdb('Illegal Capacity: '+a))}this.g=this.ri(a)} +function avb(a,b){if(0>a||a>b){throw vbb(new scb('fromIndex: 0, toIndex: '+a+oke+b))}} +function Gs(a){var b;if(a.a==a.b.a){throw vbb(new utb)}b=a.a;a.c=b;a.a=a.a.e;return b} +function Zsb(a){var b;yCb(!!a.c);b=a.c.a;Nsb(a.d,a.c);a.b==a.c?(a.b=b):--a.a;a.c=null} +function VAb(a,b){var c;Uzb(a);c=new lBb(a,a.a.rd(),a.a.qd()|4,b);return new YAb(a,c)} +function ke(a,b){var c,d;c=BD(Hv(a.d,b),14);if(!c){return null}d=b;return a.e.pc(d,c)} +function xac(a,b){var c,d;for(d=a.Kc();d.Ob();){c=BD(d.Pb(),70);yNb(c,(wtc(),Ssc),b)}} +function t9b(a){var b;b=Edb(ED(vNb(a,(Nyc(),Zwc))));if(b<0){b=0;yNb(a,Zwc,b)}return b} +function ifc(a,b,c){var d;d=$wnd.Math.max(0,a.b/2-0.5);cfc(c,d,1);Ekb(b,new rfc(c,d))} +function NMc(a,b,c){var d;d=a.a.e[BD(b.a,10).p]-a.a.e[BD(c.a,10).p];return QD(Eeb(d))} +function iZb(a,b,c,d,e,f){var g;g=kZb(d);QZb(g,e);RZb(g,f);Rc(a.a,d,new BZb(g,b,c.f))} +function Bid(a,b){var c;c=YKd(a.Tg(),b);if(!c){throw vbb(new Wdb(ite+b+lte))}return c} +function ntd(a,b){var c;c=a;while(Xod(c)){c=Xod(c);if(c==b){return true}}return false} +function Uw(a,b){var c,d,e;d=b.a.cd();c=BD(b.a.dd(),14).gc();for(e=0;e0){a.a/=b;a.b/=b}return a} +function bKd(a){var b;if(a.w){return a.w}else{b=cKd(a);!!b&&!b.kh()&&(a.w=b);return b}} +function gZd(a){var b;if(a==null){return null}else{b=BD(a,190);return Umd(b,b.length)}} +function qud(a,b){if(a.g==null||b>=a.i)throw vbb(new $zd(b,a.i));return a.li(b,a.g[b])} +function Mmc(a){var b,c;b=a.a.d.j;c=a.c.d.j;while(b!=c){rqb(a.b,b);b=Xcd(b)}rqb(a.b,b)} +function Jmc(a){var b;for(b=0;b=14&&b<=16)));return a} +function dcb(a,b,c){var d=function(){return a.apply(d,arguments)};b.apply(d,c);return d} +function TLc(a,b,c){var d,e;d=b;do{e=Edb(a.p[d.p])+c;a.p[d.p]=e;d=a.a[d.p]}while(d!=b)} +function NQd(a,b){var c,d;d=a.a;c=OQd(a,b,null);d!=b&&!a.e&&(c=QQd(a,b,c));!!c&&c.Fi()} +function ADb(a,b){return Iy(),My(Qie),$wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)} +function Ky(a,b){Iy();My(Qie);return $wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)} +function Akc(a,b){gkc();return beb(a.b.c.length-a.e.c.length,b.b.c.length-b.e.c.length)} +function oo(a,b){return Kv(uo(a,b,Tbb(Ibb(Eie,keb(Tbb(Ibb(b==null?0:tb(b),Fie)),15)))))} +function o0b(){o0b=ccb;n0b=as((j0b(),OC(GC(NQ,1),Kie,267,0,[h0b,g0b,e0b,i0b,f0b,d0b])))} +function n8c(){n8c=ccb;m8c=as((i8c(),OC(GC(r1,1),Kie,291,0,[h8c,g8c,f8c,d8c,c8c,e8c])))} +function K7c(){K7c=ccb;J7c=as((F7c(),OC(GC(o1,1),Kie,248,0,[z7c,C7c,D7c,E7c,A7c,B7c])))} +function Fpc(){Fpc=ccb;Epc=as((Apc(),OC(GC(EW,1),Kie,227,0,[wpc,ypc,vpc,xpc,zpc,upc])))} +function Drc(){Drc=ccb;Crc=as((yrc(),OC(GC(OW,1),Kie,275,0,[wrc,trc,xrc,vrc,urc,rrc])))} +function qrc(){qrc=ccb;prc=as((lrc(),OC(GC(NW,1),Kie,274,0,[irc,hrc,krc,grc,jrc,frc])))} +function tzc(){tzc=ccb;szc=as((lzc(),OC(GC(YW,1),Kie,313,0,[jzc,hzc,fzc,gzc,kzc,izc])))} +function Yqc(){Yqc=ccb;Xqc=as((Sqc(),OC(GC(LW,1),Kie,276,0,[Nqc,Mqc,Pqc,Oqc,Rqc,Qqc])))} +function wSc(){wSc=ccb;vSc=as((qSc(),OC(GC(t$,1),Kie,327,0,[pSc,lSc,nSc,mSc,oSc,kSc])))} +function ycd(){ycd=ccb;xcd=as((rcd(),OC(GC(E1,1),Kie,273,0,[pcd,ncd,ocd,mcd,lcd,qcd])))} +function Rad(){Rad=ccb;Qad=as((Mad(),OC(GC(w1,1),Kie,312,0,[Kad,Iad,Lad,Gad,Jad,Had])))} +function Lbd(){Hbd();return OC(GC(B1,1),Kie,93,0,[zbd,ybd,Bbd,Gbd,Fbd,Ebd,Cbd,Dbd,Abd])} +function vkd(a,b){var c;c=a.a;a.a=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,0,c,a.a))} +function wkd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,1,c,a.b))} +function hmd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,3,c,a.b))} +function ald(a,b){var c;c=a.f;a.f=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,3,c,a.f))} +function cld(a,b){var c;c=a.g;a.g=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,4,c,a.g))} +function dld(a,b){var c;c=a.i;a.i=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,5,c,a.i))} +function eld(a,b){var c;c=a.j;a.j=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,6,c,a.j))} +function omd(a,b){var c;c=a.j;a.j=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,1,c,a.j))} +function imd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,4,c,a.c))} +function pmd(a,b){var c;c=a.k;a.k=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,2,c,a.k))} +function qQd(a,b){var c;c=a.d;a.d=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new mSd(a,2,c,a.d))} +function AId(a,b){var c;c=a.s;a.s=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new mSd(a,4,c,a.s))} +function DId(a,b){var c;c=a.t;a.t=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new mSd(a,5,c,a.t))} +function _Jd(a,b){var c;c=a.F;a.F=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,5,c,b))} +function izd(a,b){var c;c=BD(Ohb((pEd(),oEd),a),55);return c?c.xj(b):KC(SI,Uhe,1,b,5,1)} +function Xpd(a,b){var c,d;c=b in a.a;if(c){d=aC(a,b).he();if(d){return d.a}}return null} +function ftd(a,b){var c,d,e;c=(d=(Fhd(),e=new Jod,e),!!b&&God(d,b),d);Hod(c,a);return c} +function LLd(a,b,c){Itd(a,c);if(!a.Bk()&&c!=null&&!a.wj(c)){throw vbb(new tcb)}return c} +function Xdd(a,b){a.n=b;if(a.n){a.f=new Rkb;a.e=new Rkb}else{a.f=null;a.e=null}return a} +function ndb(a,b,c,d,e,f){var g;g=ldb(a,b);zdb(c,g);g.i=e?8:0;g.f=d;g.e=e;g.g=f;return g} +function rSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=1;this.c=a;this.a=c} +function tSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=2;this.c=a;this.a=c} +function BSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=6;this.c=a;this.a=c} +function GSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=7;this.c=a;this.a=c} +function xSd(a,b,c,d,e){this.d=b;this.j=d;this.e=e;this.o=-1;this.p=4;this.c=a;this.a=c} +function rDb(a,b){var c,d,e,f;for(d=b,e=0,f=d.length;e=0);if(ekb(a.d,a.c)<0){a.a=a.a-1&a.d.a.length-1;a.b=a.d.c}a.c=-1} +function pgb(a){if(a.a<54){return a.f<0?-1:a.f>0?1:0}return (!a.c&&(a.c=fhb(a.f)),a.c).e} +function My(a){if(!(a>=0)){throw vbb(new Wdb('tolerance ('+a+') must be >= 0'))}return a} +function n4c(){if(!f4c){f4c=new m4c;l4c(f4c,OC(GC(C0,1),Uhe,130,0,[new Z9c]))}return f4c} +function KAc(){KAc=ccb;JAc=new LAc(ole,0);HAc=new LAc('INPUT',1);IAc=new LAc('OUTPUT',2)} +function bqc(){bqc=ccb;$pc=new cqc('ARD',0);aqc=new cqc('MSD',1);_pc=new cqc('MANUAL',2)} +function rGc(){rGc=ccb;oGc=new sGc('BARYCENTER',0);pGc=new sGc(Bne,1);qGc=new sGc(Cne,2)} +function ztd(a,b){var c;c=a.gc();if(b<0||b>c)throw vbb(new Cyd(b,c));return new czd(a,b)} +function JAd(a,b){var c;if(JD(b,42)){return a.c.Mc(b)}else{c=qAd(a,b);LAd(a,b);return c}} +function $nd(a,b,c){yId(a,b);pnd(a,c);AId(a,0);DId(a,1);CId(a,true);BId(a,true);return a} +function Xj(a,b){if(a<0){throw vbb(new Wdb(b+' cannot be negative but was: '+a))}return a} +function Bt(a,b){var c,d;for(c=0,d=a.gc();c0){return BD(Ikb(c.a,d-1),10)}return null} +function Lkd(a,b){var c;c=a.k;a.k=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,2,c,a.k))} +function kmd(a,b){var c;c=a.f;a.f=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,8,c,a.f))} +function lmd(a,b){var c;c=a.i;a.i=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,7,c,a.i))} +function Hod(a,b){var c;c=a.a;a.a=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,8,c,a.a))} +function zpd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,0,c,a.b))} +function UUd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,0,c,a.b))} +function VUd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,1,c,a.c))} +function Apd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,1,c,a.c))} +function pQd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,4,c,a.c))} +function PHd(a,b){var c;c=a.d;a.d=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,1,c,a.d))} +function jKd(a,b){var c;c=a.D;a.D=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,2,c,a.D))} +function Rdd(a,b){if(a.r>0&&a.c0&&a.g!=0&&Rdd(a.i,b/a.r*a.i.d)}} +function dge(a,b,c){var d;a.b=b;a.a=c;d=(a.a&512)==512?new hee:new ude;a.c=ode(d,a.b,a.a)} +function g3d(a,b){return T6d(a.e,b)?(Q6d(),YId(b)?new R7d(b,a):new f7d(b,a)):new c8d(b,a)} +function _o(a,b){return Fv(vo(a.a,b,Tbb(Ibb(Eie,keb(Tbb(Ibb(b==null?0:tb(b),Fie)),15)))))} +function Nyb(a,b,c){return Ayb(a,new Kzb(b),new Mzb,new Ozb(c),OC(GC(xL,1),Kie,132,0,[]))} +function pAb(a){var b,c;if(0>a){return new yAb}b=a+1;c=new rAb(b,a);return new vAb(null,c)} +function umb(a,b){mmb();var c;c=new Mqb(1);ND(a)?Shb(c,a,b):jrb(c.f,a,b);return new iob(c)} +function aMb(a,b){var c,d;c=a.o+a.p;d=b.o+b.p;if(cb){b<<=1;return b>0?b:Iie}return b} +function xc(a){Ub(a.e!=3);switch(a.e){case 2:return false;case 0:return true;}return zc(a)} +function T6c(a,b){var c;if(JD(b,8)){c=BD(b,8);return a.a==c.a&&a.b==c.b}else{return false}} +function _Mb(a,b,c){var d,e,f;f=b>>5;e=b&31;d=xbb(Pbb(a.n[c][f],Tbb(Nbb(e,1))),3);return d} +function IAd(a,b){var c,d;for(d=b.vc().Kc();d.Ob();){c=BD(d.Pb(),42);HAd(a,c.cd(),c.dd())}} +function N1c(a,b){var c;c=new tOb;BD(b.b,65);BD(b.b,65);BD(b.b,65);Hkb(b.a,new T1c(a,c,b))} +function DUd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,21,c,a.b))} +function jmd(a,b){var c;c=a.d;a.d=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,11,c,a.d))} +function _Id(a,b){var c;c=a.j;a.j=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,13,c,a.j))} +function $jb(a,b,c){var d,e,f;f=a.a.length-1;for(e=a.b,d=0;d>>31}d!=0&&(a[c]=d)} +function rmb(a,b){mmb();var c,d;d=new Rkb;for(c=0;c0){this.g=this.ri(this.i+(this.i/8|0)+1);a.Qc(this.g)}} +function u3d(a,b){k2d.call(this,D9,a,b);this.b=this;this.a=S6d(a.Tg(),XKd(this.e.Tg(),this.c))} +function Ld(a,b){var c,d;uCb(b);for(d=b.vc().Kc();d.Ob();){c=BD(d.Pb(),42);a.zc(c.cd(),c.dd())}} +function G2d(a,b,c){var d;for(d=c.Kc();d.Ob();){if(!E2d(a,b,d.Pb())){return false}}return true} +function sVd(a,b,c,d,e){var f;if(c){f=bLd(b.Tg(),a.c);e=c.gh(b,-1-(f==-1?d:f),null,e)}return e} +function tVd(a,b,c,d,e){var f;if(c){f=bLd(b.Tg(),a.c);e=c.ih(b,-1-(f==-1?d:f),null,e)}return e} +function Mgb(a){var b;if(a.b==-2){if(a.e==0){b=-1}else{for(b=0;a.a[b]==0;b++);}a.b=b}return a.b} +function Z4b(a){switch(a.g){case 2:return Ucd(),Tcd;case 4:return Ucd(),zcd;default:return a;}} +function $4b(a){switch(a.g){case 1:return Ucd(),Rcd;case 3:return Ucd(),Acd;default:return a;}} +function nkc(a){var b,c,d;return a.j==(Ucd(),Acd)&&(b=pkc(a),c=uqb(b,zcd),d=uqb(b,Tcd),d||d&&c)} +function oqb(a){var b,c;b=BD(a.e&&a.e(),9);c=BD(ZBb(b,b.length),9);return new xqb(b,c,b.length)} +function l7b(a,b){Odd(b,zne,1);UGb(TGb(new YGb((a$b(),new l$b(a,false,false,new T$b)))));Qdd(b)} +function Fcb(a,b){Bcb();return ND(a)?cfb(a,GD(b)):LD(a)?Ddb(a,ED(b)):KD(a)?Dcb(a,DD(b)):a.wd(b)} +function WZc(a,b){b.q=a;a.d=$wnd.Math.max(a.d,b.r);a.b+=b.d+(a.a.c.length==0?0:a.c);Ekb(a.a,b)} +function m6c(a,b){var c,d,e,f;e=a.c;c=a.c+a.b;f=a.d;d=a.d+a.a;return b.a>e&&b.af&&b.b1||a.Ob()){++a.a;a.g=0;b=a.i;a.Ob();return b}else{throw vbb(new utb)}} +function kNc(a){fNc();var b;if(!Lpb(eNc,a)){b=new hNc;b.a=a;Opb(eNc,a,b)}return BD(Mpb(eNc,a),635)} +function Rbb(a){var b,c,d,e;e=a;d=0;if(e<0){e+=Ije;d=Fje}c=QD(e/Hje);b=QD(e-c*Hje);return TC(b,c,d)} +function Ox(a){var b,c,d;d=0;for(c=new Gqb(a.a);c.a>22);e=a.h+b.h+(d>>22);return TC(c&Eje,d&Eje,e&Fje)} +function nD(a,b){var c,d,e;c=a.l-b.l;d=a.m-b.m+(c>>22);e=a.h-b.h+(d>>22);return TC(c&Eje,d&Eje,e&Fje)} +function bdb(a){var b;if(a<128){b=(ddb(),cdb)[a];!b&&(b=cdb[a]=new Xcb(a));return b}return new Xcb(a)} +function ubb(a){var b;if(JD(a,78)){return a}b=a&&a.__java$exception;if(!b){b=new lz(a);Sz(b)}return b} +function btd(a){if(JD(a,186)){return BD(a,118)}else if(!a){throw vbb(new Heb(gue))}else{return null}} +function Zjb(a,b){if(b==null){return false}while(a.a!=a.b){if(pb(b,vkb(a))){return true}}return false} +function kib(a){if(a.a.Ob()){return true}if(a.a!=a.d){return false}a.a=new orb(a.e.f);return a.a.Ob()} +function Gkb(a,b){var c,d;c=b.Pc();d=c.length;if(d==0){return false}bCb(a.c,a.c.length,c);return true} +function Vyb(a,b,c){var d,e;for(e=b.vc().Kc();e.Ob();){d=BD(e.Pb(),42);a.yc(d.cd(),d.dd(),c)}return a} +function yac(a,b){var c,d;for(d=new olb(a.b);d.a=0,'Negative initial capacity');mCb(b>=0,'Non-positive load factor');Uhb(this)} +function _Ed(a,b,c){if(a>=128)return false;return a<64?Kbb(xbb(Nbb(1,a),c),0):Kbb(xbb(Nbb(1,a-64),b),0)} +function bOb(a,b){if(!a||!b||a==b){return false}return Jy(a.b.c,b.b.c+b.b.b)<0&&Jy(b.b.c,a.b.c+a.b.b)<0} +function I4b(a){var b,c,d;c=a.n;d=a.o;b=a.d;return new J6c(c.a-b.b,c.b-b.d,d.a+(b.b+b.c),d.b+(b.d+b.a))} +function $ic(a){var b,c,d,e;for(c=a.a,d=0,e=c.length;dd)throw vbb(new Cyd(b,d));a.hi()&&(c=Dtd(a,c));return a.Vh(b,c)} +function xNb(a,b,c){return c==null?(!a.q&&(a.q=new Lqb),Thb(a.q,b)):(!a.q&&(a.q=new Lqb),Rhb(a.q,b,c)),a} +function yNb(a,b,c){c==null?(!a.q&&(a.q=new Lqb),Thb(a.q,b)):(!a.q&&(a.q=new Lqb),Rhb(a.q,b,c));return a} +function TQb(a){var b,c;c=new kRb;tNb(c,a);yNb(c,(HSb(),FSb),a);b=new Lqb;VQb(a,c,b);UQb(a,c,b);return c} +function j6c(a){i6c();var b,c,d;c=KC(m1,nie,8,2,0,1);d=0;for(b=0;b<2;b++){d+=0.5;c[b]=r6c(d,a)}return c} +function Mic(a,b){var c,d,e,f;c=false;d=a.a[b].length;for(f=0;f>=1);return b}} +function $C(a){var b,c;c=heb(a.h);if(c==32){b=heb(a.m);return b==32?heb(a.l)+32:b+20-10}else{return c-12}} +function bkb(a){var b;b=a.a[a.b];if(b==null){return null}NC(a.a,a.b,null);a.b=a.b+1&a.a.length-1;return b} +function EDc(a){var b,c;b=a.t-a.k[a.o.p]*a.d+a.j[a.o.p]>a.f;c=a.u+a.e[a.o.p]*a.d>a.f*a.s*a.d;return b||c} +function Iwb(a,b,c){var d,e;d=new exb(b,c);e=new fxb;a.b=Gwb(a,a.b,d,e);e.b||++a.c;a.b.b=false;return e.d} +function djc(a,b,c){var d,e,f,g;g=CHc(b,c);f=0;for(e=g.Kc();e.Ob();){d=BD(e.Pb(),11);Rhb(a.c,d,meb(f++))}} +function xVb(a){var b,c;for(c=new olb(a.a.b);c.ac&&(c=a[b])}return c} +function SHc(a,b,c){var d;d=new Rkb;UHc(a,b,d,(Ucd(),zcd),true,false);UHc(a,c,d,Tcd,false,false);return d} +function crd(a,b,c){var d,e,f,g;f=null;g=b;e=Ypd(g,'labels');d=new Hrd(a,c);f=(Dqd(d.a,d.b,e),e);return f} +function j1d(a,b,c,d){var e;e=r1d(a,b,c,d);if(!e){e=i1d(a,c,d);if(!!e&&!e1d(a,b,e)){return null}}return e} +function m1d(a,b,c,d){var e;e=s1d(a,b,c,d);if(!e){e=l1d(a,c,d);if(!!e&&!e1d(a,b,e)){return null}}return e} +function Xb(a,b){var c;for(c=0;c1||b>=0&&a.b<3} +function w7c(a){var b,c,d;b=new s7c;for(d=Jsb(a,0);d.b!=d.d.c;){c=BD(Xsb(d),8);St(b,0,new g7c(c))}return b} +function qVb(a){var b,c;for(c=new olb(a.a.b);c.ad?1:0} +function NYb(a,b){if(OYb(a,b)){Rc(a.b,BD(vNb(b,(wtc(),Esc)),21),b);Dsb(a.a,b);return true}else{return false}} +function d3b(a){var b,c;b=BD(vNb(a,(wtc(),gtc)),10);if(b){c=b.c;Lkb(c.a,b);c.a.c.length==0&&Lkb(Q_b(b).b,c)}} +function syb(a){if(lyb){return KC(qL,tke,572,0,0,1)}return BD(Qkb(a.a,KC(qL,tke,572,a.a.c.length,0,1)),842)} +function mn(a,b,c,d){Vm();return new wx(OC(GC(CK,1),zie,42,0,[(Wj(a,b),new Wo(a,b)),(Wj(c,d),new Wo(c,d))]))} +function Dnd(a,b,c){var d,e;e=(d=new SSd,d);$nd(e,b,c);wtd((!a.q&&(a.q=new cUd(n5,a,11,10)),a.q),e);return e} +function Zmd(a){var b,c,d,e;e=icb(Rmd,a);c=e.length;d=KC(ZI,nie,2,c,6,1);for(b=0;b=a.b.c.length){return}aub(a,2*b+1);c=2*b+2;c=0&&a[d]===b[d];d--);return d<0?0:Gbb(xbb(a[d],Yje),xbb(b[d],Yje))?-1:1} +function UFc(a,b){var c,d;for(d=Jsb(a,0);d.b!=d.d.c;){c=BD(Xsb(d),214);if(c.e.length>0){b.td(c);c.i&&_Fc(c)}}} +function nzd(a,b){var c,d;d=BD(Ajd(a.a,4),126);c=KC($3,hve,415,b,0,1);d!=null&&$fb(d,0,c,0,d.length);return c} +function JEd(a,b){var c;c=new NEd((a.f&256)!=0,a.i,a.a,a.d,(a.f&16)!=0,a.j,a.g,b);a.e!=null||(c.c=a);return c} +function Dc(a,b){var c,d;for(d=a.Zb().Cc().Kc();d.Ob();){c=BD(d.Pb(),14);if(c.Hc(b)){return true}}return false} +function oNb(a,b,c,d,e){var f,g;for(g=c;g<=e;g++){for(f=b;f<=d;f++){if(YMb(a,f,g)){return true}}}return false} +function Tt(a,b,c){var d,e,f,g;uCb(c);g=false;f=a.Zc(b);for(e=c.Kc();e.Ob();){d=e.Pb();f.Rb(d);g=true}return g} +function Dv(a,b){var c;if(a===b){return true}else if(JD(b,83)){c=BD(b,83);return Ax(Wm(a),c.vc())}return false} +function Nhb(a,b,c){var d,e;for(e=c.Kc();e.Ob();){d=BD(e.Pb(),42);if(a.re(b,d.dd())){return true}}return false} +function Hic(a,b,c){if(!a.d[b.p][c.p]){Gic(a,b,c);a.d[b.p][c.p]=true;a.d[c.p][b.p]=true}return a.a[b.p][c.p]} +function Itd(a,b){if(!a.ai()&&b==null){throw vbb(new Wdb("The 'no null' constraint is violated"))}return b} +function $Jd(a,b){if(a.D==null&&a.B!=null){a.D=a.B;a.B=null}jKd(a,b==null?null:(uCb(b),b));!!a.C&&a.yk(null)} +function XHc(a,b){var c;if(!a||a==b||!wNb(b,(wtc(),Psc))){return false}c=BD(vNb(b,(wtc(),Psc)),10);return c!=a} +function b4d(a){switch(a.i){case 2:{return true}case 1:{return false}case -1:{++a.c}default:{return a.pl()}}} +function c4d(a){switch(a.i){case -2:{return true}case -1:{return false}case 1:{--a.c}default:{return a.ql()}}} +function Xdb(a){Zy.call(this,'The given string does not match the expected format for individual spacings.',a)} +function pgd(){pgd=ccb;mgd=new qgd('ELK',0);ngd=new qgd('JSON',1);lgd=new qgd('DOT',2);ogd=new qgd('SVG',3)} +function pWc(){pWc=ccb;mWc=new rWc(ane,0);nWc=new rWc('RADIAL_COMPACTION',1);oWc=new rWc('WEDGE_COMPACTION',2)} +function Fyb(){Fyb=ccb;Cyb=new Gyb('CONCURRENT',0);Dyb=new Gyb('IDENTITY_FINISH',1);Eyb=new Gyb('UNORDERED',2)} +function nPb(){nPb=ccb;kPb=(cPb(),bPb);jPb=new Nsd(Tle,kPb);iPb=new Lsd(Ule);lPb=new Lsd(Vle);mPb=new Lsd(Wle)} +function Occ(){Occ=ccb;Mcc=new Zcc;Ncc=new _cc;Lcc=new bdc;Kcc=new fdc;Jcc=new jdc;Icc=(uCb(Jcc),new bpb)} +function tBc(){tBc=ccb;qBc=new uBc('CONSERVATIVE',0);rBc=new uBc('CONSERVATIVE_SOFT',1);sBc=new uBc('SLOPPY',2)} +function Zad(){Zad=ccb;Xad=new q0b(15);Wad=new Osd((Y9c(),f9c),Xad);Yad=C9c;Sad=s8c;Tad=Y8c;Vad=_8c;Uad=$8c} +function o7c(a,b,c){var d,e,f;d=new Psb;for(f=Jsb(c,0);f.b!=f.d.c;){e=BD(Xsb(f),8);Dsb(d,new g7c(e))}Tt(a,b,d)} +function r7c(a){var b,c,d;b=0;d=KC(m1,nie,8,a.b,0,1);c=Jsb(a,0);while(c.b!=c.d.c){d[b++]=BD(Xsb(c),8)}return d} +function $Pd(a){var b;b=(!a.a&&(a.a=new cUd(g5,a,9,5)),a.a);if(b.i!=0){return nQd(BD(qud(b,0),678))}return null} +function Ly(a,b){var c;c=wbb(a,b);if(Gbb(Vbb(a,b),0)|Ebb(Vbb(a,c),0)){return c}return wbb(rie,Vbb(Pbb(c,63),1))} +function Yyc(a,b){var c;c=Ksd((dzc(),bzc))!=null&&b.wg()!=null?Edb(ED(b.wg()))/Edb(ED(Ksd(bzc))):1;Rhb(a.b,b,c)} +function le(a,b){var c,d;c=BD(a.d.Bc(b),14);if(!c){return null}d=a.e.hc();d.Gc(c);a.e.d-=c.gc();c.$b();return d} +function AHc(a,b){var c,d;d=a.c[b];if(d==0){return}a.c[b]=0;a.d-=d;c=b+1;while(c0){return _vb(b-1,a.a.c.length),Kkb(a.a,b-1)}else{throw vbb(new Jpb)}} +function C2c(a,b,c){if(b<0){throw vbb(new qcb(ese+b))}if(bb){throw vbb(new Wdb(xke+a+yke+b))}if(a<0||b>c){throw vbb(new scb(xke+a+zke+b+oke+c))}} +function j5c(a){if(!a.a||(a.a.i&8)==0){throw vbb(new Zdb('Enumeration class expected for layout option '+a.f))}} +function vud(a){var b;++a.j;if(a.i==0){a.g=null}else if(a.iRqe?a-c>Rqe:c-a>Rqe} +function pHb(a,b){if(!a){return 0}if(b&&!a.j){return 0}if(JD(a,124)){if(BD(a,124).a.b==0){return 0}}return a.Re()} +function qHb(a,b){if(!a){return 0}if(b&&!a.k){return 0}if(JD(a,124)){if(BD(a,124).a.a==0){return 0}}return a.Se()} +function fhb(a){Hgb();if(a<0){if(a!=-1){return new Tgb(-1,-a)}return Bgb}else return a<=10?Dgb[QD(a)]:new Tgb(1,a)} +function xC(a){rC();throw vbb(new MB("Unexpected typeof result '"+a+"'; please report this bug to the GWT team"))} +function lz(a){jz();Py(this);Ry(this);this.e=a;Sy(this,a);this.g=a==null?Xhe:fcb(a);this.a='';this.b=a;this.a=''} +function F$c(){this.a=new G$c;this.f=new I$c(this);this.b=new K$c(this);this.i=new M$c(this);this.e=new O$c(this)} +function ss(){rs.call(this,new _rb(Cv(16)));Xj(2,mie);this.b=2;this.a=new Ms(null,null,0,null);As(this.a,this.a)} +function xzc(){xzc=ccb;uzc=new zzc('DUMMY_NODE_OVER',0);vzc=new zzc('DUMMY_NODE_UNDER',1);wzc=new zzc('EQUAL',2)} +function LUb(){LUb=ccb;JUb=Fx(OC(GC(t1,1),Kie,103,0,[(ead(),aad),bad]));KUb=Fx(OC(GC(t1,1),Kie,103,0,[dad,_9c]))} +function VQc(a){return (Ucd(),Lcd).Hc(a.j)?Edb(ED(vNb(a,(wtc(),qtc)))):l7c(OC(GC(m1,1),nie,8,0,[a.i.n,a.n,a.a])).b} +function DOb(a){var b,c,d,e;d=a.b.a;for(c=d.a.ec().Kc();c.Ob();){b=BD(c.Pb(),561);e=new MPb(b,a.e,a.f);Ekb(a.g,e)}} +function yId(a,b){var c,d,e;d=a.nk(b,null);e=null;if(b){e=(LFd(),c=new UQd,c);NQd(e,a.r)}d=xId(a,e,d);!!d&&d.Fi()} +function VFc(a,b){var c,d;d=Cub(a.d,1)!=0;c=true;while(c){c=false;c=b.c.Tf(b.e,d);c=c|dGc(a,b,d,false);d=!d}$Fc(a)} +function wZc(a,b){var c,d,e;d=false;c=b.q.d;if(b.de){$Zc(b.q,e);d=c!=b.q.d}}return d} +function PVc(a,b){var c,d,e,f,g,h,i,j;i=b.i;j=b.j;d=a.f;e=d.i;f=d.j;g=i-e;h=j-f;c=$wnd.Math.sqrt(g*g+h*h);return c} +function Rnd(a,b){var c,d;d=jid(a);if(!d){!And&&(And=new lUd);c=(IEd(),PEd(b));d=new s0d(c);wtd(d.Vk(),a)}return d} +function Sc(a,b){var c,d;c=BD(a.c.Bc(b),14);if(!c){return a.jc()}d=a.hc();d.Gc(c);a.d-=c.gc();c.$b();return a.mc(d)} +function j7c(a,b){var c;for(c=0;c=a.c.b:a.a<=a.c.b)){throw vbb(new utb)}b=a.a;a.a+=a.c.c;++a.b;return meb(b)} +function BWb(a){var b;b=new VWb(a);rXb(a.a,zWb,new amb(OC(GC(bQ,1),Uhe,369,0,[b])));!!b.d&&Ekb(b.f,b.d);return b.f} +function Z1b(a){var b;b=new q_b(a.a);tNb(b,a);yNb(b,(wtc(),$sc),a);b.o.a=a.g;b.o.b=a.f;b.n.a=a.i;b.n.b=a.j;return b} +function A9b(a,b,c,d){var e,f;for(f=a.Kc();f.Ob();){e=BD(f.Pb(),70);e.n.a=b.a+(d.a-e.o.a)/2;e.n.b=b.b;b.b+=e.o.b+c}} +function UDb(a,b,c){var d,e;for(e=b.a.a.ec().Kc();e.Ob();){d=BD(e.Pb(),57);if(VDb(a,d,c)){return true}}return false} +function JDc(a){var b,c;for(c=new olb(a.r);c.a=0?b:-b;while(d>0){if(d%2==0){c*=c;d=d/2|0}else{e*=c;d-=1}}return b<0?1/e:e} +function y6c(a,b){var c,d,e;e=1;c=a;d=b>=0?b:-b;while(d>0){if(d%2==0){c*=c;d=d/2|0}else{e*=c;d-=1}}return b<0?1/e:e} +function sAd(a){var b,c,d,e;if(a!=null){for(c=0;c0){c=BD(Ikb(a.a,a.a.c.length-1),570);if(NYb(c,b)){return}}Ekb(a.a,new PYb(b))} +function $gc(a){Hgc();var b,c;b=a.d.c-a.e.c;c=BD(a.g,145);Hkb(c.b,new shc(b));Hkb(c.c,new uhc(b));reb(c.i,new whc(b))} +function gic(a){var b;b=new Ufb;b.a+='VerticalSegment ';Pfb(b,a.e);b.a+=' ';Qfb(b,Eb(new Gb,new olb(a.k)));return b.a} +function u4c(a){var b;b=BD(Wrb(a.c.c,''),229);if(!b){b=new W3c(d4c(c4c(new e4c,''),'Other'));Xrb(a.c.c,'',b)}return b} +function qnd(a){var b;if((a.Db&64)!=0)return Eid(a);b=new Jfb(Eid(a));b.a+=' (name: ';Efb(b,a.zb);b.a+=')';return b.a} +function Jnd(a,b,c){var d,e;e=a.sb;a.sb=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,4,e,b);!c?(c=d):c.Ei(d)}return c} +function _ic(a,b){var c,d,e;c=0;for(e=V_b(a,b).Kc();e.Ob();){d=BD(e.Pb(),11);c+=vNb(d,(wtc(),gtc))!=null?1:0}return c} +function vPc(a,b,c){var d,e,f;d=0;for(f=Jsb(a,0);f.b!=f.d.c;){e=Edb(ED(Xsb(f)));if(e>c){break}else e>=b&&++d}return d} +function RTd(a,b,c){var d,e;d=new pSd(a.e,3,13,null,(e=b.c,e?e:(jGd(),YFd)),HLd(a,b),false);!c?(c=d):c.Ei(d);return c} +function STd(a,b,c){var d,e;d=new pSd(a.e,4,13,(e=b.c,e?e:(jGd(),YFd)),null,HLd(a,b),false);!c?(c=d):c.Ei(d);return c} +function zId(a,b,c){var d,e;e=a.r;a.r=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,8,e,a.r);!c?(c=d):c.Ei(d)}return c} +function o1d(a,b){var c,d;c=BD(b,676);d=c.vk();!d&&c.wk(d=JD(b,88)?new C1d(a,BD(b,26)):new O1d(a,BD(b,148)));return d} +function kud(a,b,c){var d;a.qi(a.i+1);d=a.oi(b,c);b!=a.i&&$fb(a.g,b,a.g,b+1,a.i-b);NC(a.g,b,d);++a.i;a.bi(b,c);a.ci()} +function vwb(a,b){var c;if(b.a){c=b.a.a.length;!a.a?(a.a=new Wfb(a.d)):Qfb(a.a,a.b);Ofb(a.a,b.a,b.d.length,c)}return a} +function __d(a,b){var c,d,e,f;b.vi(a.a);f=BD(Ajd(a.a,8),1936);if(f!=null){for(c=f,d=0,e=c.length;dc){throw vbb(new qcb(xke+a+zke+b+', size: '+c))}if(a>b){throw vbb(new Wdb(xke+a+yke+b))}} +function eid(a,b,c){if(b<0){vid(a,c)}else{if(!c.Ij()){throw vbb(new Wdb(ite+c.ne()+jte))}BD(c,66).Nj().Vj(a,a.yh(),b)}} +function Jlb(a,b,c,d,e,f,g,h){var i;i=c;while(f=d||b=65&&a<=70){return a-65+10}if(a>=97&&a<=102){return a-97+10}if(a>=48&&a<=57){return a-48}return 0} +function QHd(a){var b;if((a.Db&64)!=0)return Eid(a);b=new Jfb(Eid(a));b.a+=' (source: ';Efb(b,a.d);b.a+=')';return b.a} +function OQd(a,b,c){var d,e;e=a.a;a.a=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,5,e,a.a);!c?(c=d):Qwd(c,d)}return c} +function BId(a,b){var c;c=(a.Bb&256)!=0;b?(a.Bb|=256):(a.Bb&=-257);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,2,c,b))} +function eLd(a,b){var c;c=(a.Bb&256)!=0;b?(a.Bb|=256):(a.Bb&=-257);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,8,c,b))} +function LPd(a,b){var c;c=(a.Bb&256)!=0;b?(a.Bb|=256):(a.Bb&=-257);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,8,c,b))} +function CId(a,b){var c;c=(a.Bb&512)!=0;b?(a.Bb|=512):(a.Bb&=-513);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,3,c,b))} +function fLd(a,b){var c;c=(a.Bb&512)!=0;b?(a.Bb|=512):(a.Bb&=-513);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,9,c,b))} +function N7d(a,b){var c;if(a.b==-1&&!!a.a){c=a.a.Gj();a.b=!c?bLd(a.c.Tg(),a.a):a.c.Xg(a.a.aj(),c)}return a.c.Og(a.b,b)} +function meb(a){var b,c;if(a>-129&&a<128){b=a+128;c=(oeb(),neb)[b];!c&&(c=neb[b]=new _db(a));return c}return new _db(a)} +function Web(a){var b,c;if(a>-129&&a<128){b=a+128;c=(Yeb(),Xeb)[b];!c&&(c=Xeb[b]=new Qeb(a));return c}return new Qeb(a)} +function L5b(a){var b,c;b=a.k;if(b==(j0b(),e0b)){c=BD(vNb(a,(wtc(),Hsc)),61);return c==(Ucd(),Acd)||c==Rcd}return false} +function i1d(a,b,c){var d,e,f;f=(e=nUd(a.b,b),e);if(f){d=BD(V1d(p1d(a,f),''),26);if(d){return r1d(a,d,b,c)}}return null} +function l1d(a,b,c){var d,e,f;f=(e=nUd(a.b,b),e);if(f){d=BD(V1d(p1d(a,f),''),26);if(d){return s1d(a,d,b,c)}}return null} +function cTd(a,b){var c,d;for(d=new Fyd(a);d.e!=d.i.gc();){c=BD(Dyd(d),138);if(PD(b)===PD(c)){return true}}return false} +function vtd(a,b,c){var d;d=a.gc();if(b>d)throw vbb(new Cyd(b,d));if(a.hi()&&a.Hc(c)){throw vbb(new Wdb(kue))}a.Xh(b,c)} +function iqd(a,b){var c;c=oo(a.i,b);if(c==null){throw vbb(new cqd('Node did not exist in input.'))}Yqd(b,c);return null} +function $hd(a,b){var c;c=YKd(a,b);if(JD(c,322)){return BD(c,34)}throw vbb(new Wdb(ite+b+"' is not a valid attribute"))} +function V2d(a,b,c){var d,e;e=JD(b,99)&&(BD(b,18).Bb&Tje)!=0?new s4d(b,a):new p4d(b,a);for(d=0;db){return 1}if(a==b){return a==0?Kdb(1/a,1/b):0}return isNaN(a)?isNaN(b)?0:1:-1} +function f4b(a,b){Odd(b,'Sort end labels',1);MAb(JAb(LAb(new YAb(null,new Kub(a.b,16)),new q4b),new s4b),new u4b);Qdd(b)} +function Wxd(a,b,c){var d,e;if(a.ej()){e=a.fj();d=sud(a,b,c);a.$i(a.Zi(7,meb(c),d,b,e));return d}else{return sud(a,b,c)}} +function vAd(a,b){var c,d,e;if(a.d==null){++a.e;--a.f}else{e=b.cd();c=b.Sh();d=(c&Ohe)%a.d.length;KAd(a,d,xAd(a,d,c,e))}} +function ZId(a,b){var c;c=(a.Bb&zte)!=0;b?(a.Bb|=zte):(a.Bb&=-1025);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,10,c,b))} +function dJd(a,b){var c;c=(a.Bb&Rje)!=0;b?(a.Bb|=Rje):(a.Bb&=-4097);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,12,c,b))} +function eJd(a,b){var c;c=(a.Bb&Cve)!=0;b?(a.Bb|=Cve):(a.Bb&=-8193);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,15,c,b))} +function fJd(a,b){var c;c=(a.Bb&Dve)!=0;b?(a.Bb|=Dve):(a.Bb&=-2049);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,11,c,b))} +function jOb(a,b){var c;c=Kdb(a.b.c,b.b.c);if(c!=0){return c}c=Kdb(a.a.a,b.a.a);if(c!=0){return c}return Kdb(a.a.b,b.a.b)} +function jqd(a,b){var c;c=Ohb(a.k,b);if(c==null){throw vbb(new cqd('Port did not exist in input.'))}Yqd(b,c);return null} +function k6d(a){var b,c;for(c=l6d(bKd(a)).Kc();c.Ob();){b=GD(c.Pb());if(Dmd(a,b)){return uFd((tFd(),sFd),b)}}return null} +function n3d(a,b){var c,d,e,f,g;g=S6d(a.e.Tg(),b);f=0;c=BD(a.g,119);for(e=0;e>10)+Uje&aje;b[1]=(a&1023)+56320&aje;return zfb(b,0,b.length)} +function a_b(a){var b,c;c=BD(vNb(a,(Nyc(),Lwc)),103);if(c==(ead(),cad)){b=Edb(ED(vNb(a,owc)));return b>=1?bad:_9c}return c} +function rec(a){switch(BD(vNb(a,(Nyc(),Swc)),218).g){case 1:return new Fmc;case 3:return new wnc;default:return new zmc;}} +function Uzb(a){if(a.c){Uzb(a.c)}else if(a.d){throw vbb(new Zdb("Stream already terminated, can't be modified or used"))}} +function Mkd(a){var b;if((a.Db&64)!=0)return Eid(a);b=new Jfb(Eid(a));b.a+=' (identifier: ';Efb(b,a.k);b.a+=')';return b.a} +function ctd(a,b,c){var d,e;d=(Fhd(),e=new xkd,e);vkd(d,b);wkd(d,c);!!a&&wtd((!a.a&&(a.a=new xMd(y2,a,5)),a.a),d);return d} +function ttb(a,b,c,d){var e,f;uCb(d);uCb(c);e=a.xc(b);f=e==null?c:Myb(BD(e,15),BD(c,14));f==null?a.Bc(b):a.zc(b,f);return f} +function pqb(a){var b,c,d,e;c=(b=BD(gdb((d=a.gm,e=d.f,e==CI?d:e)),9),new xqb(b,BD(_Bb(b,b.length),9),0));rqb(c,a);return c} +function hDc(a,b,c){var d,e;for(e=a.a.ec().Kc();e.Ob();){d=BD(e.Pb(),10);if(Be(c,BD(Ikb(b,d.p),14))){return d}}return null} +function Db(b,c,d){var e;try{Cb(b,c,d)}catch(a){a=ubb(a);if(JD(a,597)){e=a;throw vbb(new ycb(e))}else throw vbb(a)}return c} +function Qbb(a,b){var c;if(Fbb(a)&&Fbb(b)){c=a-b;if(Kje>1;a.k=c-1>>1} +function Gub(){zub();var a,b,c;c=yub+++Date.now();a=QD($wnd.Math.floor(c*lke))&nke;b=QD(c-a*mke);this.a=a^1502;this.b=b^kke} +function O_b(a){var b,c,d;b=new Rkb;for(d=new olb(a.j);d.a3.4028234663852886E38){return Pje}else if(b<-3.4028234663852886E38){return Qje}return b} +function aeb(a){a-=a>>1&1431655765;a=(a>>2&858993459)+(a&858993459);a=(a>>4)+a&252645135;a+=a>>8;a+=a>>16;return a&63} +function Ev(a){var b,c,d,e;b=new cq(a.Hd().gc());e=0;for(d=vr(a.Hd().Kc());d.Ob();){c=d.Pb();bq(b,c,meb(e++))}return fn(b.a)} +function Uyb(a,b){var c,d,e;e=new Lqb;for(d=b.vc().Kc();d.Ob();){c=BD(d.Pb(),42);Rhb(e,c.cd(),Yyb(a,BD(c.dd(),15)))}return e} +function EZc(a,b){a.n.c.length==0&&Ekb(a.n,new VZc(a.s,a.t,a.i));Ekb(a.b,b);QZc(BD(Ikb(a.n,a.n.c.length-1),211),b);GZc(a,b)} +function LFb(a){if(a.c!=a.b.b||a.i!=a.g.b){a.a.c=KC(SI,Uhe,1,0,5,1);Gkb(a.a,a.b);Gkb(a.a,a.g);a.c=a.b.b;a.i=a.g.b}return a.a} +function Ycc(a,b){var c,d,e;e=0;for(d=BD(b.Kb(a),20).Kc();d.Ob();){c=BD(d.Pb(),17);Ccb(DD(vNb(c,(wtc(),ltc))))||++e}return e} +function efc(a,b){var c,d,e;d=tgc(b);e=Edb(ED(pBc(d,(Nyc(),lyc))));c=$wnd.Math.max(0,e/2-0.5);cfc(b,c,1);Ekb(a,new Dfc(b,c))} +function Ctc(){Ctc=ccb;Btc=new Dtc(ane,0);xtc=new Dtc('FIRST',1);ytc=new Dtc(Gne,2);ztc=new Dtc('LAST',3);Atc=new Dtc(Hne,4)} +function Aad(){Aad=ccb;zad=new Bad(ole,0);xad=new Bad('POLYLINE',1);wad=new Bad('ORTHOGONAL',2);yad=new Bad('SPLINES',3)} +function zYc(){zYc=ccb;xYc=new AYc('ASPECT_RATIO_DRIVEN',0);yYc=new AYc('MAX_SCALE_DRIVEN',1);wYc=new AYc('AREA_DRIVEN',2)} +function Y$c(){Y$c=ccb;V$c=new Z$c('P1_STRUCTURE',0);W$c=new Z$c('P2_PROCESSING_ORDER',1);X$c=new Z$c('P3_EXECUTION',2)} +function tVc(){tVc=ccb;sVc=new uVc('OVERLAP_REMOVAL',0);qVc=new uVc('COMPACTION',1);rVc=new uVc('GRAPH_SIZE_CALCULATION',2)} +function Jy(a,b){Iy();return My(Qie),$wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b))} +function yOc(a,b){var c,d;c=Jsb(a,0);while(c.b!=c.d.c){d=Gdb(ED(Xsb(c)));if(d==b){return}else if(d>b){Ysb(c);break}}Vsb(c,b)} +function t4c(a,b){var c,d,e,f,g;c=b.f;Xrb(a.c.d,c,b);if(b.g!=null){for(e=b.g,f=0,g=e.length;fb&&d.ue(a[f-1],a[f])>0;--f){g=a[f];NC(a,f,a[f-1]);NC(a,f-1,g)}}} +function did(a,b,c,d){if(b<0){uid(a,c,d)}else{if(!c.Ij()){throw vbb(new Wdb(ite+c.ne()+jte))}BD(c,66).Nj().Tj(a,a.yh(),b,d)}} +function xFb(a,b){if(b==a.d){return a.e}else if(b==a.e){return a.d}else{throw vbb(new Wdb('Node '+b+' not part of edge '+a))}} +function iEb(a,b){switch(b.g){case 2:return a.b;case 1:return a.c;case 4:return a.d;case 3:return a.a;default:return false;}} +function GVb(a,b){switch(b.g){case 2:return a.b;case 1:return a.c;case 4:return a.d;case 3:return a.a;default:return false;}} +function Xkd(a,b,c,d){switch(b){case 3:return a.f;case 4:return a.g;case 5:return a.i;case 6:return a.j;}return Ekd(a,b,c,d)} +function Ljc(a){if(a.k!=(j0b(),h0b)){return false}return FAb(new YAb(null,new Lub(new Sr(ur(U_b(a).a.Kc(),new Sq)))),new Mjc)} +function MEd(a){if(a.e==null){return a}else !a.c&&(a.c=new NEd((a.f&256)!=0,a.i,a.a,a.d,(a.f&16)!=0,a.j,a.g,null));return a.c} +function VC(a,b){if(a.h==Gje&&a.m==0&&a.l==0){b&&(QC=TC(0,0,0));return SC((wD(),uD))}b&&(QC=TC(a.l,a.m,a.h));return TC(0,0,0)} +function fcb(a){var b;if(Array.isArray(a)&&a.im===gcb){return hdb(rb(a))+'@'+(b=tb(a)>>>0,b.toString(16))}return a.toString()} +function Rpb(a){var b;this.a=(b=BD(a.e&&a.e(),9),new xqb(b,BD(_Bb(b,b.length),9),0));this.b=KC(SI,Uhe,1,this.a.a.length,5,1)} +function _Ob(a){var b,c,d;this.a=new zsb;for(d=new olb(a);d.a0&&(BCb(b-1,a.length),a.charCodeAt(b-1)==58)&&!OEd(a,CEd,DEd)} +function OEd(a,b,c){var d,e;for(d=0,e=a.length;d=e){return b.c+c}}return b.c+b.b.gc()} +function NCd(a,b){LCd();var c,d,e,f;d=KLd(a);e=b;Klb(d,0,d.length,e);for(c=0;c0){d+=e;++c}}c>1&&(d+=a.d*(c-1));return d} +function Htd(a){var b,c,d;d=new Hfb;d.a+='[';for(b=0,c=a.gc();b0&&this.b>0&&q$c(this.c,this.b,this.a)} +function ezc(a){dzc();this.c=Ou(OC(GC(h0,1),Uhe,831,0,[Uyc]));this.b=new Lqb;this.a=a;Rhb(this.b,bzc,1);Hkb(czc,new Xed(this))} +function I2c(a,b){var c;if(a.d){if(Mhb(a.b,b)){return BD(Ohb(a.b,b),51)}else{c=b.Kf();Rhb(a.b,b,c);return c}}else{return b.Kf()}} +function Kgb(a,b){var c;if(PD(a)===PD(b)){return true}if(JD(b,91)){c=BD(b,91);return a.e==c.e&&a.d==c.d&&Lgb(a,c.a)}return false} +function Zcd(a){Ucd();switch(a.g){case 4:return Acd;case 1:return zcd;case 3:return Rcd;case 2:return Tcd;default:return Scd;}} +function Ykd(a,b){switch(b){case 3:return a.f!=0;case 4:return a.g!=0;case 5:return a.i!=0;case 6:return a.j!=0;}return Hkd(a,b)} +function gWc(a){switch(a.g){case 0:return new FXc;case 1:return new IXc;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}} +function QUc(a){switch(a.g){case 0:return new CXc;case 1:return new MXc;default:throw vbb(new Wdb(Dne+(a.f!=null?a.f:''+a.g)));}} +function b1c(a){switch(a.g){case 0:return new s1c;case 1:return new w1c;default:throw vbb(new Wdb(Mre+(a.f!=null?a.f:''+a.g)));}} +function qWc(a){switch(a.g){case 1:return new SVc;case 2:return new KVc;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}} +function ryb(a){var b,c;if(a.b){return a.b}c=lyb?null:a.d;while(c){b=lyb?null:c.b;if(b){return b}c=lyb?null:c.d}return $xb(),Zxb} +function hhb(a){var b,c,d;if(a.e==0){return 0}b=a.d<<5;c=a.a[a.d-1];if(a.e<0){d=Mgb(a);if(d==a.d-1){--c;c=c|0}}b-=heb(c);return b} +function bhb(a){var b,c,d;if(a>5;b=a&31;d=KC(WD,oje,25,c+1,15,1);d[c]=1<3){e*=10;--f}a=(a+(e>>1))/e|0}d.i=a;return true} +function XUb(a){LUb();return Bcb(),GVb(BD(a.a,81).j,BD(a.b,103))||BD(a.a,81).d.e!=0&&GVb(BD(a.a,81).j,BD(a.b,103))?true:false} +function s3c(a){p3c();if(BD(a.We((Y9c(),b9c)),174).Hc((Idd(),Gdd))){BD(a.We(x9c),174).Fc((rcd(),qcd));BD(a.We(b9c),174).Mc(Gdd)}} +function Gxd(a,b){var c,d;if(!b){return false}else{for(c=0;c=0;--d){b=c[d];for(e=0;e>1;this.k=b-1>>1} +function r3b(a,b){Odd(b,'End label post-processing',1);MAb(JAb(LAb(new YAb(null,new Kub(a.b,16)),new w3b),new y3b),new A3b);Qdd(b)} +function NLc(a,b,c){var d,e;d=Edb(a.p[b.i.p])+Edb(a.d[b.i.p])+b.n.b+b.a.b;e=Edb(a.p[c.i.p])+Edb(a.d[c.i.p])+c.n.b+c.a.b;return e-d} +function xhb(a,b,c){var d,e;d=xbb(c,Yje);for(e=0;ybb(d,0)!=0&&e0&&(BCb(0,b.length),b.charCodeAt(0)==43)?b.substr(1):b))} +function T9d(a){var b;return a==null?null:new Ygb((b=Qge(a,true),b.length>0&&(BCb(0,b.length),b.charCodeAt(0)==43)?b.substr(1):b))} +function xud(a,b){var c;if(a.i>0){if(b.lengtha.i&&NC(b,a.i,null);return b} +function Sxd(a,b,c){var d,e,f;if(a.ej()){d=a.i;f=a.fj();kud(a,d,b);e=a.Zi(3,null,b,d,f);!c?(c=e):c.Ei(e)}else{kud(a,a.i,b)}return c} +function HMd(a,b,c){var d,e;d=new pSd(a.e,4,10,(e=b.c,JD(e,88)?BD(e,26):(jGd(),_Fd)),null,HLd(a,b),false);!c?(c=d):c.Ei(d);return c} +function GMd(a,b,c){var d,e;d=new pSd(a.e,3,10,null,(e=b.c,JD(e,88)?BD(e,26):(jGd(),_Fd)),HLd(a,b),false);!c?(c=d):c.Ei(d);return c} +function _Jb(a){$Jb();var b;b=new g7c(BD(a.e.We((Y9c(),_8c)),8));if(a.B.Hc((Idd(),Bdd))){b.a<=0&&(b.a=20);b.b<=0&&(b.b=20)}return b} +function Lzc(a){Izc();var b;(!a.q?(mmb(),mmb(),kmb):a.q)._b((Nyc(),Cxc))?(b=BD(vNb(a,Cxc),197)):(b=BD(vNb(Q_b(a),Dxc),197));return b} +function pBc(a,b){var c,d;d=null;if(wNb(a,(Nyc(),qyc))){c=BD(vNb(a,qyc),94);c.Xe(b)&&(d=c.We(b))}d==null&&(d=vNb(Q_b(a),b));return d} +function Ze(a,b){var c,d,e;if(JD(b,42)){c=BD(b,42);d=c.cd();e=Hv(a.Rc(),d);return Hb(e,c.dd())&&(e!=null||a.Rc()._b(d))}return false} +function qAd(a,b){var c,d,e;if(a.f>0){a.qj();d=b==null?0:tb(b);e=(d&Ohe)%a.d.length;c=xAd(a,e,d,b);return c!=-1}else{return false}} +function AAd(a,b){var c,d,e;if(a.f>0){a.qj();d=b==null?0:tb(b);e=(d&Ohe)%a.d.length;c=wAd(a,e,d,b);if(c){return c.dd()}}return null} +function R2d(a,b){var c,d,e,f;f=S6d(a.e.Tg(),b);c=BD(a.g,119);for(e=0;e1?Mbb(Nbb(b.a[1],32),xbb(b.a[0],Yje)):xbb(b.a[0],Yje),Sbb(Ibb(b.e,c))))} +function Hbb(a,b){var c;if(Fbb(a)&&Fbb(b)){c=a%b;if(Kje>5;b&=31;e=a.d+c+(b==0?0:1);d=KC(WD,oje,25,e,15,1);jhb(d,a.a,c,b);f=new Vgb(a.e,e,d);Jgb(f);return f} +function Ofe(a,b,c){var d,e;d=BD(Phb(Zee,b),117);e=BD(Phb($ee,b),117);if(c){Shb(Zee,a,d);Shb($ee,a,e)}else{Shb($ee,a,d);Shb(Zee,a,e)}} +function Cwb(a,b,c){var d,e,f;e=null;f=a.b;while(f){d=a.a.ue(b,f.d);if(c&&d==0){return f}if(d>=0){f=f.a[1]}else{e=f;f=f.a[0]}}return e} +function Dwb(a,b,c){var d,e,f;e=null;f=a.b;while(f){d=a.a.ue(b,f.d);if(c&&d==0){return f}if(d<=0){f=f.a[0]}else{e=f;f=f.a[1]}}return e} +function Nic(a,b,c,d){var e,f,g;e=false;if(fjc(a.f,c,d)){ijc(a.f,a.a[b][c],a.a[b][d]);f=a.a[b];g=f[d];f[d]=f[c];f[c]=g;e=true}return e} +function QHc(a,b,c,d,e){var f,g,h;g=e;while(b.b!=b.c){f=BD(fkb(b),10);h=BD(V_b(f,d).Xb(0),11);a.d[h.p]=g++;c.c[c.c.length]=h}return g} +function hBc(a,b,c){var d,e,f,g,h;g=a.k;h=b.k;d=c[g.g][h.g];e=ED(pBc(a,d));f=ED(pBc(b,d));return $wnd.Math.max((uCb(e),e),(uCb(f),f))} +function zZc(a,b,c){var d,e,f,g;d=c/a.c.length;e=0;for(g=new olb(a);g.a2000){yz=a;zz=$wnd.setTimeout(Iz,10)}}if(xz++==0){Lz((Kz(),Jz));return true}return false} +function wCc(a,b){var c,d,e;for(d=new Sr(ur(U_b(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),17);e=c.d.i;if(e.c==b){return false}}return true} +function Ek(b,c){var d,e;if(JD(c,245)){e=BD(c,245);try{d=b.vd(e);return d==0}catch(a){a=ubb(a);if(!JD(a,205))throw vbb(a)}}return false} +function Xz(){if(Error.stackTraceLimit>0){$wnd.Error.stackTraceLimit=Error.stackTraceLimit=64;return true}return 'stack' in new Error} +function BDb(a,b){return Iy(),Iy(),My(Qie),($wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b)))>0} +function DDb(a,b){return Iy(),Iy(),My(Qie),($wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b)))<0} +function CDb(a,b){return Iy(),Iy(),My(Qie),($wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b)))<=0} +function ydb(a,b){var c=0;while(!b[c]||b[c]==''){c++}var d=b[c++];for(;cWje){return c.fh()}d=c.Zg();if(!!d||c==a){break}}}return d} +function fvd(a){evd();if(JD(a,156)){return BD(Ohb(cvd,hK),288).vg(a)}if(Mhb(cvd,rb(a))){return BD(Ohb(cvd,rb(a)),288).vg(a)}return null} +function fZd(a){if(efb(kse,a)){return Bcb(),Acb}else if(efb(lse,a)){return Bcb(),zcb}else{throw vbb(new Wdb('Expecting true or false'))}} +function uDc(a,b){if(b.c==a){return b.d}else if(b.d==a){return b.c}throw vbb(new Wdb('Input edge is not connected to the input port.'))} +function Igb(a,b){if(a.e>b.e){return 1}if(a.eb.d){return a.e}if(a.d=48&&a<48+$wnd.Math.min(10,10)){return a-48}if(a>=97&&a<97){return a-97+10}if(a>=65&&a<65){return a-65+10}return -1} +function Ue(a,b){var c;if(PD(b)===PD(a)){return true}if(!JD(b,21)){return false}c=BD(b,21);if(c.gc()!=a.gc()){return false}return a.Ic(c)} +function ekb(a,b){var c,d,e,f;d=a.a.length-1;c=b-a.b&d;f=a.c-b&d;e=a.c-a.b&d;mkb(c=f){hkb(a,b);return -1}else{ikb(a,b);return 1}} +function lA(a,b){var c,d;c=(BCb(b,a.length),a.charCodeAt(b));d=b+1;while(db.e){return 1}else if(a.fb.f){return 1}return tb(a)-tb(b)} +function efb(a,b){uCb(a);if(b==null){return false}if(dfb(a,b)){return true}return a.length==b.length&&dfb(a.toLowerCase(),b.toLowerCase())} +function x6d(a,b){var c,d,e,f;for(d=0,e=b.gc();d0&&ybb(a,128)<0){b=Tbb(a)+128;c=(Ceb(),Beb)[b];!c&&(c=Beb[b]=new teb(a));return c}return new teb(a)} +function _0d(a,b){var c,d;c=b.Hh(a.a);if(c){d=GD(AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),fue));if(d!=null){return d}}return b.ne()} +function a1d(a,b){var c,d;c=b.Hh(a.a);if(c){d=GD(AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),fue));if(d!=null){return d}}return b.ne()} +function FMc(a,b){wMc();var c,d;for(d=new Sr(ur(O_b(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),17);if(c.d.i==b||c.c.i==b){return c}}return null} +function HUb(a,b,c){this.c=a;this.f=new Rkb;this.e=new d7c;this.j=new IVb;this.n=new IVb;this.b=b;this.g=new J6c(b.c,b.d,b.b,b.a);this.a=c} +function gVb(a){var b,c,d,e;this.a=new zsb;this.d=new Tqb;this.e=0;for(c=a,d=0,e=c.length;d0}else{return false}} +function q2c(a){var b;if(PD(hkd(a,(Y9c(),J8c)))===PD((hbd(),fbd))){if(!Xod(a)){jkd(a,J8c,gbd)}else{b=BD(hkd(Xod(a),J8c),334);jkd(a,J8c,b)}}} +function ijc(a,b,c){var d,e;bIc(a.e,b,c,(Ucd(),Tcd));bIc(a.i,b,c,zcd);if(a.a){e=BD(vNb(b,(wtc(),$sc)),11);d=BD(vNb(c,$sc),11);cIc(a.g,e,d)}} +function OEc(a,b,c){var d,e,f;d=b.c.p;f=b.p;a.b[d][f]=new $Ec(a,b);if(c){a.a[d][f]=new FEc(b);e=BD(vNb(b,(wtc(),Psc)),10);!!e&&Rc(a.d,e,b)}} +function TPb(a,b){var c,d,e;Ekb(PPb,a);b.Fc(a);c=BD(Ohb(OPb,a),21);if(c){for(e=c.Kc();e.Ob();){d=BD(e.Pb(),33);Jkb(PPb,d,0)!=-1||TPb(d,b)}}} +function tyb(a,b,c){var d;(jyb?(ryb(a),true):kyb?($xb(),true):nyb?($xb(),true):myb&&($xb(),false))&&(d=new iyb(b),d.b=c,pyb(a,d),undefined)} +function xKb(a,b){var c;c=!a.A.Hc((tdd(),sdd))||a.q==(dcd(),$bd);a.u.Hc((rcd(),ncd))?c?vKb(a,b):zKb(a,b):a.u.Hc(pcd)&&(c?wKb(a,b):AKb(a,b))} +function b0d(a,b){var c,d;++a.j;if(b!=null){c=(d=a.a.Cb,JD(d,97)?BD(d,97).Jg():null);if(xlb(b,c)){Cjd(a.a,4,c);return}}Cjd(a.a,4,BD(b,126))} +function dYb(a,b,c){return new J6c($wnd.Math.min(a.a,b.a)-c/2,$wnd.Math.min(a.b,b.b)-c/2,$wnd.Math.abs(a.a-b.a)+c,$wnd.Math.abs(a.b-b.b)+c)} +function k4b(a,b){var c,d;c=beb(a.a.c.p,b.a.c.p);if(c!=0){return c}d=beb(a.a.d.i.p,b.a.d.i.p);if(d!=0){return d}return beb(b.a.d.p,a.a.d.p)} +function _Dc(a,b,c){var d,e,f,g;f=b.j;g=c.j;if(f!=g){return f.g-g.g}else{d=a.f[b.p];e=a.f[c.p];return d==0&&e==0?0:d==0?-1:e==0?1:Kdb(d,e)}} +function HFb(a,b,c){var d,e,f;if(c[b.d]){return}c[b.d]=true;for(e=new olb(LFb(b));e.a=e)return e;for(b=b>0?b:0;bd&&NC(b,d,null);return b} +function _lb(a,b){var c,d;d=a.a.length;b.lengthd&&NC(b,d,null);return b} +function Xrb(a,b,c){var d,e,f;e=BD(Ohb(a.e,b),387);if(!e){d=new lsb(a,b,c);Rhb(a.e,b,d);isb(d);return null}else{f=ijb(e,c);Yrb(a,e);return f}} +function P9d(a){var b;if(a==null)return null;b=ide(Qge(a,true));if(b==null){throw vbb(new n8d("Invalid hexBinary value: '"+a+"'"))}return b} +function ghb(a){Hgb();if(ybb(a,0)<0){if(ybb(a,-1)!=0){return new Wgb(-1,Jbb(a))}return Bgb}else return ybb(a,10)<=0?Dgb[Tbb(a)]:new Wgb(1,a)} +function wJb(){qJb();return OC(GC(DN,1),Kie,159,0,[nJb,mJb,oJb,eJb,dJb,fJb,iJb,hJb,gJb,lJb,kJb,jJb,bJb,aJb,cJb,$Ib,ZIb,_Ib,XIb,WIb,YIb,pJb])} +function vjc(a){var b;this.d=new Rkb;this.j=new d7c;this.g=new d7c;b=a.g.b;this.f=BD(vNb(Q_b(b),(Nyc(),Lwc)),103);this.e=Edb(ED(c_b(b,ryc)))} +function Pjc(a){this.b=new Rkb;this.e=new Rkb;this.d=a;this.a=!WAb(JAb(new YAb(null,new Lub(new b1b(a.b))),new Xxb(new Qjc))).sd((EAb(),DAb))} +function N5c(){N5c=ccb;L5c=new O5c('PARENTS',0);K5c=new O5c('NODES',1);I5c=new O5c('EDGES',2);M5c=new O5c('PORTS',3);J5c=new O5c('LABELS',4)} +function Tbd(){Tbd=ccb;Qbd=new Ubd('DISTRIBUTED',0);Sbd=new Ubd('JUSTIFIED',1);Obd=new Ubd('BEGIN',2);Pbd=new Ubd(gle,3);Rbd=new Ubd('END',4)} +function UMd(a){var b;b=a.yi(null);switch(b){case 10:return 0;case 15:return 1;case 14:return 2;case 11:return 3;case 21:return 4;}return -1} +function cYb(a){switch(a.g){case 1:return ead(),dad;case 4:return ead(),aad;case 2:return ead(),bad;case 3:return ead(),_9c;}return ead(),cad} +function kA(a,b,c){var d;d=c.q.getFullYear()-nje+nje;d<0&&(d=-d);switch(b){case 1:a.a+=d;break;case 2:EA(a,d%100,2);break;default:EA(a,d,b);}} +function Jsb(a,b){var c,d;wCb(b,a.b);if(b>=a.b>>1){d=a.c;for(c=a.b;c>b;--c){d=d.b}}else{d=a.a.a;for(c=0;c=64&&b<128&&(e=Mbb(e,Nbb(1,b-64)))}return e} +function c_b(a,b){var c,d;d=null;if(wNb(a,(Y9c(),O9c))){c=BD(vNb(a,O9c),94);c.Xe(b)&&(d=c.We(b))}d==null&&!!Q_b(a)&&(d=vNb(Q_b(a),b));return d} +function oQc(a,b){var c,d,e;e=b.d.i;d=e.k;if(d==(j0b(),h0b)||d==d0b){return}c=new Sr(ur(U_b(e).a.Kc(),new Sq));Qr(c)&&Rhb(a.k,b,BD(Rr(c),17))} +function mid(a,b){var c,d,e;d=XKd(a.Tg(),b);c=b-a.Ah();return c<0?(e=a.Yg(d),e>=0?a.lh(e):tid(a,d)):c<0?tid(a,d):BD(d,66).Nj().Sj(a,a.yh(),c)} +function Ksd(a){var b;if(JD(a.a,4)){b=fvd(a.a);if(b==null){throw vbb(new Zdb(mse+a.b+"'. "+ise+(fdb(Y3),Y3.k)+jse))}return b}else{return a.a}} +function L9d(a){var b;if(a==null)return null;b=bde(Qge(a,true));if(b==null){throw vbb(new n8d("Invalid base64Binary value: '"+a+"'"))}return b} +function Dyd(b){var c;try{c=b.i.Xb(b.e);b.mj();b.g=b.e++;return c}catch(a){a=ubb(a);if(JD(a,73)){b.mj();throw vbb(new utb)}else throw vbb(a)}} +function Zyd(b){var c;try{c=b.c.ki(b.e);b.mj();b.g=b.e++;return c}catch(a){a=ubb(a);if(JD(a,73)){b.mj();throw vbb(new utb)}else throw vbb(a)}} +function CPb(){CPb=ccb;BPb=(Y9c(),K9c);vPb=G8c;qPb=r8c;wPb=f9c;zPb=(fFb(),bFb);yPb=_Eb;APb=dFb;xPb=$Eb;sPb=(nPb(),jPb);rPb=iPb;tPb=lPb;uPb=mPb} +function NWb(a){LWb();this.c=new Rkb;this.d=a;switch(a.g){case 0:case 2:this.a=tmb(KWb);this.b=Pje;break;case 3:case 1:this.a=KWb;this.b=Qje;}} +function ued(a,b,c){var d,e;if(a.c){dld(a.c,a.c.i+b);eld(a.c,a.c.j+c)}else{for(e=new olb(a.b);e.a0){Ekb(a.b,new WA(b.a,c));d=b.a.length;0d&&(b.a+=yfb(KC(TD,$ie,25,-d,15,1)))}} +function JKb(a,b){var c,d,e;c=a.o;for(e=BD(BD(Qc(a.r,b),21),84).Kc();e.Ob();){d=BD(e.Pb(),111);d.e.a=DKb(d,c.a);d.e.b=c.b*Edb(ED(d.b.We(BKb)))}} +function S5b(a,b){var c,d,e,f;e=a.k;c=Edb(ED(vNb(a,(wtc(),htc))));f=b.k;d=Edb(ED(vNb(b,htc)));return f!=(j0b(),e0b)?-1:e!=e0b?1:c==d?0:c=0){return a.hh(b,c,d)}else{!!a.eh()&&(d=(e=a.Vg(),e>=0?a.Qg(d):a.eh().ih(a,-1-e,null,d)));return a.Sg(b,c,d)}} +function zld(a,b){switch(b){case 7:!a.e&&(a.e=new y5d(B2,a,7,4));Uxd(a.e);return;case 8:!a.d&&(a.d=new y5d(B2,a,8,5));Uxd(a.d);return;}$kd(a,b)} +function Ut(b,c){var d;d=b.Zc(c);try{return d.Pb()}catch(a){a=ubb(a);if(JD(a,109)){throw vbb(new qcb("Can't get element "+c))}else throw vbb(a)}} +function Tgb(a,b){this.e=a;if(b=0&&(c.d=a.t);break;case 3:a.t>=0&&(c.a=a.t);}if(a.C){c.b=a.C.b;c.c=a.C.c}} +function RMb(){RMb=ccb;OMb=new SMb(xle,0);NMb=new SMb(yle,1);PMb=new SMb(zle,2);QMb=new SMb(Ale,3);OMb.a=false;NMb.a=true;PMb.a=false;QMb.a=true} +function ROb(){ROb=ccb;OOb=new SOb(xle,0);NOb=new SOb(yle,1);POb=new SOb(zle,2);QOb=new SOb(Ale,3);OOb.a=false;NOb.a=true;POb.a=false;QOb.a=true} +function dac(a){var b;b=a.a;do{b=BD(Rr(new Sr(ur(R_b(b).a.Kc(),new Sq))),17).c.i;b.k==(j0b(),g0b)&&a.b.Fc(b)}while(b.k==(j0b(),g0b));a.b=Su(a.b)} +function CDc(a){var b,c,d;d=a.c.a;a.p=(Qb(d),new Tkb(d));for(c=new olb(d);c.ac.b){return true}}}return false} +function AD(a,b){if(ND(a)){return !!zD[b]}else if(a.hm){return !!a.hm[b]}else if(LD(a)){return !!yD[b]}else if(KD(a)){return !!xD[b]}return false} +function jkd(a,b,c){c==null?(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),LAd(a.o,b)):(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),HAd(a.o,b,c));return a} +function jKb(a,b,c,d){var e,f;f=b.Xe((Y9c(),W8c))?BD(b.We(W8c),21):a.j;e=uJb(f);if(e==(qJb(),pJb)){return}if(c&&!sJb(e)){return}UHb(lKb(a,e,d),b)} +function fid(a,b,c,d){var e,f,g;f=XKd(a.Tg(),b);e=b-a.Ah();return e<0?(g=a.Yg(f),g>=0?a._g(g,c,true):sid(a,f,c)):BD(f,66).Nj().Pj(a,a.yh(),e,c,d)} +function u6d(a,b,c,d){var e,f,g;if(c.mh(b)){Q6d();if(YId(b)){e=BD(c.ah(b),153);x6d(a,e)}else{f=(g=b,!g?null:BD(d,49).xh(g));!!f&&v6d(c.ah(b),f)}}} +function H3b(a){switch(a.g){case 1:return vLb(),uLb;case 3:return vLb(),rLb;case 2:return vLb(),tLb;case 4:return vLb(),sLb;default:return null;}} +function kCb(a){switch(typeof(a)){case Mhe:return LCb(a);case Lhe:return QD(a);case Khe:return Bcb(),a?1231:1237;default:return a==null?0:FCb(a);}} +function Gic(a,b,c){if(a.e){switch(a.b){case 1:oic(a.c,b,c);break;case 0:pic(a.c,b,c);}}else{mic(a.c,b,c)}a.a[b.p][c.p]=a.c.i;a.a[c.p][b.p]=a.c.e} +function lHc(a){var b,c;if(a==null){return null}c=KC(OQ,nie,193,a.length,0,2);for(b=0;b=0)return e;if(a.Fk()){for(d=0;d=e)throw vbb(new Cyd(b,e));if(a.hi()){d=a.Xc(c);if(d>=0&&d!=b){throw vbb(new Wdb(kue))}}return a.mi(b,c)} +function gx(a,b){this.a=BD(Qb(a),245);this.b=BD(Qb(b),245);if(a.vd(b)>0||a==(Lk(),Kk)||b==(_k(),$k)){throw vbb(new Wdb('Invalid range: '+nx(a,b)))}} +function mYb(a){var b,c;this.b=new Rkb;this.c=a;this.a=false;for(c=new olb(a.a);c.a0);if((b&-b)==b){return QD(b*Cub(a,31)*4.6566128730773926E-10)}do{c=Cub(a,31);d=c%b}while(c-d+(b-1)<0);return QD(d)} +function LCb(a){JCb();var b,c,d;c=':'+a;d=ICb[c];if(d!=null){return QD((uCb(d),d))}d=GCb[c];b=d==null?KCb(a):QD((uCb(d),d));MCb();ICb[c]=b;return b} +function qZb(a,b,c){Odd(c,'Compound graph preprocessor',1);a.a=new Hp;vZb(a,b,null);pZb(a,b);uZb(a);yNb(b,(wtc(),zsc),a.a);a.a=null;Uhb(a.b);Qdd(c)} +function X$b(a,b,c){switch(c.g){case 1:a.a=b.a/2;a.b=0;break;case 2:a.a=b.a;a.b=b.b/2;break;case 3:a.a=b.a/2;a.b=b.b;break;case 4:a.a=0;a.b=b.b/2;}} +function tkc(a){var b,c,d;for(d=BD(Qc(a.a,(Xjc(),Vjc)),15).Kc();d.Ob();){c=BD(d.Pb(),101);b=Bkc(c);kkc(a,c,b[0],(Fkc(),Ckc),0);kkc(a,c,b[1],Ekc,1)}} +function ukc(a){var b,c,d;for(d=BD(Qc(a.a,(Xjc(),Wjc)),15).Kc();d.Ob();){c=BD(d.Pb(),101);b=Bkc(c);kkc(a,c,b[0],(Fkc(),Ckc),0);kkc(a,c,b[1],Ekc,1)}} +function tXc(a){switch(a.g){case 0:return null;case 1:return new $Xc;case 2:return new QXc;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}} +function OZc(a,b,c){var d,e;FZc(a,b-a.s,c-a.t);for(e=new olb(a.n);e.a1&&(f=GFb(a,b));return f} +function dmd(a){var b;if(!!a.f&&a.f.kh()){b=BD(a.f,49);a.f=BD(xid(a,b),82);a.f!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,8,b,a.f))}return a.f} +function emd(a){var b;if(!!a.i&&a.i.kh()){b=BD(a.i,49);a.i=BD(xid(a,b),82);a.i!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,7,b,a.i))}return a.i} +function zUd(a){var b;if(!!a.b&&(a.b.Db&64)!=0){b=a.b;a.b=BD(xid(a,b),18);a.b!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,21,b,a.b))}return a.b} +function uAd(a,b){var c,d,e;if(a.d==null){++a.e;++a.f}else{d=b.Sh();BAd(a,a.f+1);e=(d&Ohe)%a.d.length;c=a.d[e];!c&&(c=a.d[e]=a.uj());c.Fc(b);++a.f}} +function m3d(a,b,c){var d;if(b.Kj()){return false}else if(b.Zj()!=-2){d=b.zj();return d==null?c==null:pb(d,c)}else return b.Hj()==a.e.Tg()&&c==null} +function wo(){var a;Xj(16,Hie);a=Kp(16);this.b=KC(GF,Gie,317,a,0,1);this.c=KC(GF,Gie,317,a,0,1);this.a=null;this.e=null;this.i=0;this.f=a-1;this.g=0} +function b0b(a){n_b.call(this);this.k=(j0b(),h0b);this.j=(Xj(6,Jie),new Skb(6));this.b=(Xj(2,Jie),new Skb(2));this.d=new L_b;this.f=new s0b;this.a=a} +function Scc(a){var b,c;if(a.c.length<=1){return}b=Pcc(a,(Ucd(),Rcd));Rcc(a,BD(b.a,19).a,BD(b.b,19).a);c=Pcc(a,Tcd);Rcc(a,BD(c.a,19).a,BD(c.b,19).a)} +function Vzc(){Vzc=ccb;Uzc=new Xzc('SIMPLE',0);Rzc=new Xzc(Tne,1);Szc=new Xzc('LINEAR_SEGMENTS',2);Qzc=new Xzc('BRANDES_KOEPF',3);Tzc=new Xzc(Aqe,4)} +function XDc(a,b,c){if(!ecd(BD(vNb(b,(Nyc(),Vxc)),98))){WDc(a,b,Y_b(b,c));WDc(a,b,Y_b(b,(Ucd(),Rcd)));WDc(a,b,Y_b(b,Acd));mmb();Okb(b.j,new jEc(a))}} +function HVc(a,b,c,d){var e,f,g;e=d?BD(Qc(a.a,b),21):BD(Qc(a.b,b),21);for(g=e.Kc();g.Ob();){f=BD(g.Pb(),33);if(BVc(a,c,f)){return true}}return false} +function FMd(a){var b,c;for(c=new Fyd(a);c.e!=c.i.gc();){b=BD(Dyd(c),87);if(!!b.e||(!b.d&&(b.d=new xMd(j5,b,1)),b.d).i!=0){return true}}return false} +function QTd(a){var b,c;for(c=new Fyd(a);c.e!=c.i.gc();){b=BD(Dyd(c),87);if(!!b.e||(!b.d&&(b.d=new xMd(j5,b,1)),b.d).i!=0){return true}}return false} +function FDc(a){var b,c,d;b=0;for(d=new olb(a.c.a);d.a102)return -1;if(a<=57)return a-48;if(a<65)return -1;if(a<=70)return a-65+10;if(a<97)return -1;return a-97+10} +function Wj(a,b){if(a==null){throw vbb(new Heb('null key in entry: null='+b))}else if(b==null){throw vbb(new Heb('null value in entry: '+a+'=null'))}} +function kr(a,b){var c,d;while(a.Ob()){if(!b.Ob()){return false}c=a.Pb();d=b.Pb();if(!(PD(c)===PD(d)||c!=null&&pb(c,d))){return false}}return !b.Ob()} +function jIb(a,b){var c;c=OC(GC(UD,1),Vje,25,15,[pHb(a.a[0],b),pHb(a.a[1],b),pHb(a.a[2],b)]);if(a.d){c[0]=$wnd.Math.max(c[0],c[2]);c[2]=c[0]}return c} +function kIb(a,b){var c;c=OC(GC(UD,1),Vje,25,15,[qHb(a.a[0],b),qHb(a.a[1],b),qHb(a.a[2],b)]);if(a.d){c[0]=$wnd.Math.max(c[0],c[2]);c[2]=c[0]}return c} +function mqc(){mqc=ccb;iqc=new oqc('GREEDY',0);hqc=new oqc(Une,1);kqc=new oqc(Tne,2);lqc=new oqc('MODEL_ORDER',3);jqc=new oqc('GREEDY_MODEL_ORDER',4)} +function iUc(a,b){var c,d,e;a.b[b.g]=1;for(d=Jsb(b.d,0);d.b!=d.d.c;){c=BD(Xsb(d),188);e=c.c;a.b[e.g]==1?Dsb(a.a,c):a.b[e.g]==2?(a.b[e.g]=1):iUc(a,e)}} +function V9b(a,b){var c,d,e;e=new Skb(b.gc());for(d=b.Kc();d.Ob();){c=BD(d.Pb(),286);c.c==c.f?K9b(a,c,c.c):L9b(a,c)||(e.c[e.c.length]=c,true)}return e} +function IZc(a,b,c){var d,e,f,g,h;h=a.r+b;a.r+=b;a.d+=c;d=c/a.n.c.length;e=0;for(g=new olb(a.n);g.af&&NC(b,f,null);return b} +function Lu(a,b){var c,d;d=a.gc();if(b==null){for(c=0;c0&&(i+=e);j[k]=g;g+=h*(i+d)}} +function Uoc(a){var b,c,d;d=a.f;a.n=KC(UD,Vje,25,d,15,1);a.d=KC(UD,Vje,25,d,15,1);for(b=0;b0?a.c:0);++e}a.b=d;a.d=f} +function BZc(a,b){var c,d,e,f,g;d=0;e=0;c=0;for(g=new olb(b);g.a0?a.g:0);++c}a.c=e;a.d=d} +function AHb(a,b){var c;c=OC(GC(UD,1),Vje,25,15,[zHb(a,(gHb(),dHb),b),zHb(a,eHb,b),zHb(a,fHb,b)]);if(a.f){c[0]=$wnd.Math.max(c[0],c[2]);c[2]=c[0]}return c} +function lNb(b,c,d){var e;try{aNb(b,c+b.j,d+b.k,false,true)}catch(a){a=ubb(a);if(JD(a,73)){e=a;throw vbb(new qcb(e.g+Gle+c+She+d+').'))}else throw vbb(a)}} +function mNb(b,c,d){var e;try{aNb(b,c+b.j,d+b.k,true,false)}catch(a){a=ubb(a);if(JD(a,73)){e=a;throw vbb(new qcb(e.g+Gle+c+She+d+').'))}else throw vbb(a)}} +function d5b(a){var b;if(!wNb(a,(Nyc(),xxc))){return}b=BD(vNb(a,xxc),21);if(b.Hc((Hbd(),zbd))){b.Mc(zbd);b.Fc(Bbd)}else if(b.Hc(Bbd)){b.Mc(Bbd);b.Fc(zbd)}} +function e5b(a){var b;if(!wNb(a,(Nyc(),xxc))){return}b=BD(vNb(a,xxc),21);if(b.Hc((Hbd(),Gbd))){b.Mc(Gbd);b.Fc(Ebd)}else if(b.Hc(Ebd)){b.Mc(Ebd);b.Fc(Gbd)}} +function udc(a,b,c){Odd(c,'Self-Loop ordering',1);MAb(NAb(JAb(JAb(LAb(new YAb(null,new Kub(b.b,16)),new ydc),new Adc),new Cdc),new Edc),new Gdc(a));Qdd(c)} +function ikc(a,b,c,d){var e,f;for(e=b;e0&&(e.b+=b);return e} +function GXb(a,b){var c,d,e;e=new d7c;for(d=a.Kc();d.Ob();){c=BD(d.Pb(),37);uXb(c,0,e.b);e.b+=c.f.b+b;e.a=$wnd.Math.max(e.a,c.f.a)}e.a>0&&(e.a+=b);return e} +function d_b(a){var b,c,d;d=Ohe;for(c=new olb(a.a);c.a>16==6){return a.Cb.ih(a,5,o5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?a.zh():c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function Wz(a){Rz();var b=a.e;if(b&&b.stack){var c=b.stack;var d=b+'\n';c.substring(0,d.length)==d&&(c=c.substring(d.length));return c.split('\n')}return []} +function jeb(a){var b;b=(qeb(),peb);return b[a>>>28]|b[a>>24&15]<<4|b[a>>20&15]<<8|b[a>>16&15]<<12|b[a>>12&15]<<16|b[a>>8&15]<<20|b[a>>4&15]<<24|b[a&15]<<28} +function _jb(a){var b,c,d;if(a.b!=a.c){return}d=a.a.length;c=geb($wnd.Math.max(8,d))<<1;if(a.b!=0){b=_Bb(a.a,c);$jb(a,b,d);a.a=b;a.b=0}else{dCb(a.a,c)}a.c=d} +function DKb(a,b){var c;c=a.b;return c.Xe((Y9c(),s9c))?c.Hf()==(Ucd(),Tcd)?-c.rf().a-Edb(ED(c.We(s9c))):b+Edb(ED(c.We(s9c))):c.Hf()==(Ucd(),Tcd)?-c.rf().a:b} +function P_b(a){var b;if(a.b.c.length!=0&&!!BD(Ikb(a.b,0),70).a){return BD(Ikb(a.b,0),70).a}b=JZb(a);if(b!=null){return b}return ''+(!a.c?-1:Jkb(a.c.a,a,0))} +function C0b(a){var b;if(a.f.c.length!=0&&!!BD(Ikb(a.f,0),70).a){return BD(Ikb(a.f,0),70).a}b=JZb(a);if(b!=null){return b}return ''+(!a.i?-1:Jkb(a.i.j,a,0))} +function Ogc(a,b){var c,d;if(b<0||b>=a.gc()){return null}for(c=b;c0?a.c:0);e=$wnd.Math.max(e,b.d);++d}a.e=f;a.b=e} +function shd(a){var b,c;if(!a.b){a.b=Qu(BD(a.f,118).Ag().i);for(c=new Fyd(BD(a.f,118).Ag());c.e!=c.i.gc();){b=BD(Dyd(c),137);Ekb(a.b,new dhd(b))}}return a.b} +function Ctd(a,b){var c,d,e;if(b.dc()){return LCd(),LCd(),KCd}else{c=new zyd(a,b.gc());for(e=new Fyd(a);e.e!=e.i.gc();){d=Dyd(e);b.Hc(d)&&wtd(c,d)}return c}} +function bkd(a,b,c,d){if(b==0){return d?(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),a.o):(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),FAd(a.o))}return fid(a,b,c,d)} +function Tnd(a){var b,c;if(a.rb){for(b=0,c=a.rb.i;b>22);e+=d>>22;if(e<0){return false}a.l=c&Eje;a.m=d&Eje;a.h=e&Fje;return true} +function Fwb(a,b,c,d,e,f,g){var h,i;if(b.Ae()&&(i=a.a.ue(c,d),i<0||!e&&i==0)){return false}if(b.Be()&&(h=a.a.ue(c,f),h>0||!g&&h==0)){return false}return true} +function Vcc(a,b){Occ();var c;c=a.j.g-b.j.g;if(c!=0){return 0}switch(a.j.g){case 2:return Ycc(b,Ncc)-Ycc(a,Ncc);case 4:return Ycc(a,Mcc)-Ycc(b,Mcc);}return 0} +function Tqc(a){switch(a.g){case 0:return Mqc;case 1:return Nqc;case 2:return Oqc;case 3:return Pqc;case 4:return Qqc;case 5:return Rqc;default:return null;}} +function End(a,b,c){var d,e;d=(e=new rUd,yId(e,b),pnd(e,c),wtd((!a.c&&(a.c=new cUd(p5,a,12,10)),a.c),e),e);AId(d,0);DId(d,1);CId(d,true);BId(d,true);return d} +function tud(a,b){var c,d;if(b>=a.i)throw vbb(new $zd(b,a.i));++a.j;c=a.g[b];d=a.i-b-1;d>0&&$fb(a.g,b+1,a.g,b,d);NC(a.g,--a.i,null);a.fi(b,c);a.ci();return c} +function UId(a,b){var c,d;if(a.Db>>16==17){return a.Cb.ih(a,21,c5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?a.zh():c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function iDb(a){var b,c,d,e;mmb();Okb(a.c,a.a);for(e=new olb(a.c);e.ac.a.c.length)){throw vbb(new Wdb('index must be >= 0 and <= layer node count'))}!!a.c&&Lkb(a.c.a,a);a.c=c;!!c&&Dkb(c.a,b,a)} +function p7b(a,b){var c,d,e;for(d=new Sr(ur(O_b(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),17);e=BD(b.Kb(c),10);return new cc(Qb(e.n.b+e.o.b/2))}return wb(),wb(),vb} +function rMc(a,b){this.c=new Lqb;this.a=a;this.b=b;this.d=BD(vNb(a,(wtc(),otc)),304);PD(vNb(a,(Nyc(),yxc)))===PD((_qc(),Zqc))?(this.e=new bNc):(this.e=new WMc)} +function $dd(a,b){var c,d,e,f;f=0;for(d=new olb(a);d.a>16==6){return a.Cb.ih(a,6,B2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Lhd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function Eod(a,b){var c,d;if(a.Db>>16==7){return a.Cb.ih(a,1,C2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Nhd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function lpd(a,b){var c,d;if(a.Db>>16==9){return a.Cb.ih(a,9,E2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Phd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function mQd(a,b){var c,d;if(a.Db>>16==5){return a.Cb.ih(a,9,h5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),VFd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function KHd(a,b){var c,d;if(a.Db>>16==3){return a.Cb.ih(a,0,k5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),OFd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function Snd(a,b){var c,d;if(a.Db>>16==7){return a.Cb.ih(a,6,o5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),cGd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function ird(){this.a=new bqd;this.g=new wo;this.j=new wo;this.b=new Lqb;this.d=new wo;this.i=new wo;this.k=new Lqb;this.c=new Lqb;this.e=new Lqb;this.f=new Lqb} +function MCd(a,b,c){var d,e,f;c<0&&(c=0);f=a.i;for(e=c;eWje){return p6d(a,d)}if(d==a){return true}}}return false} +function HKb(a){CKb();switch(a.q.g){case 5:EKb(a,(Ucd(),Acd));EKb(a,Rcd);break;case 4:FKb(a,(Ucd(),Acd));FKb(a,Rcd);break;default:GKb(a,(Ucd(),Acd));GKb(a,Rcd);}} +function LKb(a){CKb();switch(a.q.g){case 5:IKb(a,(Ucd(),zcd));IKb(a,Tcd);break;case 4:JKb(a,(Ucd(),zcd));JKb(a,Tcd);break;default:KKb(a,(Ucd(),zcd));KKb(a,Tcd);}} +function XQb(a){var b,c;b=BD(vNb(a,(wSb(),pSb)),19);if(b){c=b.a;c==0?yNb(a,(HSb(),GSb),new Gub):yNb(a,(HSb(),GSb),new Hub(c))}else{yNb(a,(HSb(),GSb),new Hub(1))}} +function V$b(a,b){var c;c=a.i;switch(b.g){case 1:return -(a.n.b+a.o.b);case 2:return a.n.a-c.o.a;case 3:return a.n.b-c.o.b;case 4:return -(a.n.a+a.o.a);}return 0} +function hbc(a,b){switch(a.g){case 0:return b==(Ctc(),ytc)?dbc:ebc;case 1:return b==(Ctc(),ytc)?dbc:cbc;case 2:return b==(Ctc(),ytc)?cbc:ebc;default:return cbc;}} +function v$c(a,b){var c,d,e;Lkb(a.a,b);a.e-=b.r+(a.a.c.length==0?0:a.c);e=ere;for(d=new olb(a.a);d.a>16==3){return a.Cb.ih(a,12,E2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Khd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function Uod(a,b){var c,d;if(a.Db>>16==11){return a.Cb.ih(a,10,E2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Ohd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function PSd(a,b){var c,d;if(a.Db>>16==10){return a.Cb.ih(a,11,c5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),aGd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function qUd(a,b){var c,d;if(a.Db>>16==10){return a.Cb.ih(a,12,n5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),dGd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function wId(a){var b;if((a.Bb&1)==0&&!!a.r&&a.r.kh()){b=BD(a.r,49);a.r=BD(xid(a,b),138);a.r!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,8,b,a.r))}return a.r} +function yHb(a,b,c){var d;d=OC(GC(UD,1),Vje,25,15,[BHb(a,(gHb(),dHb),b,c),BHb(a,eHb,b,c),BHb(a,fHb,b,c)]);if(a.f){d[0]=$wnd.Math.max(d[0],d[2]);d[2]=d[0]}return d} +function O9b(a,b){var c,d,e;e=V9b(a,b);if(e.c.length==0){return}Okb(e,new pac);c=e.c.length;for(d=0;d>19;j=b.h>>19;if(i!=j){return j-i}e=a.h;h=b.h;if(e!=h){return e-h}d=a.m;g=b.m;if(d!=g){return d-g}c=a.l;f=b.l;return c-f} +function fFb(){fFb=ccb;eFb=(rFb(),oFb);dFb=new Nsd(Yke,eFb);cFb=(UEb(),TEb);bFb=new Nsd(Zke,cFb);aFb=(MEb(),LEb);_Eb=new Nsd($ke,aFb);$Eb=new Nsd(_ke,(Bcb(),true))} +function cfc(a,b,c){var d,e;d=b*c;if(JD(a.g,145)){e=ugc(a);if(e.f.d){e.f.a||(a.d.a+=d+ple)}else{a.d.d-=d+ple;a.d.a+=d+ple}}else if(JD(a.g,10)){a.d.d-=d;a.d.a+=2*d}} +function vmc(a,b,c){var d,e,f,g,h;e=a[c.g];for(h=new olb(b.d);h.a0?a.g:0);++c}b.b=d;b.e=e} +function to(a){var b,c,d;d=a.b;if(Lp(a.i,d.length)){c=d.length*2;a.b=KC(GF,Gie,317,c,0,1);a.c=KC(GF,Gie,317,c,0,1);a.f=c-1;a.i=0;for(b=a.a;b;b=b.c){po(a,b,b)}++a.g}} +function cNb(a,b,c,d){var e,f,g,h;for(e=0;eg&&(h=g/d);e>f&&(i=f/e);Y6c(a,$wnd.Math.min(h,i));return a} +function ond(){Smd();var b,c;try{c=BD(mUd((yFd(),xFd),yte),2014);if(c){return c}}catch(a){a=ubb(a);if(JD(a,102)){b=a;uvd((h0d(),b))}else throw vbb(a)}return new knd} +function Y9d(){A9d();var b,c;try{c=BD(mUd((yFd(),xFd),Ewe),2024);if(c){return c}}catch(a){a=ubb(a);if(JD(a,102)){b=a;uvd((h0d(),b))}else throw vbb(a)}return new U9d} +function qZd(){Smd();var b,c;try{c=BD(mUd((yFd(),xFd),_ve),1941);if(c){return c}}catch(a){a=ubb(a);if(JD(a,102)){b=a;uvd((h0d(),b))}else throw vbb(a)}return new mZd} +function HQd(a,b,c){var d,e;e=a.e;a.e=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,4,e,b);!c?(c=d):c.Ei(d)}e!=b&&(b?(c=QQd(a,MQd(a,b),c)):(c=QQd(a,a.a,c)));return c} +function nB(){eB.call(this);this.e=-1;this.a=false;this.p=Rie;this.k=-1;this.c=-1;this.b=-1;this.g=false;this.f=-1;this.j=-1;this.n=-1;this.i=-1;this.d=-1;this.o=Rie} +function qEb(a,b){var c,d,e;d=a.b.d.d;a.a||(d+=a.b.d.a);e=b.b.d.d;b.a||(e+=b.b.d.a);c=Kdb(d,e);if(c==0){if(!a.a&&b.a){return -1}else if(!b.a&&a.a){return 1}}return c} +function eOb(a,b){var c,d,e;d=a.b.b.d;a.a||(d+=a.b.b.a);e=b.b.b.d;b.a||(e+=b.b.b.a);c=Kdb(d,e);if(c==0){if(!a.a&&b.a){return -1}else if(!b.a&&a.a){return 1}}return c} +function PVb(a,b){var c,d,e;d=a.b.g.d;a.a||(d+=a.b.g.a);e=b.b.g.d;b.a||(e+=b.b.g.a);c=Kdb(d,e);if(c==0){if(!a.a&&b.a){return -1}else if(!b.a&&a.a){return 1}}return c} +function ZTb(){ZTb=ccb;WTb=c3c(e3c(e3c(e3c(new j3c,(qUb(),oUb),(S8b(),m8b)),oUb,q8b),pUb,x8b),pUb,a8b);YTb=e3c(e3c(new j3c,oUb,S7b),oUb,b8b);XTb=c3c(new j3c,pUb,d8b)} +function s3b(a){var b,c,d,e,f;b=BD(vNb(a,(wtc(),Csc)),83);f=a.n;for(d=b.Cc().Kc();d.Ob();){c=BD(d.Pb(),306);e=c.i;e.c+=f.a;e.d+=f.b;c.c?VHb(c):XHb(c)}yNb(a,Csc,null)} +function qmc(a,b,c){var d,e;e=a.b;d=e.d;switch(b.g){case 1:return -d.d-c;case 2:return e.o.a+d.c+c;case 3:return e.o.b+d.a+c;case 4:return -d.b-c;default:return -1;}} +function BXc(a){var b,c,d,e,f;d=0;e=dme;if(a.b){for(b=0;b<360;b++){c=b*0.017453292519943295;zXc(a,a.d,0,0,dre,c);f=a.b.ig(a.d);if(f0){g=(f&Ohe)%a.d.length;e=wAd(a,g,f,b);if(e){h=e.ed(c);return h}}d=a.tj(f,b,c);a.c.Fc(d);return null} +function t1d(a,b){var c,d,e,f;switch(o1d(a,b)._k()){case 3:case 2:{c=OKd(b);for(e=0,f=c.i;e=0;d--){if(dfb(a[d].d,b)||dfb(a[d].d,c)){a.length>=d+1&&a.splice(0,d+1);break}}return a} +function Abb(a,b){var c;if(Fbb(a)&&Fbb(b)){c=a/b;if(Kje0){a.b+=2;a.a+=d}}else{a.b+=1;a.a+=$wnd.Math.min(d,e)}} +function Rpd(a,b){var c,d;d=false;if(ND(b)){d=true;Qpd(a,new yC(GD(b)))}if(!d){if(JD(b,236)){d=true;Qpd(a,(c=Kcb(BD(b,236)),new TB(c)))}}if(!d){throw vbb(new vcb(Ute))}} +function IMd(a,b,c,d){var e,f,g;e=new pSd(a.e,1,10,(g=b.c,JD(g,88)?BD(g,26):(jGd(),_Fd)),(f=c.c,JD(f,88)?BD(f,26):(jGd(),_Fd)),HLd(a,b),false);!d?(d=e):d.Ei(e);return d} +function T_b(a){var b,c;switch(BD(vNb(Q_b(a),(Nyc(),ixc)),420).g){case 0:b=a.n;c=a.o;return new f7c(b.a+c.a/2,b.b+c.b/2);case 1:return new g7c(a.n);default:return null;}} +function lrc(){lrc=ccb;irc=new mrc(ane,0);hrc=new mrc('LEFTUP',1);krc=new mrc('RIGHTUP',2);grc=new mrc('LEFTDOWN',3);jrc=new mrc('RIGHTDOWN',4);frc=new mrc('BALANCED',5)} +function FFc(a,b,c){var d,e,f;d=Kdb(a.a[b.p],a.a[c.p]);if(d==0){e=BD(vNb(b,(wtc(),Qsc)),15);f=BD(vNb(c,Qsc),15);if(e.Hc(c)){return -1}else if(f.Hc(b)){return 1}}return d} +function jXc(a){switch(a.g){case 1:return new XVc;case 2:return new ZVc;case 3:return new VVc;case 0:return null;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}} +function Ikd(a,b,c){switch(b){case 1:!a.n&&(a.n=new cUd(D2,a,1,7));Uxd(a.n);!a.n&&(a.n=new cUd(D2,a,1,7));ytd(a.n,BD(c,14));return;case 2:Lkd(a,GD(c));return;}ekd(a,b,c)} +function Zkd(a,b,c){switch(b){case 3:ald(a,Edb(ED(c)));return;case 4:cld(a,Edb(ED(c)));return;case 5:dld(a,Edb(ED(c)));return;case 6:eld(a,Edb(ED(c)));return;}Ikd(a,b,c)} +function Fnd(a,b,c){var d,e,f;f=(d=new rUd,d);e=xId(f,b,null);!!e&&e.Fi();pnd(f,c);wtd((!a.c&&(a.c=new cUd(p5,a,12,10)),a.c),f);AId(f,0);DId(f,1);CId(f,true);BId(f,true)} +function mUd(a,b){var c,d,e;c=Crb(a.g,b);if(JD(c,235)){e=BD(c,235);e.Qh()==null&&undefined;return e.Nh()}else if(JD(c,498)){d=BD(c,1938);e=d.b;return e}else{return null}} +function Ui(a,b,c,d){var e,f;Qb(b);Qb(c);f=BD(tn(a.d,b),19);Ob(!!f,'Row %s not in %s',b,a.e);e=BD(tn(a.b,c),19);Ob(!!e,'Column %s not in %s',c,a.c);return Wi(a,f.a,e.a,d)} +function JC(a,b,c,d,e,f,g){var h,i,j,k,l;k=e[f];j=f==g-1;h=j?d:0;l=LC(h,k);d!=10&&OC(GC(a,g-f),b[f],c[f],h,l);if(!j){++f;for(i=0;i1||h==-1){f=BD(i,15);e.Wb(t6d(a,f))}else{e.Wb(s6d(a,BD(i,56)))}}}} +function Zbb(b,c,d,e){Ybb();var f=Wbb;$moduleName=c;$moduleBase=d;tbb=e;function g(){for(var a=0;aOqe){return c}else e>-1.0E-6&&++c}return c} +function PQd(a,b){var c;if(b!=a.b){c=null;!!a.b&&(c=lid(a.b,a,-4,c));!!b&&(c=kid(b,a,-4,c));c=GQd(a,b,c);!!c&&c.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,b,b))} +function SQd(a,b){var c;if(b!=a.f){c=null;!!a.f&&(c=lid(a.f,a,-1,c));!!b&&(c=kid(b,a,-1,c));c=IQd(a,b,c);!!c&&c.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,0,b,b))} +function E9d(a){var b,c,d;if(a==null)return null;c=BD(a,15);if(c.dc())return '';d=new Hfb;for(b=c.Kc();b.Ob();){Efb(d,(Q8d(),GD(b.Pb())));d.a+=' '}return lcb(d,d.a.length-1)} +function I9d(a){var b,c,d;if(a==null)return null;c=BD(a,15);if(c.dc())return '';d=new Hfb;for(b=c.Kc();b.Ob();){Efb(d,(Q8d(),GD(b.Pb())));d.a+=' '}return lcb(d,d.a.length-1)} +function qEc(a,b,c){var d,e;d=a.c[b.c.p][b.p];e=a.c[c.c.p][c.p];if(d.a!=null&&e.a!=null){return Ddb(d.a,e.a)}else if(d.a!=null){return -1}else if(e.a!=null){return 1}return 0} +function zqd(a,b){var c,d,e,f,g,h;if(b){f=b.a.length;c=new Yge(f);for(h=(c.b-c.a)*c.c<0?(Xge(),Wge):new she(c);h.Ob();){g=BD(h.Pb(),19);e=Zpd(b,g.a);d=new Crd(a);Aqd(d.a,e)}}} +function Qqd(a,b){var c,d,e,f,g,h;if(b){f=b.a.length;c=new Yge(f);for(h=(c.b-c.a)*c.c<0?(Xge(),Wge):new she(c);h.Ob();){g=BD(h.Pb(),19);e=Zpd(b,g.a);d=new lrd(a);nqd(d.a,e)}}} +function eFd(b){var c;if(b!=null&&b.length>0&&bfb(b,b.length-1)==33){try{c=PEd(qfb(b,0,b.length-1));return c.e==null}catch(a){a=ubb(a);if(!JD(a,32))throw vbb(a)}}return false} +function h3d(a,b,c){var d,e,f;d=b.ak();f=b.dd();e=d.$j()?H2d(a,3,d,null,f,M2d(a,d,f,JD(d,99)&&(BD(d,18).Bb&Tje)!=0),true):H2d(a,1,d,d.zj(),f,-1,true);c?c.Ei(e):(c=e);return c} +function Vee(){var a,b,c;b=0;for(a=0;a<'X'.length;a++){c=Uee((BCb(a,'X'.length),'X'.charCodeAt(a)));if(c==0)throw vbb(new mde('Unknown Option: '+'X'.substr(a)));b|=c}return b} +function mZb(a,b,c){var d,e,f;d=Q_b(b);e=a_b(d);f=new H0b;F0b(f,b);switch(c.g){case 1:G0b(f,Wcd(Zcd(e)));break;case 2:G0b(f,Zcd(e));}yNb(f,(Nyc(),Uxc),ED(vNb(a,Uxc)));return f} +function U9b(a){var b,c;b=BD(Rr(new Sr(ur(R_b(a.a).a.Kc(),new Sq))),17);c=BD(Rr(new Sr(ur(U_b(a.a).a.Kc(),new Sq))),17);return Ccb(DD(vNb(b,(wtc(),ltc))))||Ccb(DD(vNb(c,ltc)))} +function Xjc(){Xjc=ccb;Tjc=new Yjc('ONE_SIDE',0);Vjc=new Yjc('TWO_SIDES_CORNER',1);Wjc=new Yjc('TWO_SIDES_OPPOSING',2);Ujc=new Yjc('THREE_SIDES',3);Sjc=new Yjc('FOUR_SIDES',4)} +function jkc(a,b,c,d,e){var f,g;f=BD(GAb(JAb(b.Oc(),new _kc),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)]))),15);g=BD(Si(a.b,c,d),15);e==0?g.Wc(0,f):g.Gc(f)} +function KDc(a,b){var c,d,e,f,g;for(f=new olb(b.a);f.a0&&ric(this,this.c-1,(Ucd(),zcd));this.c0&&a[0].length>0&&(this.c=Ccb(DD(vNb(Q_b(a[0][0]),(wtc(),Rsc)))));this.a=KC(CX,nie,2018,a.length,0,2);this.b=KC(FX,nie,2019,a.length,0,2);this.d=new ss} +function tKc(a){if(a.c.length==0){return false}if((tCb(0,a.c.length),BD(a.c[0],17)).c.i.k==(j0b(),g0b)){return true}return FAb(NAb(new YAb(null,new Kub(a,16)),new wKc),new yKc)} +function rRc(a,b,c){Odd(c,'Tree layout',1);H2c(a.b);K2c(a.b,(yRc(),uRc),uRc);K2c(a.b,vRc,vRc);K2c(a.b,wRc,wRc);K2c(a.b,xRc,xRc);a.a=F2c(a.b,b);sRc(a,b,Udd(c,1));Qdd(c);return b} +function HXc(a,b){var c,d,e,f,g,h,i;h=gVc(b);f=b.f;i=b.g;g=$wnd.Math.sqrt(f*f+i*i);e=0;for(d=new olb(h);d.a=0){c=Abb(a,Jje);d=Hbb(a,Jje)}else{b=Pbb(a,1);c=Abb(b,500000000);d=Hbb(b,500000000);d=wbb(Nbb(d,1),xbb(a,1))}return Mbb(Nbb(d,32),xbb(c,Yje))} +function oQb(a,b,c){var d,e;d=(sCb(b.b!=0),BD(Nsb(b,b.a.a),8));switch(c.g){case 0:d.b=0;break;case 2:d.b=a.f;break;case 3:d.a=0;break;default:d.a=a.g;}e=Jsb(b,0);Vsb(e,d);return b} +function pmc(a,b,c,d){var e,f,g,h,i;i=a.b;f=b.d;g=f.j;h=umc(g,i.d[g.g],c);e=P6c(R6c(f.n),f.a);switch(f.j.g){case 1:case 3:h.a+=e.a;break;case 2:case 4:h.b+=e.b;}Gsb(d,h,d.c.b,d.c)} +function yJc(a,b,c){var d,e,f,g;g=Jkb(a.e,b,0);f=new zJc;f.b=c;d=new Bib(a.e,g);while(d.b1;b>>=1){(b&1)!=0&&(d=Ogb(d,c));c.d==1?(c=Ogb(c,c)):(c=new Xgb(Lhb(c.a,c.d,KC(WD,oje,25,c.d<<1,15,1))))}d=Ogb(d,c);return d} +function zub(){zub=ccb;var a,b,c,d;wub=KC(UD,Vje,25,25,15,1);xub=KC(UD,Vje,25,33,15,1);d=1.52587890625E-5;for(b=32;b>=0;b--){xub[b]=d;d*=0.5}c=1;for(a=24;a>=0;a--){wub[a]=c;c*=0.5}} +function S1b(a){var b,c;if(Ccb(DD(hkd(a,(Nyc(),fxc))))){for(c=new Sr(ur(_sd(a).a.Kc(),new Sq));Qr(c);){b=BD(Rr(c),79);if(Qld(b)){if(Ccb(DD(hkd(b,gxc)))){return true}}}}return false} +function kjc(a,b){var c,d,e;if(Qqb(a.f,b)){b.b=a;d=b.c;Jkb(a.j,d,0)!=-1||Ekb(a.j,d);e=b.d;Jkb(a.j,e,0)!=-1||Ekb(a.j,e);c=b.a.b;if(c.c.length!=0){!a.i&&(a.i=new vjc(a));qjc(a.i,c)}}} +function rmc(a){var b,c,d,e,f;c=a.c.d;d=c.j;e=a.d.d;f=e.j;if(d==f){return c.p=0&&dfb(a.substr(b,'GMT'.length),'GMT')){c[0]=b+3;return tA(a,c,d)}if(b>=0&&dfb(a.substr(b,'UTC'.length),'UTC')){c[0]=b+3;return tA(a,c,d)}return tA(a,c,d)} +function tjc(a,b){var c,d,e,f,g;f=a.g.a;g=a.g.b;for(d=new olb(a.d);d.ac;f--){a[f]|=b[f-c-1]>>>g;a[f-1]=b[f-c-1]<=a.f){break}f.c[f.c.length]=c}return f} +function sfd(a){var b,c,d,e;b=null;for(e=new olb(a.wf());e.a0&&$fb(a.g,b,a.g,b+d,h);g=c.Kc();a.i+=d;for(e=0;ef&&nfb(j,sfb(c[h],ltb))){e=h;f=i}}e>=0&&(d[0]=b+f);return e} +function MIb(a,b){var c;c=NIb(a.b.Hf(),b.b.Hf());if(c!=0){return c}switch(a.b.Hf().g){case 1:case 2:return beb(a.b.sf(),b.b.sf());case 3:case 4:return beb(b.b.sf(),a.b.sf());}return 0} +function iRb(a){var b,c,d;d=a.e.c.length;a.a=IC(WD,[nie,oje],[48,25],15,[d,d],2);for(c=new olb(a.c);c.a>4&15;f=a[d]&15;g[e++]=Qmd[c];g[e++]=Qmd[f]}return zfb(g,0,g.length)}} +function j3d(a,b,c){var d,e,f;d=b.ak();f=b.dd();e=d.$j()?H2d(a,4,d,f,null,M2d(a,d,f,JD(d,99)&&(BD(d,18).Bb&Tje)!=0),true):H2d(a,d.Kj()?2:1,d,f,d.zj(),-1,true);c?c.Ei(e):(c=e);return c} +function wfb(a){var b,c;if(a>=Tje){b=Uje+(a-Tje>>10&1023)&aje;c=56320+(a-Tje&1023)&aje;return String.fromCharCode(b)+(''+String.fromCharCode(c))}else{return String.fromCharCode(a&aje)}} +function bKb(a,b){$Jb();var c,d,e,f;e=BD(BD(Qc(a.r,b),21),84);if(e.gc()>=2){d=BD(e.Kc().Pb(),111);c=a.u.Hc((rcd(),mcd));f=a.u.Hc(qcd);return !d.a&&!c&&(e.gc()==2||f)}else{return false}} +function IVc(a,b,c,d,e){var f,g,h;f=JVc(a,b,c,d,e);h=false;while(!f){AVc(a,e,true);h=true;f=JVc(a,b,c,d,e)}h&&AVc(a,e,false);g=dVc(e);if(g.c.length!=0){!!a.d&&a.d.lg(g);IVc(a,e,c,d,g)}} +function Mad(){Mad=ccb;Kad=new Nad(ane,0);Iad=new Nad('DIRECTED',1);Lad=new Nad('UNDIRECTED',2);Gad=new Nad('ASSOCIATION',3);Jad=new Nad('GENERALIZATION',4);Had=new Nad('DEPENDENCY',5)} +function kfd(a,b){var c;if(!mpd(a)){throw vbb(new Zdb(Sse))}c=mpd(a);switch(b.g){case 1:return -(a.j+a.f);case 2:return a.i-c.g;case 3:return a.j-c.f;case 4:return -(a.i+a.g);}return 0} +function cub(a,b){var c,d;uCb(b);d=a.b.c.length;Ekb(a.b,b);while(d>0){c=d;d=(d-1)/2|0;if(a.a.ue(Ikb(a.b,d),b)<=0){Nkb(a.b,c,b);return true}Nkb(a.b,c,Ikb(a.b,d))}Nkb(a.b,d,b);return true} +function BHb(a,b,c,d){var e,f;e=0;if(!c){for(f=0;f=h} +function Tpd(a,b,c,d){var e;e=false;if(ND(d)){e=true;Upd(b,c,GD(d))}if(!e){if(KD(d)){e=true;Tpd(a,b,c,d)}}if(!e){if(JD(d,236)){e=true;Spd(b,c,BD(d,236))}}if(!e){throw vbb(new vcb(Ute))}} +function W0d(a,b){var c,d,e;c=b.Hh(a.a);if(c){e=AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),Sve);if(e!=null){for(d=1;d<(O6d(),K6d).length;++d){if(dfb(K6d[d],e)){return d}}}}return 0} +function X0d(a,b){var c,d,e;c=b.Hh(a.a);if(c){e=AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),Sve);if(e!=null){for(d=1;d<(O6d(),L6d).length;++d){if(dfb(L6d[d],e)){return d}}}}return 0} +function Ve(a,b){var c,d,e,f;uCb(b);f=a.a.gc();if(f0?1:0;while(f.a[e]!=c){f=f.a[e];e=a.a.ue(c.d,f.d)>0?1:0}f.a[e]=d;d.b=c.b;d.a[0]=c.a[0];d.a[1]=c.a[1];c.a[0]=null;c.a[1]=null} +function ucd(a){rcd();var b,c;b=qqb(ncd,OC(GC(E1,1),Kie,273,0,[pcd]));if(Ox(Cx(b,a))>1){return false}c=qqb(mcd,OC(GC(E1,1),Kie,273,0,[lcd,qcd]));if(Ox(Cx(c,a))>1){return false}return true} +function fod(a,b){var c;c=Phb((yFd(),xFd),a);JD(c,498)?Shb(xFd,a,new bUd(this,b)):Shb(xFd,a,this);bod(this,b);if(b==(LFd(),KFd)){this.wb=BD(this,1939);BD(b,1941)}else{this.wb=(NFd(),MFd)}} +function lZd(b){var c,d,e;if(b==null){return null}c=null;for(d=0;d=_ie?'error':d>=900?'warn':d>=800?'info':'log');gCb(c,a.a);!!a.b&&hCb(b,c,a.b,'Exception: ',true)} +function vNb(a,b){var c,d;d=(!a.q&&(a.q=new Lqb),Ohb(a.q,b));if(d!=null){return d}c=b.wg();JD(c,4)&&(c==null?(!a.q&&(a.q=new Lqb),Thb(a.q,b)):(!a.q&&(a.q=new Lqb),Rhb(a.q,b,c)),a);return c} +function qUb(){qUb=ccb;lUb=new rUb('P1_CYCLE_BREAKING',0);mUb=new rUb('P2_LAYERING',1);nUb=new rUb('P3_NODE_ORDERING',2);oUb=new rUb('P4_NODE_PLACEMENT',3);pUb=new rUb('P5_EDGE_ROUTING',4)} +function SUb(a,b){var c,d,e,f,g;e=b==1?KUb:JUb;for(d=e.a.ec().Kc();d.Ob();){c=BD(d.Pb(),103);for(g=BD(Qc(a.f.c,c),21).Kc();g.Ob();){f=BD(g.Pb(),46);Lkb(a.b.b,f.b);Lkb(a.b.a,BD(f.b,81).d)}}} +function IWb(a,b){AWb();var c;if(a.c==b.c){if(a.b==b.b||pWb(a.b,b.b)){c=mWb(a.b)?1:-1;if(a.a&&!b.a){return c}else if(!a.a&&b.a){return -c}}return beb(a.b.g,b.b.g)}else{return Kdb(a.c,b.c)}} +function y6b(a,b){var c;Odd(b,'Hierarchical port position processing',1);c=a.b;c.c.length>0&&x6b((tCb(0,c.c.length),BD(c.c[0],29)),a);c.c.length>1&&x6b(BD(Ikb(c,c.c.length-1),29),a);Qdd(b)} +function RVc(a,b){var c,d,e;if(CVc(a,b)){return true}for(d=new olb(b);d.a=e||b<0)throw vbb(new qcb(lue+b+mue+e));if(c>=e||c<0)throw vbb(new qcb(nue+c+mue+e));b!=c?(d=(f=a.Ti(c),a.Hi(b,f),f)):(d=a.Oi(c));return d} +function m6d(a){var b,c,d;d=a;if(a){b=0;for(c=a.Ug();c;c=c.Ug()){if(++b>Wje){return m6d(c)}d=c;if(c==a){throw vbb(new Zdb('There is a cycle in the containment hierarchy of '+a))}}}return d} +function Fe(a){var b,c,d;d=new xwb(She,'[',']');for(c=a.Kc();c.Ob();){b=c.Pb();uwb(d,PD(b)===PD(a)?'(this Collection)':b==null?Xhe:fcb(b))}return !d.a?d.c:d.e.length==0?d.a.a:d.a.a+(''+d.e)} +function CVc(a,b){var c,d;d=false;if(b.gc()<2){return false}for(c=0;cd&&(BCb(b-1,a.length),a.charCodeAt(b-1)<=32)){--b}return d>0||b1&&(a.j.b+=a.e)}else{a.j.a+=c.a;a.j.b=$wnd.Math.max(a.j.b,c.b);a.d.c.length>1&&(a.j.a+=a.e)}} +function gkc(){gkc=ccb;dkc=OC(GC(F1,1),bne,61,0,[(Ucd(),Acd),zcd,Rcd]);ckc=OC(GC(F1,1),bne,61,0,[zcd,Rcd,Tcd]);ekc=OC(GC(F1,1),bne,61,0,[Rcd,Tcd,Acd]);fkc=OC(GC(F1,1),bne,61,0,[Tcd,Acd,zcd])} +function omc(a,b,c,d){var e,f,g,h,i,j,k;g=a.c.d;h=a.d.d;if(g.j==h.j){return}k=a.b;e=g.j;i=null;while(e!=h.j){i=b==0?Xcd(e):Vcd(e);f=umc(e,k.d[e.g],c);j=umc(i,k.d[i.g],c);Dsb(d,P6c(f,j));e=i}} +function oFc(a,b,c,d){var e,f,g,h,i;g=JHc(a.a,b,c);h=BD(g.a,19).a;f=BD(g.b,19).a;if(d){i=BD(vNb(b,(wtc(),gtc)),10);e=BD(vNb(c,gtc),10);if(!!i&&!!e){mic(a.b,i,e);h+=a.b.i;f+=a.b.e}}return h>f} +function oHc(a){var b,c,d,e,f,g,h,i,j;this.a=lHc(a);this.b=new Rkb;for(c=a,d=0,e=c.length;dwic(a.d).c){a.i+=a.g.c;yic(a.d)}else if(wic(a.d).c>wic(a.g).c){a.e+=a.d.c;yic(a.g)}else{a.i+=vic(a.g);a.e+=vic(a.d);yic(a.g);yic(a.d)}}} +function XOc(a,b,c){var d,e,f,g;f=b.q;g=b.r;new DOc((HOc(),FOc),b,f,1);new DOc(FOc,f,g,1);for(e=new olb(c);e.ah&&(i=h/d);e>f&&(j=f/e);g=$wnd.Math.min(i,j);a.a+=g*(b.a-a.a);a.b+=g*(b.b-a.b)} +function sZc(a,b,c,d,e){var f,g;g=false;f=BD(Ikb(c.b,0),33);while(yZc(a,b,f,d,e)){g=true;NZc(c,f);if(c.b.c.length==0){break}f=BD(Ikb(c.b,0),33)}c.b.c.length==0&&v$c(c.j,c);g&&a$c(b.q);return g} +function t6c(a,b){i6c();var c,d,e,f;if(b.b<2){return false}f=Jsb(b,0);c=BD(Xsb(f),8);d=c;while(f.b!=f.d.c){e=BD(Xsb(f),8);if(s6c(a,d,e)){return true}d=e}if(s6c(a,d,c)){return true}return false} +function ckd(a,b,c,d){var e,f;if(c==0){return !a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),bId(a.o,b,d)}return f=BD(XKd((e=BD(Ajd(a,16),26),!e?a.zh():e),c),66),f.Nj().Rj(a,yjd(a),c-aLd(a.zh()),b,d)} +function bod(a,b){var c;if(b!=a.sb){c=null;!!a.sb&&(c=BD(a.sb,49).ih(a,1,i5,c));!!b&&(c=BD(b,49).gh(a,1,i5,c));c=Jnd(a,b,c);!!c&&c.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,4,b,b))} +function yqd(a,b){var c,d,e,f;if(b){e=Xpd(b,'x');c=new zrd(a);hmd(c.a,(uCb(e),e));f=Xpd(b,'y');d=new Ard(a);imd(d.a,(uCb(f),f))}else{throw vbb(new cqd('All edge sections need an end point.'))}} +function wqd(a,b){var c,d,e,f;if(b){e=Xpd(b,'x');c=new wrd(a);omd(c.a,(uCb(e),e));f=Xpd(b,'y');d=new xrd(a);pmd(d.a,(uCb(f),f))}else{throw vbb(new cqd('All edge sections need a start point.'))}} +function pyb(a,b){var c,d,e,f,g,h,i;for(d=syb(a),f=0,h=d.length;f>22-b;e=a.h<>22-b}else if(b<44){c=0;d=a.l<>44-b}else{c=0;d=0;e=a.l<a){throw vbb(new Wdb('k must be smaller than n'))}else return b==0||b==a?1:a==0?0:q6c(a)/(q6c(b)*q6c(a-b))} +function jfd(a,b){var c,d,e,f;c=new _ud(a);while(c.g==null&&!c.c?Uud(c):c.g==null||c.i!=0&&BD(c.g[c.i-1],47).Ob()){f=BD(Vud(c),56);if(JD(f,160)){d=BD(f,160);for(e=0;e>4];b[c*2+1]=gde[f&15]}return zfb(b,0,b.length)} +function fn(a){Vm();var b,c,d;d=a.c.length;switch(d){case 0:return Um;case 1:b=BD(qr(new olb(a)),42);return ln(b.cd(),b.dd());default:c=BD(Qkb(a,KC(CK,zie,42,a.c.length,0,1)),165);return new wx(c);}} +function ITb(a){var b,c,d,e,f,g;b=new jkb;c=new jkb;Wjb(b,a);Wjb(c,a);while(c.b!=c.c){e=BD(fkb(c),37);for(g=new olb(e.a);g.a0&&WGc(a,c,b);return e}return TGc(a,b,c)} +function MSc(a,b,c){var d,e,f,g;if(b.b!=0){d=new Psb;for(g=Jsb(b,0);g.b!=g.d.c;){f=BD(Xsb(g),86);ye(d,URc(f));e=f.e;e.a=BD(vNb(f,(mTc(),kTc)),19).a;e.b=BD(vNb(f,lTc),19).a}MSc(a,d,Udd(c,d.b/a.a|0))}} +function JZc(a,b){var c,d,e,f,g;if(a.e<=b){return a.g}if(LZc(a,a.g,b)){return a.g}f=a.r;d=a.g;g=a.r;e=(f-d)/2+d;while(d+11&&(a.e.b+=a.a)}else{a.e.a+=c.a;a.e.b=$wnd.Math.max(a.e.b,c.b);a.d.c.length>1&&(a.e.a+=a.a)}} +function cmc(a){var b,c,d,e;e=a.i;b=e.b;d=e.j;c=e.g;switch(e.a.g){case 0:c.a=(a.g.b.o.a-d.a)/2;break;case 1:c.a=b.d.n.a+b.d.a.a;break;case 2:c.a=b.d.n.a+b.d.a.a-d.a;break;case 3:c.b=b.d.n.b+b.d.a.b;}} +function Q6c(a,b,c,d,e){if(dd&&(a.a=d);a.be&&(a.b=e);return a} +function lsd(a){if(JD(a,149)){return esd(BD(a,149))}else if(JD(a,229)){return fsd(BD(a,229))}else if(JD(a,23)){return gsd(BD(a,23))}else{throw vbb(new Wdb(Xte+Fe(new amb(OC(GC(SI,1),Uhe,1,5,[a])))))}} +function mhb(a,b,c,d,e){var f,g,h;f=true;for(g=0;g>>e|c[g+d+1]<>>e;++g}return f} +function zMc(a,b,c,d){var e,f,g;if(b.k==(j0b(),g0b)){for(f=new Sr(ur(R_b(b).a.Kc(),new Sq));Qr(f);){e=BD(Rr(f),17);g=e.c.i.k;if(g==g0b&&a.c.a[e.c.i.c.p]==d&&a.c.a[b.c.p]==c){return true}}}return false} +function mD(a,b){var c,d,e,f;b&=63;c=a.h&Fje;if(b<22){f=c>>>b;e=a.m>>b|c<<22-b;d=a.l>>b|a.m<<22-b}else if(b<44){f=0;e=c>>>b-22;d=a.m>>b-22|a.h<<44-b}else{f=0;e=0;d=c>>>b-44}return TC(d&Eje,e&Eje,f&Fje)} +function Iic(a,b,c,d){var e;this.b=d;this.e=a==(rGc(),pGc);e=b[c];this.d=IC(sbb,[nie,dle],[177,25],16,[e.length,e.length],2);this.a=IC(WD,[nie,oje],[48,25],15,[e.length,e.length],2);this.c=new sic(b,c)} +function ljc(a){var b,c,d;a.k=new Ki((Ucd(),OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])).length,a.j.c.length);for(d=new olb(a.j);d.a=c){K9b(a,b,d.p);return true}}return false} +function Iod(a){var b;if((a.Db&64)!=0)return fld(a);b=new Wfb(dte);!a.a||Qfb(Qfb((b.a+=' "',b),a.a),'"');Qfb(Lfb(Qfb(Lfb(Qfb(Lfb(Qfb(Lfb((b.a+=' (',b),a.i),','),a.j),' | '),a.g),','),a.f),')');return b.a} +function Z2d(a,b,c){var d,e,f,g,h;h=S6d(a.e.Tg(),b);e=BD(a.g,119);d=0;for(g=0;gc){return Jb(a,c,'start index')}if(b<0||b>c){return Jb(b,c,'end index')}return hc('end index (%s) must not be less than start index (%s)',OC(GC(SI,1),Uhe,1,5,[meb(b),meb(a)]))} +function Pz(b,c){var d,e,f,g;for(e=0,f=b.length;e0&&iCc(a,f,c))}}b.p=0} +function p5c(a){var b;this.c=new Psb;this.f=a.e;this.e=a.d;this.i=a.g;this.d=a.c;this.b=a.b;this.k=a.j;this.a=a.a;!a.i?(this.j=(b=BD(gdb(e1),9),new xqb(b,BD(_Bb(b,b.length),9),0))):(this.j=a.i);this.g=a.f} +function Wb(a){var b,c,d,e;b=Kfb(Qfb(new Wfb('Predicates.'),'and'),40);c=true;for(e=new vib(a);e.b0?h[g-1]:KC(OQ,kne,10,0,0,1);e=h[g];j=g=0?a.Bh(e):vid(a,d)}else{throw vbb(new Wdb(ite+d.ne()+jte))}}else{eid(a,c,d)}} +function aqd(a){var b,c;c=null;b=false;if(JD(a,204)){b=true;c=BD(a,204).a}if(!b){if(JD(a,258)){b=true;c=''+BD(a,258).a}}if(!b){if(JD(a,483)){b=true;c=''+BD(a,483).a}}if(!b){throw vbb(new vcb(Ute))}return c} +function ORd(a,b){var c,d;if(a.f){while(b.Ob()){c=BD(b.Pb(),72);d=c.ak();if(JD(d,99)&&(BD(d,18).Bb&ote)!=0&&(!a.e||d.Gj()!=x2||d.aj()!=0)&&c.dd()!=null){b.Ub();return true}}return false}else{return b.Ob()}} +function QRd(a,b){var c,d;if(a.f){while(b.Sb()){c=BD(b.Ub(),72);d=c.ak();if(JD(d,99)&&(BD(d,18).Bb&ote)!=0&&(!a.e||d.Gj()!=x2||d.aj()!=0)&&c.dd()!=null){b.Pb();return true}}return false}else{return b.Sb()}} +function I2d(a,b,c){var d,e,f,g,h,i;i=S6d(a.e.Tg(),b);d=0;h=a.i;e=BD(a.g,119);for(g=0;g1&&(b.c[b.c.length]=f,true)}} +function TJc(a){var b,c,d,e;c=new Psb;ye(c,a.o);d=new twb;while(c.b!=0){b=BD(c.b==0?null:(sCb(c.b!=0),Nsb(c,c.a.a)),508);e=KJc(a,b,true);e&&Ekb(d.a,b)}while(d.a.c.length!=0){b=BD(rwb(d),508);KJc(a,b,false)}} +function _5c(){_5c=ccb;$5c=new a6c(ole,0);T5c=new a6c('BOOLEAN',1);X5c=new a6c('INT',2);Z5c=new a6c('STRING',3);U5c=new a6c('DOUBLE',4);V5c=new a6c('ENUM',5);W5c=new a6c('ENUMSET',6);Y5c=new a6c('OBJECT',7)} +function H6c(a,b){var c,d,e,f,g;d=$wnd.Math.min(a.c,b.c);f=$wnd.Math.min(a.d,b.d);e=$wnd.Math.max(a.c+a.b,b.c+b.b);g=$wnd.Math.max(a.d+a.a,b.d+b.a);if(e=(e/2|0)){this.e=!d?null:d.c;this.d=e;while(c++0){uu(this)}}this.b=b;this.a=null} +function rEb(a,b){var c,d;b.a?sEb(a,b):(c=BD(Exb(a.b,b.b),57),!!c&&c==a.a[b.b.f]&&!!c.a&&c.a!=b.b.a&&c.c.Fc(b.b),d=BD(Dxb(a.b,b.b),57),!!d&&a.a[d.f]==b.b&&!!d.a&&d.a!=b.b.a&&b.b.c.Fc(d),Fxb(a.b,b.b),undefined)} +function FJb(a,b){var c,d;c=BD(Mpb(a.b,b),124);if(BD(BD(Qc(a.r,b),21),84).dc()){c.n.b=0;c.n.c=0;return}c.n.b=a.C.b;c.n.c=a.C.c;a.A.Hc((tdd(),sdd))&&KJb(a,b);d=JJb(a,b);KIb(a,b)==(Tbd(),Qbd)&&(d+=2*a.w);c.a.a=d} +function OKb(a,b){var c,d;c=BD(Mpb(a.b,b),124);if(BD(BD(Qc(a.r,b),21),84).dc()){c.n.d=0;c.n.a=0;return}c.n.d=a.C.d;c.n.a=a.C.a;a.A.Hc((tdd(),sdd))&&SKb(a,b);d=RKb(a,b);KIb(a,b)==(Tbd(),Qbd)&&(d+=2*a.w);c.a.b=d} +function cOb(a,b){var c,d,e,f;f=new Rkb;for(d=new olb(b);d.ac.a&&(d.Hc((i8c(),c8c))?(e=(b.a-c.a)/2):d.Hc(e8c)&&(e=b.a-c.a));b.b>c.b&&(d.Hc((i8c(),g8c))?(f=(b.b-c.b)/2):d.Hc(f8c)&&(f=b.b-c.b));Efd(a,e,f)} +function aod(a,b,c,d,e,f,g,h,i,j,k,l,m){JD(a.Cb,88)&&XMd($Kd(BD(a.Cb,88)),4);pnd(a,c);a.f=g;dJd(a,h);fJd(a,i);ZId(a,j);eJd(a,k);CId(a,l);aJd(a,m);BId(a,true);AId(a,e);a.ok(f);yId(a,b);d!=null&&(a.i=null,_Id(a,d))} +function PRd(a){var b,c;if(a.f){while(a.n>0){b=BD(a.k.Xb(a.n-1),72);c=b.ak();if(JD(c,99)&&(BD(c,18).Bb&ote)!=0&&(!a.e||c.Gj()!=x2||c.aj()!=0)&&b.dd()!=null){return true}else{--a.n}}return false}else{return a.n>0}} +function Jb(a,b,c){if(a<0){return hc(The,OC(GC(SI,1),Uhe,1,5,[c,meb(a)]))}else if(b<0){throw vbb(new Wdb(Vhe+b))}else{return hc('%s (%s) must not be greater than size (%s)',OC(GC(SI,1),Uhe,1,5,[c,meb(a),meb(b)]))}} +function Llb(a,b,c,d,e,f){var g,h,i,j;g=d-c;if(g<7){Ilb(b,c,d,f);return}i=c+e;h=d+e;j=i+(h-i>>1);Llb(b,a,i,j,-e,f);Llb(b,a,j,h,-e,f);if(f.ue(a[j-1],a[j])<=0){while(c=0?a.sh(f,c):uid(a,e,c)}else{throw vbb(new Wdb(ite+e.ne()+jte))}}else{did(a,d,e,c)}} +function q6d(b){var c,d,e,f;d=BD(b,49).qh();if(d){try{e=null;c=nUd((yFd(),xFd),LEd(MEd(d)));if(c){f=c.rh();!!f&&(e=f.Wk(tfb(d.e)))}if(!!e&&e!=b){return q6d(e)}}catch(a){a=ubb(a);if(!JD(a,60))throw vbb(a)}}return b} +function jrb(a,b,c){var d,e,f,g;g=b==null?0:a.b.se(b);e=(d=a.a.get(g),d==null?new Array:d);if(e.length==0){a.a.set(g,e)}else{f=grb(a,b,e);if(f){return f.ed(c)}}NC(e,e.length,new pjb(b,c));++a.c;zpb(a.b);return null} +function YUc(a,b){var c,d;H2c(a.a);K2c(a.a,(PUc(),NUc),NUc);K2c(a.a,OUc,OUc);d=new j3c;e3c(d,OUc,(tVc(),sVc));PD(hkd(b,(ZWc(),LWc)))!==PD((pWc(),mWc))&&e3c(d,OUc,qVc);e3c(d,OUc,rVc);E2c(a.a,d);c=F2c(a.a,b);return c} +function uC(a){if(!a){return OB(),NB}var b=a.valueOf?a.valueOf():a;if(b!==a){var c=qC[typeof b];return c?c(b):xC(typeof b)}else if(a instanceof Array||a instanceof $wnd.Array){return new xB(a)}else{return new fC(a)}} +function RJb(a,b,c){var d,e,f;f=a.o;d=BD(Mpb(a.p,c),244);e=d.i;e.b=gIb(d);e.a=fIb(d);e.b=$wnd.Math.max(e.b,f.a);e.b>f.a&&!b&&(e.b=f.a);e.c=-(e.b-f.a)/2;switch(c.g){case 1:e.d=-e.a;break;case 3:e.d=f.b;}hIb(d);iIb(d)} +function SJb(a,b,c){var d,e,f;f=a.o;d=BD(Mpb(a.p,c),244);e=d.i;e.b=gIb(d);e.a=fIb(d);e.a=$wnd.Math.max(e.a,f.b);e.a>f.b&&!b&&(e.a=f.b);e.d=-(e.a-f.b)/2;switch(c.g){case 4:e.c=-e.b;break;case 2:e.c=f.a;}hIb(d);iIb(d)} +function Jgc(a,b){var c,d,e,f,g;if(b.dc()){return}e=BD(b.Xb(0),128);if(b.gc()==1){Igc(a,e,e,1,0,b);return}c=1;while(c0){try{f=Icb(c,Rie,Ohe)}catch(a){a=ubb(a);if(JD(a,127)){e=a;throw vbb(new rFd(e))}else throw vbb(a)}}d=(!b.a&&(b.a=new z0d(b)),b.a);return f=0?BD(qud(d,f),56):null} +function Ib(a,b){if(a<0){return hc(The,OC(GC(SI,1),Uhe,1,5,['index',meb(a)]))}else if(b<0){throw vbb(new Wdb(Vhe+b))}else{return hc('%s (%s) must be less than size (%s)',OC(GC(SI,1),Uhe,1,5,['index',meb(a),meb(b)]))}} +function Slb(a){var b,c,d,e,f;if(a==null){return Xhe}f=new xwb(She,'[',']');for(c=a,d=0,e=c.length;d0){g=a.c.d;h=a.d.d;e=Y6c(c7c(new f7c(h.a,h.b),g),1/(d+1));f=new f7c(g.a,g.b);for(c=new olb(a.a);c.a=0?a._g(c,true,true):sid(a,e,true),153));BD(d,215).ol(b)}else{throw vbb(new Wdb(ite+b.ne()+jte))}} +function ugb(a){var b,c;if(a>-140737488355328&&a<140737488355328){if(a==0){return 0}b=a<0;b&&(a=-a);c=QD($wnd.Math.floor($wnd.Math.log(a)/0.6931471805599453));(!b||a!=$wnd.Math.pow(2,c))&&++c;return c}return vgb(Cbb(a))} +function QOc(a){var b,c,d,e,f,g,h;f=new zsb;for(c=new olb(a);c.a2&&h.e.b+h.j.b<=2){e=h;d=g}f.a.zc(e,f);e.q=d}return f} +function K5b(a,b){var c,d,e;d=new b0b(a);tNb(d,b);yNb(d,(wtc(),Gsc),b);yNb(d,(Nyc(),Vxc),(dcd(),$bd));yNb(d,mwc,(F7c(),B7c));__b(d,(j0b(),e0b));c=new H0b;F0b(c,d);G0b(c,(Ucd(),Tcd));e=new H0b;F0b(e,d);G0b(e,zcd);return d} +function Spc(a){switch(a.g){case 0:return new fGc((rGc(),oGc));case 1:return new CFc;case 2:return new fHc;default:throw vbb(new Wdb('No implementation is available for the crossing minimizer '+(a.f!=null?a.f:''+a.g)));}} +function tDc(a,b){var c,d,e,f,g;a.c[b.p]=true;Ekb(a.a,b);for(g=new olb(b.j);g.a=f){g.$b()}else{e=g.Kc();for(d=0;d0?zh():g<0&&Bw(a,b,-g);return true}else{return false}} +function fIb(a){var b,c,d,e,f,g,h;h=0;if(a.b==0){g=jIb(a,true);b=0;for(d=g,e=0,f=d.length;e0){h+=c;++b}}b>1&&(h+=a.c*(b-1))}else{h=Mtb(Zzb(OAb(JAb(Plb(a.a),new xIb),new zIb)))}return h>0?h+a.n.d+a.n.a:0} +function gIb(a){var b,c,d,e,f,g,h;h=0;if(a.b==0){h=Mtb(Zzb(OAb(JAb(Plb(a.a),new tIb),new vIb)))}else{g=kIb(a,true);b=0;for(d=g,e=0,f=d.length;e0){h+=c;++b}}b>1&&(h+=a.c*(b-1))}return h>0?h+a.n.b+a.n.c:0} +function MJb(a,b){var c,d,e,f;f=BD(Mpb(a.b,b),124);c=f.a;for(e=BD(BD(Qc(a.r,b),21),84).Kc();e.Ob();){d=BD(e.Pb(),111);!!d.c&&(c.a=$wnd.Math.max(c.a,ZHb(d.c)))}if(c.a>0){switch(b.g){case 2:f.n.c=a.s;break;case 4:f.n.b=a.s;}}} +function NQb(a,b){var c,d,e;c=BD(vNb(b,(wSb(),oSb)),19).a-BD(vNb(a,oSb),19).a;if(c==0){d=c7c(R6c(BD(vNb(a,(HSb(),DSb)),8)),BD(vNb(a,ESb),8));e=c7c(R6c(BD(vNb(b,DSb),8)),BD(vNb(b,ESb),8));return Kdb(d.a*d.b,e.a*e.b)}return c} +function iRc(a,b){var c,d,e;c=BD(vNb(b,(JTc(),ETc)),19).a-BD(vNb(a,ETc),19).a;if(c==0){d=c7c(R6c(BD(vNb(a,(mTc(),VSc)),8)),BD(vNb(a,WSc),8));e=c7c(R6c(BD(vNb(b,VSc),8)),BD(vNb(b,WSc),8));return Kdb(d.a*d.b,e.a*e.b)}return c} +function TZb(a){var b,c;c=new Ufb;c.a+='e_';b=KZb(a);b!=null&&(c.a+=''+b,c);if(!!a.c&&!!a.d){Qfb((c.a+=' ',c),C0b(a.c));Qfb(Pfb((c.a+='[',c),a.c.i),']');Qfb((c.a+=gne,c),C0b(a.d));Qfb(Pfb((c.a+='[',c),a.d.i),']')}return c.a} +function zRc(a){switch(a.g){case 0:return new lUc;case 1:return new sUc;case 2:return new CUc;case 3:return new IUc;default:throw vbb(new Wdb('No implementation is available for the layout phase '+(a.f!=null?a.f:''+a.g)));}} +function mfd(a,b,c,d,e){var f;f=0;switch(e.g){case 1:f=$wnd.Math.max(0,b.b+a.b-(c.b+d));break;case 3:f=$wnd.Math.max(0,-a.b-d);break;case 2:f=$wnd.Math.max(0,-a.a-d);break;case 4:f=$wnd.Math.max(0,b.a+a.a-(c.a+d));}return f} +function mqd(a,b,c){var d,e,f,g,h;if(c){e=c.a.length;d=new Yge(e);for(h=(d.b-d.a)*d.c<0?(Xge(),Wge):new she(d);h.Ob();){g=BD(h.Pb(),19);f=Zpd(c,g.a);Lte in f.a||Mte in f.a?$qd(a,f,b):erd(a,f,b);otd(BD(Ohb(a.b,Wpd(f)),79))}}} +function LJd(a){var b,c;switch(a.b){case -1:{return true}case 0:{c=a.t;if(c>1||c==-1){a.b=-1;return true}else{b=wId(a);if(!!b&&(Q6d(),b.Cj()==Bve)){a.b=-1;return true}else{a.b=1;return false}}}default:case 1:{return false}}} +function k1d(a,b){var c,d,e,f,g;d=(!b.s&&(b.s=new cUd(t5,b,21,17)),b.s);f=null;for(e=0,g=d.i;e=0&&f=0?a._g(c,true,true):sid(a,e,true),153));return BD(d,215).ll(b)}else{throw vbb(new Wdb(ite+b.ne()+lte))}} +function BZd(){tZd();var a;if(sZd)return BD(nUd((yFd(),xFd),_ve),1939);rEd(CK,new J_d);CZd();a=BD(JD(Phb((yFd(),xFd),_ve),547)?Phb(xFd,_ve):new AZd,547);sZd=true;yZd(a);zZd(a);Rhb((JFd(),IFd),a,new EZd);Shb(xFd,_ve,a);return a} +function v2d(a,b){var c,d,e,f;a.j=-1;if(oid(a.e)){c=a.i;f=a.i!=0;lud(a,b);d=new pSd(a.e,3,a.c,null,b,c,f);e=b.Qk(a.e,a.c,null);e=h3d(a,b,e);if(!e){Uhd(a.e,d)}else{e.Ei(d);e.Fi()}}else{lud(a,b);e=b.Qk(a.e,a.c,null);!!e&&e.Fi()}} +function rA(a,b){var c,d,e;e=0;d=b[0];if(d>=a.length){return -1}c=(BCb(d,a.length),a.charCodeAt(d));while(c>=48&&c<=57){e=e*10+(c-48);++d;if(d>=a.length){break}c=(BCb(d,a.length),a.charCodeAt(d))}d>b[0]?(b[0]=d):(e=-1);return e} +function vMb(a){var b,c,d,e,f;e=BD(a.a,19).a;f=BD(a.b,19).a;c=e;d=f;b=$wnd.Math.max($wnd.Math.abs(e),$wnd.Math.abs(f));if(e<=0&&e==f){c=0;d=f-1}else{if(e==-b&&f!=b){c=f;d=e;f>=0&&++c}else{c=-f;d=e}}return new vgd(meb(c),meb(d))} +function fNb(a,b,c,d){var e,f,g,h,i,j;for(e=0;e=0&&j>=0&&i=a.i)throw vbb(new qcb(lue+b+mue+a.i));if(c>=a.i)throw vbb(new qcb(nue+c+mue+a.i));d=a.g[c];if(b!=c){b>16);b=d>>16&16;c=16-b;a=a>>b;d=a-256;b=d>>16&8;c+=b;a<<=b;d=a-Rje;b=d>>16&4;c+=b;a<<=b;d=a-oie;b=d>>16&2;c+=b;a<<=b;d=a>>14;b=d&~(d>>1);return c+2-b}} +function $Pb(a){QPb();var b,c,d,e;PPb=new Rkb;OPb=new Lqb;NPb=new Rkb;b=(!a.a&&(a.a=new cUd(E2,a,10,11)),a.a);SPb(b);for(e=new Fyd(b);e.e!=e.i.gc();){d=BD(Dyd(e),33);if(Jkb(PPb,d,0)==-1){c=new Rkb;Ekb(NPb,c);TPb(d,c)}}return NPb} +function BQb(a,b,c){var d,e,f,g;a.a=c.b.d;if(JD(b,352)){e=itd(BD(b,79),false,false);f=ofd(e);d=new FQb(a);reb(f,d);ifd(f,e);b.We((Y9c(),Q8c))!=null&&reb(BD(b.We(Q8c),74),d)}else{g=BD(b,470);g.Hg(g.Dg()+a.a.a);g.Ig(g.Eg()+a.a.b)}} +function _5b(a,b){var c,d,e,f,g,h,i,j;j=Edb(ED(vNb(b,(Nyc(),zyc))));i=a[0].n.a+a[0].o.a+a[0].d.c+j;for(h=1;h=0){return c}h=U6c(c7c(new f7c(g.c+g.b/2,g.d+g.a/2),new f7c(f.c+f.b/2,f.d+f.a/2)));return -(xOb(f,g)-1)*h} +function ufd(a,b,c){var d;MAb(new YAb(null,(!c.a&&(c.a=new cUd(A2,c,6,6)),new Kub(c.a,16))),new Mfd(a,b));MAb(new YAb(null,(!c.n&&(c.n=new cUd(D2,c,1,7)),new Kub(c.n,16))),new Ofd(a,b));d=BD(hkd(c,(Y9c(),Q8c)),74);!!d&&p7c(d,a,b)} +function sid(a,b,c){var d,e,f;f=e1d((O6d(),M6d),a.Tg(),b);if(f){Q6d();BD(f,66).Oj()||(f=_1d(q1d(M6d,f)));e=(d=a.Yg(f),BD(d>=0?a._g(d,true,true):sid(a,f,true),153));return BD(e,215).hl(b,c)}else{throw vbb(new Wdb(ite+b.ne()+lte))}} +function wAd(a,b,c,d){var e,f,g,h,i;e=a.d[b];if(e){f=e.g;i=e.i;if(d!=null){for(h=0;h=c){d=b;j=(i.c+i.a)/2;g=j-c;if(i.c<=j-c){e=new bPc(i.c,g);Dkb(a,d++,e)}h=j+c;if(h<=i.a){f=new bPc(h,i.a);wCb(d,a.c.length);aCb(a.c,d,f)}}} +function u0d(a){var b;if(!a.c&&a.g==null){a.d=a.si(a.f);wtd(a,a.d);b=a.d}else{if(a.g==null){return true}else if(a.i==0){return false}else{b=BD(a.g[a.i-1],47)}}if(b==a.b&&null.km>=null.jm()){Vud(a);return u0d(a)}else{return b.Ob()}} +function KTb(a,b,c){var d,e,f,g,h;h=c;!h&&(h=Ydd(new Zdd,0));Odd(h,Vme,1);aUb(a.c,b);g=EYb(a.a,b);if(g.gc()==1){MTb(BD(g.Xb(0),37),h)}else{f=1/g.gc();for(e=g.Kc();e.Ob();){d=BD(e.Pb(),37);MTb(d,Udd(h,f))}}CYb(a.a,g,b);NTb(b);Qdd(h)} +function qYb(a){this.a=a;if(a.c.i.k==(j0b(),e0b)){this.c=a.c;this.d=BD(vNb(a.c.i,(wtc(),Hsc)),61)}else if(a.d.i.k==e0b){this.c=a.d;this.d=BD(vNb(a.d.i,(wtc(),Hsc)),61)}else{throw vbb(new Wdb('Edge '+a+' is not an external edge.'))}} +function oQd(a,b){var c,d,e;e=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,e,a.b));if(!b){pnd(a,null);qQd(a,0);pQd(a,null)}else if(b!=a){pnd(a,b.zb);qQd(a,b.d);c=(d=b.c,d==null?b.zb:d);pQd(a,c==null||dfb(c,b.zb)?null:c)}} +function NRd(a){var b,c;if(a.f){while(a.n=g)throw vbb(new Cyd(b,g));e=c[b];if(g==1){d=null}else{d=KC($3,hve,415,g-1,0,1);$fb(c,0,d,0,b);f=g-b-1;f>0&&$fb(c,b+1,d,b,f)}b0d(a,d);a0d(a,b,e);return e} +function m8d(){m8d=ccb;k8d=BD(qud(ZKd((r8d(),q8d).qb),6),34);h8d=BD(qud(ZKd(q8d.qb),3),34);i8d=BD(qud(ZKd(q8d.qb),4),34);j8d=BD(qud(ZKd(q8d.qb),5),18);XId(k8d);XId(h8d);XId(i8d);XId(j8d);l8d=new amb(OC(GC(t5,1),Mve,170,0,[k8d,h8d]))} +function AJb(a,b){var c;this.d=new H_b;this.b=b;this.e=new g7c(b.qf());c=a.u.Hc((rcd(),ocd));a.u.Hc(ncd)?a.D?(this.a=c&&!b.If()):(this.a=true):a.u.Hc(pcd)?c?(this.a=!(b.zf().Kc().Ob()||b.Bf().Kc().Ob())):(this.a=false):(this.a=false)} +function IKb(a,b){var c,d,e,f;c=a.o.a;for(f=BD(BD(Qc(a.r,b),21),84).Kc();f.Ob();){e=BD(f.Pb(),111);e.e.a=(d=e.b,d.Xe((Y9c(),s9c))?d.Hf()==(Ucd(),Tcd)?-d.rf().a-Edb(ED(d.We(s9c))):c+Edb(ED(d.We(s9c))):d.Hf()==(Ucd(),Tcd)?-d.rf().a:c)}} +function Q1b(a,b){var c,d,e,f;c=BD(vNb(a,(Nyc(),Lwc)),103);f=BD(hkd(b,$xc),61);e=BD(vNb(a,Vxc),98);if(e!=(dcd(),bcd)&&e!=ccd){if(f==(Ucd(),Scd)){f=lfd(b,c);f==Scd&&(f=Zcd(c))}}else{d=M1b(b);d>0?(f=Zcd(c)):(f=Wcd(Zcd(c)))}jkd(b,$xc,f)} +function olc(a,b){var c,d,e,f,g;g=a.j;b.a!=b.b&&Okb(g,new Ulc);e=g.c.length/2|0;for(d=0;d0&&WGc(a,c,b);return f}else if(d.a!=null){WGc(a,b,c);return -1}else if(e.a!=null){WGc(a,c,b);return 1}return 0} +function swd(a,b){var c,d,e,f;if(a.ej()){c=a.Vi();f=a.fj();++a.j;a.Hi(c,a.oi(c,b));d=a.Zi(3,null,b,c,f);if(a.bj()){e=a.cj(b,null);if(!e){a.$i(d)}else{e.Ei(d);e.Fi()}}else{a.$i(d)}}else{Bvd(a,b);if(a.bj()){e=a.cj(b,null);!!e&&e.Fi()}}} +function D2d(a,b){var c,d,e,f,g;g=S6d(a.e.Tg(),b);e=new yud;c=BD(a.g,119);for(f=a.i;--f>=0;){d=c[f];g.rl(d.ak())&&wtd(e,d)}!Yxd(a,e)&&oid(a.e)&&GLd(a,b.$j()?H2d(a,6,b,(mmb(),jmb),null,-1,false):H2d(a,b.Kj()?2:1,b,null,null,-1,false))} +function Dhb(){Dhb=ccb;var a,b;Bhb=KC(cJ,nie,91,32,0,1);Chb=KC(cJ,nie,91,32,0,1);a=1;for(b=0;b<=18;b++){Bhb[b]=ghb(a);Chb[b]=ghb(Nbb(a,b));a=Ibb(a,5)}for(;bg){return false}}if(b.q){d=b.C;g=d.c.c.a-d.o.a/2;e=d.n.a-c;if(e>g){return false}}return true} +function wcc(a,b){var c;Odd(b,'Partition preprocessing',1);c=BD(GAb(JAb(LAb(JAb(new YAb(null,new Kub(a.a,16)),new Acc),new Ccc),new Ecc),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)]))),15);MAb(c.Oc(),new Gcc);Qdd(b)} +function DMc(a){wMc();var b,c,d,e,f,g,h;c=new $rb;for(e=new olb(a.e.b);e.a1?(a.e*=Edb(a.a)):(a.f/=Edb(a.a));DOb(a);EOb(a);AOb(a);yNb(a.b,(CPb(),uPb),a.g)} +function Y5b(a,b,c){var d,e,f,g,h,i;d=0;i=c;if(!b){d=c*(a.c.length-1);i*=-1}for(f=new olb(a);f.a=0){if(!b){b=new Ifb;d>0&&Efb(b,a.substr(0,d))}b.a+='\\';Afb(b,c&aje)}else !!b&&Afb(b,c&aje)}return b?b.a:a} +function l5c(a){var b;if(!a.a){throw vbb(new Zdb('IDataType class expected for layout option '+a.f))}b=gvd(a.a);if(b==null){throw vbb(new Zdb("Couldn't create new instance of property '"+a.f+"'. "+ise+(fdb(Y3),Y3.k)+jse))}return BD(b,414)} +function aid(a){var b,c,d,e,f;f=a.eh();if(f){if(f.kh()){e=xid(a,f);if(e!=f){c=a.Vg();d=(b=a.Vg(),b>=0?a.Qg(null):a.eh().ih(a,-1-b,null,null));a.Rg(BD(e,49),c);!!d&&d.Fi();a.Lg()&&a.Mg()&&c>-1&&Uhd(a,new nSd(a,9,c,f,e));return e}}}return f} +function nTb(a){var b,c,d,e,f,g,h,i;g=0;f=a.f.e;for(d=0;d>5;if(e>=a.d){return a.e<0}c=a.a[e];b=1<<(b&31);if(a.e<0){d=Mgb(a);if(e>16)),15).Xc(f);if(h0){!(fad(a.a.c)&&b.n.d)&&!(gad(a.a.c)&&b.n.b)&&(b.g.d+=$wnd.Math.max(0,d/2-0.5));!(fad(a.a.c)&&b.n.a)&&!(gad(a.a.c)&&b.n.c)&&(b.g.a-=d-1)}}} +function N3b(a){var b,c,d,e,f;e=new Rkb;f=O3b(a,e);b=BD(vNb(a,(wtc(),gtc)),10);if(b){for(d=new olb(b.j);d.a>b;f=a.m>>b|c<<22-b;e=a.l>>b|a.m<<22-b}else if(b<44){g=d?Fje:0;f=c>>b-22;e=a.m>>b-22|c<<44-b}else{g=d?Fje:0;f=d?Eje:0;e=c>>b-44}return TC(e&Eje,f&Eje,g&Fje)} +function XOb(a){var b,c,d,e,f,g;this.c=new Rkb;this.d=a;d=Pje;e=Pje;b=Qje;c=Qje;for(g=Jsb(a,0);g.b!=g.d.c;){f=BD(Xsb(g),8);d=$wnd.Math.min(d,f.a);e=$wnd.Math.min(e,f.b);b=$wnd.Math.max(b,f.a);c=$wnd.Math.max(c,f.b)}this.a=new J6c(d,e,b-d,c-e)} +function Dac(a,b){var c,d,e,f,g,h;for(f=new olb(a.b);f.a0&&JD(b,42)){a.a.qj();j=BD(b,42);i=j.cd();f=i==null?0:tb(i);g=DAd(a.a,f);c=a.a.d[g];if(c){d=BD(c.g,367);k=c.i;for(h=0;h=2){c=e.Kc();b=ED(c.Pb());while(c.Ob()){f=b;b=ED(c.Pb());d=$wnd.Math.min(d,(uCb(b),b)-(uCb(f),f))}}return d} +function gUc(a,b){var c,d,e,f,g;d=new Psb;Gsb(d,b,d.c.b,d.c);do{c=(sCb(d.b!=0),BD(Nsb(d,d.a.a),86));a.b[c.g]=1;for(f=Jsb(c.d,0);f.b!=f.d.c;){e=BD(Xsb(f),188);g=e.c;a.b[g.g]==1?Dsb(a.a,e):a.b[g.g]==2?(a.b[g.g]=1):Gsb(d,g,d.c.b,d.c)}}while(d.b!=0)} +function Ju(a,b){var c,d,e;if(PD(b)===PD(Qb(a))){return true}if(!JD(b,15)){return false}d=BD(b,15);e=a.gc();if(e!=d.gc()){return false}if(JD(d,54)){for(c=0;c0&&(e=c);for(g=new olb(a.f.e);g.a0){b-=1;c-=1}else{if(d>=0&&e<0){b+=1;c+=1}else{if(d>0&&e>=0){b-=1;c+=1}else{b+=1;c-=1}}}}}return new vgd(meb(b),meb(c))} +function PIc(a,b){if(a.cb.c){return 1}else if(a.bb.b){return 1}else if(a.a!=b.a){return tb(a.a)-tb(b.a)}else if(a.d==(UIc(),TIc)&&b.d==SIc){return -1}else if(a.d==SIc&&b.d==TIc){return 1}return 0} +function aNc(a,b){var c,d,e,f,g;f=b.a;f.c.i==b.b?(g=f.d):(g=f.c);f.c.i==b.b?(d=f.c):(d=f.d);e=NLc(a.a,g,d);if(e>0&&e0}else if(e<0&&-e0}return false} +function RZc(a,b,c,d){var e,f,g,h,i,j,k,l;e=(b-a.d)/a.c.c.length;f=0;a.a+=c;a.d=b;for(l=new olb(a.c);l.a>24}return g} +function vdb(a){if(a.pe()){var b=a.c;b.qe()?(a.o='['+b.n):!b.pe()?(a.o='[L'+b.ne()+';'):(a.o='['+b.ne());a.b=b.me()+'[]';a.k=b.oe()+'[]';return}var c=a.j;var d=a.d;d=d.split('/');a.o=ydb('.',[c,ydb('$',d)]);a.b=ydb('.',[c,ydb('.',d)]);a.k=d[d.length-1]} +function qGb(a,b){var c,d,e,f,g;g=null;for(f=new olb(a.e.a);f.a=0;b-=2){for(c=0;c<=b;c+=2){if(a.b[c]>a.b[c+2]||a.b[c]===a.b[c+2]&&a.b[c+1]>a.b[c+3]){d=a.b[c+2];a.b[c+2]=a.b[c];a.b[c]=d;d=a.b[c+3];a.b[c+3]=a.b[c+1];a.b[c+1]=d}}}a.c=true} +function UUb(a,b){var c,d,e,f,g,h,i,j;g=b==1?KUb:JUb;for(f=g.a.ec().Kc();f.Ob();){e=BD(f.Pb(),103);for(i=BD(Qc(a.f.c,e),21).Kc();i.Ob();){h=BD(i.Pb(),46);d=BD(h.b,81);j=BD(h.a,189);c=j.c;switch(e.g){case 2:case 1:d.g.d+=c;break;case 4:case 3:d.g.c+=c;}}}} +function PFc(a,b){var c,d,e,f,g,h,i,j,k;j=-1;k=0;for(g=a,h=0,i=g.length;h0&&++k}}++j}return k} +function Eid(a){var b,c;c=new Wfb(hdb(a.gm));c.a+='@';Qfb(c,(b=tb(a)>>>0,b.toString(16)));if(a.kh()){c.a+=' (eProxyURI: ';Pfb(c,a.qh());if(a.$g()){c.a+=' eClass: ';Pfb(c,a.$g())}c.a+=')'}else if(a.$g()){c.a+=' (eClass: ';Pfb(c,a.$g());c.a+=')'}return c.a} +function TDb(a){var b,c,d,e;if(a.e){throw vbb(new Zdb((fdb(TM),Jke+TM.k+Kke)))}a.d==(ead(),cad)&&SDb(a,aad);for(c=new olb(a.a.a);c.a>24}return c} +function lKb(a,b,c){var d,e,f;e=BD(Mpb(a.i,b),306);if(!e){e=new bIb(a.d,b,c);Npb(a.i,b,e);if(sJb(b)){CHb(a.a,b.c,b.b,e)}else{f=rJb(b);d=BD(Mpb(a.p,f),244);switch(f.g){case 1:case 3:e.j=true;lIb(d,b.b,e);break;case 4:case 2:e.k=true;lIb(d,b.c,e);}}}return e} +function r3d(a,b,c,d){var e,f,g,h,i,j;h=new yud;i=S6d(a.e.Tg(),b);e=BD(a.g,119);Q6d();if(BD(b,66).Oj()){for(g=0;g=0){return e}else{f=1;for(h=new olb(b.j);h.a0&&b.ue((tCb(e-1,a.c.length),BD(a.c[e-1],10)),f)>0){Nkb(a,e,(tCb(e-1,a.c.length),BD(a.c[e-1],10)));--e}tCb(e,a.c.length);a.c[e]=f}c.a=new Lqb;c.b=new Lqb} +function n5c(a,b,c){var d,e,f,g,h,i,j,k;k=(d=BD(b.e&&b.e(),9),new xqb(d,BD(_Bb(d,d.length),9),0));i=mfb(c,'[\\[\\]\\s,]+');for(f=i,g=0,h=f.length;g0){!(fad(a.a.c)&&b.n.d)&&!(gad(a.a.c)&&b.n.b)&&(b.g.d-=$wnd.Math.max(0,d/2-0.5));!(fad(a.a.c)&&b.n.a)&&!(gad(a.a.c)&&b.n.c)&&(b.g.a+=$wnd.Math.max(0,d-1))}}} +function Hac(a,b,c){var d,e;if((a.c-a.b&a.a.length-1)==2){if(b==(Ucd(),Acd)||b==zcd){xac(BD(bkb(a),15),(rbd(),nbd));xac(BD(bkb(a),15),obd)}else{xac(BD(bkb(a),15),(rbd(),obd));xac(BD(bkb(a),15),nbd)}}else{for(e=new xkb(a);e.a!=e.b;){d=BD(vkb(e),15);xac(d,c)}}} +function htd(a,b){var c,d,e,f,g,h,i;e=Nu(new qtd(a));h=new Bib(e,e.c.length);f=Nu(new qtd(b));i=new Bib(f,f.c.length);g=null;while(h.b>0&&i.b>0){c=(sCb(h.b>0),BD(h.a.Xb(h.c=--h.b),33));d=(sCb(i.b>0),BD(i.a.Xb(i.c=--i.b),33));if(c==d){g=c}else{break}}return g} +function Cub(a,b){var c,d,e,f,g,h;f=a.a*kke+a.b*1502;h=a.b*kke+11;c=$wnd.Math.floor(h*lke);f+=c;h-=c*mke;f%=mke;a.a=f;a.b=h;if(b<=24){return $wnd.Math.floor(a.a*wub[b])}else{e=a.a*(1<=2147483648&&(d-=Zje);return d}} +function Zic(a,b,c){var d,e,f,g;if(bjc(a,b)>bjc(a,c)){d=V_b(c,(Ucd(),zcd));a.d=d.dc()?0:B0b(BD(d.Xb(0),11));g=V_b(b,Tcd);a.b=g.dc()?0:B0b(BD(g.Xb(0),11))}else{e=V_b(c,(Ucd(),Tcd));a.d=e.dc()?0:B0b(BD(e.Xb(0),11));f=V_b(b,zcd);a.b=f.dc()?0:B0b(BD(f.Xb(0),11))}} +function l6d(a){var b,c,d,e,f,g,h;if(a){b=a.Hh(_ve);if(b){g=GD(AAd((!b.b&&(b.b=new sId((jGd(),fGd),x6,b)),b.b),'conversionDelegates'));if(g!=null){h=new Rkb;for(d=mfb(g,'\\w+'),e=0,f=d.length;ea.c){break}else if(e.a>=a.s){f<0&&(f=g);h=g}}i=(a.s+a.c)/2;if(f>=0){d=NOc(a,b,f,h);i=$Oc((tCb(d,b.c.length),BD(b.c[d],329)));YOc(b,d,c)}return i} +function lZc(){lZc=ccb;RYc=new Osd((Y9c(),r8c),1.3);VYc=I8c;gZc=new q0b(15);fZc=new Osd(f9c,gZc);jZc=new Osd(T9c,15);SYc=w8c;_Yc=Y8c;aZc=_8c;bZc=b9c;$Yc=W8c;cZc=e9c;hZc=x9c;eZc=(OYc(),KYc);ZYc=IYc;dZc=JYc;iZc=MYc;WYc=HYc;XYc=O8c;YYc=P8c;UYc=GYc;TYc=FYc;kZc=NYc} +function Bnd(a,b,c){var d,e,f,g,h,i,j;g=(f=new RHd,f);PHd(g,(uCb(b),b));j=(!g.b&&(g.b=new sId((jGd(),fGd),x6,g)),g.b);for(i=1;i0&&JPb(this,e)}} +function IQb(a,b,c,d,e,f){var g,h,i;if(!e[b.b]){e[b.b]=true;g=d;!g&&(g=new kRb);Ekb(g.e,b);for(i=f[b.b].Kc();i.Ob();){h=BD(i.Pb(),282);if(h.d==c||h.c==c){continue}h.c!=b&&IQb(a,h.c,b,g,e,f);h.d!=b&&IQb(a,h.d,b,g,e,f);Ekb(g.c,h);Gkb(g.d,h.b)}return g}return null} +function e4b(a){var b,c,d,e,f,g,h;b=0;for(e=new olb(a.e);e.a=2} +function gec(a,b){var c,d,e,f;Odd(b,'Self-Loop pre-processing',1);for(d=new olb(a.a);d.a1){return false}b=qqb(zbd,OC(GC(B1,1),Kie,93,0,[ybd,Bbd]));if(Ox(Cx(b,a))>1){return false}d=qqb(Gbd,OC(GC(B1,1),Kie,93,0,[Fbd,Ebd]));if(Ox(Cx(d,a))>1){return false}return true} +function U0d(a,b){var c,d,e;c=b.Hh(a.a);if(c){e=GD(AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),'affiliation'));if(e!=null){d=kfb(e,wfb(35));return d==-1?l1d(a,u1d(a,bKd(b.Hj())),e):d==0?l1d(a,null,e.substr(1)):l1d(a,e.substr(0,d),e.substr(d+1))}}return null} +function ic(b){var c,d,e;try{return b==null?Xhe:fcb(b)}catch(a){a=ubb(a);if(JD(a,102)){c=a;e=hdb(rb(b))+'@'+(d=(Zfb(),kCb(b))>>>0,d.toString(16));tyb(xyb(),($xb(),'Exception during lenientFormat for '+e),c);return '<'+e+' threw '+hdb(c.gm)+'>'}else throw vbb(a)}} +function mzc(a){switch(a.g){case 0:return new xDc;case 1:return new ZCc;case 2:return new DCc;case 3:return new QCc;case 4:return new LDc;case 5:return new iDc;default:throw vbb(new Wdb('No implementation is available for the layerer '+(a.f!=null?a.f:''+a.g)));}} +function AQc(a,b,c){var d,e,f;for(f=new olb(a.t);f.a0){d.b.n-=d.c;d.b.n<=0&&d.b.u>0&&Dsb(b,d.b)}}for(e=new olb(a.i);e.a0){d.a.u-=d.c;d.a.u<=0&&d.a.n>0&&Dsb(c,d.a)}}} +function Vud(a){var b,c,d,e,f;if(a.g==null){a.d=a.si(a.f);wtd(a,a.d);if(a.c){f=a.f;return f}}b=BD(a.g[a.i-1],47);e=b.Pb();a.e=b;c=a.si(e);if(c.Ob()){a.d=c;wtd(a,c)}else{a.d=null;while(!b.Ob()){NC(a.g,--a.i,null);if(a.i==0){break}d=BD(a.g[a.i-1],47);b=d}}return e} +function r2d(a,b){var c,d,e,f,g,h;d=b;e=d.ak();if(T6d(a.e,e)){if(e.hi()&&E2d(a,e,d.dd())){return false}}else{h=S6d(a.e.Tg(),e);c=BD(a.g,119);for(f=0;f1||c>1){return 2}}if(b+c==1){return 2}return 0} +function WQb(a,b,c){var d,e,f,g,h;Odd(c,'ELK Force',1);Ccb(DD(hkd(b,(wSb(),jSb))))||$Cb((d=new _Cb((Pgd(),new bhd(b))),d));h=TQb(b);XQb(h);YQb(a,BD(vNb(h,fSb),424));g=LQb(a.a,h);for(f=g.Kc();f.Ob();){e=BD(f.Pb(),231);tRb(a.b,e,Udd(c,1/g.gc()))}h=KQb(g);SQb(h);Qdd(c)} +function yoc(a,b){var c,d,e,f,g;Odd(b,'Breaking Point Processor',1);xoc(a);if(Ccb(DD(vNb(a,(Nyc(),Jyc))))){for(e=new olb(a.b);e.a=0?a._g(d,true,true):sid(a,f,true),153));BD(e,215).ml(b,c)}else{throw vbb(new Wdb(ite+b.ne()+jte))}} +function ROc(a,b){var c,d,e,f,g;c=new Rkb;e=LAb(new YAb(null,new Kub(a,16)),new iPc);f=LAb(new YAb(null,new Kub(a,16)),new kPc);g=aAb(_zb(OAb(ty(OC(GC(xM,1),Uhe,833,0,[e,f])),new mPc)));for(d=1;d=2*b&&Ekb(c,new bPc(g[d-1]+b,g[d]-b))}return c} +function AXc(a,b,c){Odd(c,'Eades radial',1);c.n&&!!b&&Tdd(c,i6d(b),(pgd(),mgd));a.d=BD(hkd(b,(MUc(),LUc)),33);a.c=Edb(ED(hkd(b,(ZWc(),VWc))));a.e=tXc(BD(hkd(b,WWc),293));a.a=gWc(BD(hkd(b,YWc),426));a.b=jXc(BD(hkd(b,RWc),340));BXc(a);c.n&&!!b&&Tdd(c,i6d(b),(pgd(),mgd))} +function Fqd(a,b,c){var d,e,f,g,h,j,k,l;if(c){f=c.a.length;d=new Yge(f);for(h=(d.b-d.a)*d.c<0?(Xge(),Wge):new she(d);h.Ob();){g=BD(h.Pb(),19);e=Zpd(c,g.a);!!e&&(i=null,j=Uqd(a,(k=(Fhd(),l=new ppd,l),!!b&&npd(k,b),k),e),Lkd(j,_pd(e,Vte)),grd(e,j),hrd(e,j),crd(a,e,j))}}} +function UKd(a){var b,c,d,e,f,g;if(!a.j){g=new HPd;b=KKd;f=b.a.zc(a,b);if(f==null){for(d=new Fyd(_Kd(a));d.e!=d.i.gc();){c=BD(Dyd(d),26);e=UKd(c);ytd(g,e);wtd(g,c)}b.a.Bc(a)!=null}vud(g);a.j=new nNd((BD(qud(ZKd((NFd(),MFd).o),11),18),g.i),g.g);$Kd(a).b&=-33}return a.j} +function O9d(a){var b,c,d,e;if(a==null){return null}else{d=Qge(a,true);e=Nwe.length;if(dfb(d.substr(d.length-e,e),Nwe)){c=d.length;if(c==4){b=(BCb(0,d.length),d.charCodeAt(0));if(b==43){return z9d}else if(b==45){return y9d}}else if(c==3){return z9d}}return new Odb(d)}} +function _C(a){var b,c,d;c=a.l;if((c&c-1)!=0){return -1}d=a.m;if((d&d-1)!=0){return -1}b=a.h;if((b&b-1)!=0){return -1}if(b==0&&d==0&&c==0){return -1}if(b==0&&d==0&&c!=0){return ieb(c)}if(b==0&&d!=0&&c==0){return ieb(d)+22}if(b!=0&&d==0&&c==0){return ieb(b)+44}return -1} +function qbc(a,b){var c,d,e,f,g;Odd(b,'Edge joining',1);c=Ccb(DD(vNb(a,(Nyc(),Byc))));for(e=new olb(a.b);e.a1){for(e=new olb(a.a);e.a0);f.a.Xb(f.c=--f.b);Aib(f,e);sCb(f.b3&&EA(a,0,b-3)}} +function cUb(a){var b,c,d,e;if(PD(vNb(a,(Nyc(),axc)))===PD((hbd(),ebd))){return !a.e&&PD(vNb(a,Cwc))!==PD((Xrc(),Urc))}d=BD(vNb(a,Dwc),292);e=Ccb(DD(vNb(a,Hwc)))||PD(vNb(a,Iwc))===PD((Rpc(),Opc));b=BD(vNb(a,Bwc),19).a;c=a.a.c.length;return !e&&d!=(Xrc(),Urc)&&(b==0||b>c)} +function lkc(a){var b,c;c=0;for(;c0){break}}if(c>0&&c0){break}}if(b>0&&c>16!=6&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+qmd(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?cmd(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,6,d));d=bmd(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,6,b,b))} +function npd(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=9&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+opd(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?lpd(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,9,d));d=kpd(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,9,b,b))} +function Rld(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=3&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+Sld(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?Lld(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,12,d));d=Kld(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,b,b))} +function VId(b){var c,d,e,f,g;e=wId(b);g=b.j;if(g==null&&!!e){return b.$j()?null:e.zj()}else if(JD(e,148)){d=e.Aj();if(d){f=d.Nh();if(f!=b.i){c=BD(e,148);if(c.Ej()){try{b.g=f.Kh(c,g)}catch(a){a=ubb(a);if(JD(a,78)){b.g=null}else throw vbb(a)}}b.i=f}}return b.g}return null} +function wOb(a){var b;b=new Rkb;Ekb(b,new aDb(new f7c(a.c,a.d),new f7c(a.c+a.b,a.d)));Ekb(b,new aDb(new f7c(a.c,a.d),new f7c(a.c,a.d+a.a)));Ekb(b,new aDb(new f7c(a.c+a.b,a.d+a.a),new f7c(a.c+a.b,a.d)));Ekb(b,new aDb(new f7c(a.c+a.b,a.d+a.a),new f7c(a.c,a.d+a.a)));return b} +function IJc(a,b,c,d){var e,f,g;g=LZb(b,c);d.c[d.c.length]=b;if(a.j[g.p]==-1||a.j[g.p]==2||a.a[b.p]){return d}a.j[g.p]=-1;for(f=new Sr(ur(O_b(g).a.Kc(),new Sq));Qr(f);){e=BD(Rr(f),17);if(!(!OZb(e)&&!(!OZb(e)&&e.c.i.c==e.d.i.c))||e==b){continue}return IJc(a,e,g,d)}return d} +function vQb(a,b,c){var d,e,f;for(f=b.a.ec().Kc();f.Ob();){e=BD(f.Pb(),79);d=BD(Ohb(a.b,e),266);!d&&(Xod(jtd(e))==Xod(ltd(e))?uQb(a,e,c):jtd(e)==Xod(ltd(e))?Ohb(a.c,e)==null&&Ohb(a.b,ltd(e))!=null&&xQb(a,e,c,false):Ohb(a.d,e)==null&&Ohb(a.b,jtd(e))!=null&&xQb(a,e,c,true))}} +function jcc(a,b){var c,d,e,f,g,h,i;for(e=a.Kc();e.Ob();){d=BD(e.Pb(),10);h=new H0b;F0b(h,d);G0b(h,(Ucd(),zcd));yNb(h,(wtc(),ftc),(Bcb(),true));for(g=b.Kc();g.Ob();){f=BD(g.Pb(),10);i=new H0b;F0b(i,f);G0b(i,Tcd);yNb(i,ftc,true);c=new UZb;yNb(c,ftc,true);QZb(c,h);RZb(c,i)}}} +function jnc(a,b,c,d){var e,f,g,h;e=hnc(a,b,c);f=hnc(a,c,b);g=BD(Ohb(a.c,b),112);h=BD(Ohb(a.c,c),112);if(ed.b.g&&(f.c[f.c.length]=d,true)}}return f} +function k$c(){k$c=ccb;g$c=new l$c('CANDIDATE_POSITION_LAST_PLACED_RIGHT',0);f$c=new l$c('CANDIDATE_POSITION_LAST_PLACED_BELOW',1);i$c=new l$c('CANDIDATE_POSITION_WHOLE_DRAWING_RIGHT',2);h$c=new l$c('CANDIDATE_POSITION_WHOLE_DRAWING_BELOW',3);j$c=new l$c('WHOLE_DRAWING',4)} +function Xqd(a,b){if(JD(b,239)){return iqd(a,BD(b,33))}else if(JD(b,186)){return jqd(a,BD(b,118))}else if(JD(b,354)){return hqd(a,BD(b,137))}else if(JD(b,352)){return gqd(a,BD(b,79))}else if(b){return null}else{throw vbb(new Wdb(Xte+Fe(new amb(OC(GC(SI,1),Uhe,1,5,[b])))))}} +function aic(a){var b,c,d,e,f,g,h;f=new Psb;for(e=new olb(a.d.a);e.a1){b=nGb((c=new pGb,++a.b,c),a.d);for(h=Jsb(f,0);h.b!=h.d.c;){g=BD(Xsb(h),121);AFb(DFb(CFb(EFb(BFb(new FFb,1),0),b),g))}}} +function $od(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=11&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+_od(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?Uod(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,10,d));d=Tod(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,11,b,b))} +function uZb(a){var b,c,d,e;for(d=new nib((new eib(a.b)).a);d.b;){c=lib(d);e=BD(c.cd(),11);b=BD(c.dd(),10);yNb(b,(wtc(),$sc),e);yNb(e,gtc,b);yNb(e,Nsc,(Bcb(),true));G0b(e,BD(vNb(b,Hsc),61));vNb(b,Hsc);yNb(e.i,(Nyc(),Vxc),(dcd(),acd));BD(vNb(Q_b(e.i),Ksc),21).Fc((Orc(),Krc))}} +function G4b(a,b,c){var d,e,f,g,h,i;f=0;g=0;if(a.c){for(i=new olb(a.d.i.j);i.af.a){return -1}else if(e.ai){k=a.d;a.d=KC(y4,jve,63,2*i+4,0,1);for(f=0;f=9223372036854775807){return wD(),sD}e=false;if(a<0){e=true;a=-a}d=0;if(a>=Ije){d=QD(a/Ije);a-=d*Ije}c=0;if(a>=Hje){c=QD(a/Hje);a-=c*Hje}b=QD(a);f=TC(b,c,d);e&&ZC(f);return f} +function rKb(a,b){var c,d,e,f;c=!b||!a.u.Hc((rcd(),ncd));f=0;for(e=new olb(a.e.Cf());e.a=-b&&d==b){return new vgd(meb(c-1),meb(d))}return new vgd(meb(c),meb(d-1))} +function W8b(){S8b();return OC(GC(AS,1),Kie,77,0,[Y7b,V7b,Z7b,n8b,G8b,r8b,M8b,w8b,E8b,i8b,A8b,v8b,F8b,e8b,O8b,P7b,z8b,I8b,o8b,H8b,Q8b,C8b,Q7b,D8b,R8b,K8b,P8b,p8b,b8b,q8b,m8b,N8b,T7b,_7b,t8b,S7b,u8b,k8b,f8b,x8b,h8b,W7b,U7b,l8b,g8b,y8b,L8b,R7b,B8b,j8b,s8b,c8b,a8b,J8b,$7b,d8b,X7b])} +function Yic(a,b,c){a.d=0;a.b=0;b.k==(j0b(),i0b)&&c.k==i0b&&BD(vNb(b,(wtc(),$sc)),10)==BD(vNb(c,$sc),10)&&(ajc(b).j==(Ucd(),Acd)?Zic(a,b,c):Zic(a,c,b));b.k==i0b&&c.k==g0b?ajc(b).j==(Ucd(),Acd)?(a.d=1):(a.b=1):c.k==i0b&&b.k==g0b&&(ajc(c).j==(Ucd(),Acd)?(a.b=1):(a.d=1));cjc(a,b,c)} +function esd(a){var b,c,d,e,f,g,h,i,j,k,l;l=hsd(a);b=a.a;i=b!=null;i&&Upd(l,'category',a.a);e=Fhe(new Pib(a.d));g=!e;if(g){j=new wB;cC(l,'knownOptions',j);c=new msd(j);reb(new Pib(a.d),c)}f=Fhe(a.g);h=!f;if(h){k=new wB;cC(l,'supportedFeatures',k);d=new osd(k);reb(a.g,d)}return l} +function ty(a){var b,c,d,e,f,g,h,i,j;d=false;b=336;c=0;f=new Xp(a.length);for(h=a,i=0,j=h.length;i>16!=7&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+Iod(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?Eod(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=BD(b,49).gh(a,1,C2,d));d=Dod(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,7,b,b))} +function NHd(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=3&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+QHd(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?KHd(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=BD(b,49).gh(a,0,k5,d));d=JHd(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,b,b))} +function Ehb(a,b){Dhb();var c,d,e,f,g,h,i,j,k;if(b.d>a.d){h=a;a=b;b=h}if(b.d<63){return Ihb(a,b)}g=(a.d&-2)<<4;j=Rgb(a,g);k=Rgb(b,g);d=yhb(a,Qgb(j,g));e=yhb(b,Qgb(k,g));i=Ehb(j,k);c=Ehb(d,e);f=Ehb(yhb(j,d),yhb(e,k));f=thb(thb(f,i),c);f=Qgb(f,g);i=Qgb(i,g<<1);return thb(thb(i,f),c)} +function aGc(a,b,c){var d,e,f,g,h;g=CHc(a,c);h=KC(OQ,kne,10,b.length,0,1);d=0;for(f=g.Kc();f.Ob();){e=BD(f.Pb(),11);Ccb(DD(vNb(e,(wtc(),Nsc))))&&(h[d++]=BD(vNb(e,gtc),10))}if(d=0;f+=c?1:-1){g=g|b.c.Sf(i,f,c,d&&!Ccb(DD(vNb(b.j,(wtc(),Jsc))))&&!Ccb(DD(vNb(b.j,(wtc(),mtc)))));g=g|b.q._f(i,f,c);g=g|cGc(a,i[f],c,d)}Qqb(a.c,b);return g} +function o3b(a,b,c){var d,e,f,g,h,i,j,k,l,m;for(k=m_b(a.j),l=0,m=k.length;l1&&(a.a=true);ZNb(BD(c.b,65),P6c(R6c(BD(b.b,65).c),Y6c(c7c(R6c(BD(c.b,65).a),BD(b.b,65).a),e)));D1c(a,b);F1c(a,c)}} +function rVb(a){var b,c,d,e,f,g,h;for(f=new olb(a.a.a);f.a0&&f>0?(g.p=b++):d>0?(g.p=c++):f>0?(g.p=e++):(g.p=c++);}}mmb();Okb(a.j,new fcc)} +function Vec(a){var b,c;c=null;b=BD(Ikb(a.g,0),17);do{c=b.d.i;if(wNb(c,(wtc(),Wsc))){return BD(vNb(c,Wsc),11).i}if(c.k!=(j0b(),h0b)&&Qr(new Sr(ur(U_b(c).a.Kc(),new Sq)))){b=BD(Rr(new Sr(ur(U_b(c).a.Kc(),new Sq))),17)}else if(c.k!=h0b){return null}}while(!!c&&c.k!=(j0b(),h0b));return c} +function Omc(a,b){var c,d,e,f,g,h,i,j,k;h=b.j;g=b.g;i=BD(Ikb(h,h.c.length-1),113);k=(tCb(0,h.c.length),BD(h.c[0],113));j=Kmc(a,g,i,k);for(f=1;fj){i=c;k=e;j=d}}b.a=k;b.c=i} +function sEb(a,b){var c,d;d=Axb(a.b,b.b);if(!d){throw vbb(new Zdb('Invalid hitboxes for scanline constraint calculation.'))}(mEb(b.b,BD(Cxb(a.b,b.b),57))||mEb(b.b,BD(Bxb(a.b,b.b),57)))&&(Zfb(),b.b+' has overlap.');a.a[b.b.f]=BD(Exb(a.b,b.b),57);c=BD(Dxb(a.b,b.b),57);!!c&&(a.a[c.f]=b.b)} +function AFb(a){if(!a.a.d||!a.a.e){throw vbb(new Zdb((fdb(fN),fN.k+' must have a source and target '+(fdb(jN),jN.k)+' specified.')))}if(a.a.d==a.a.e){throw vbb(new Zdb('Network simplex does not support self-loops: '+a.a+' '+a.a.d+' '+a.a.e))}NFb(a.a.d.g,a.a);NFb(a.a.e.b,a.a);return a.a} +function HHc(a,b,c){var d,e,f,g,h,i,j;j=new Hxb(new tIc(a));for(g=OC(GC(aR,1),lne,11,0,[b,c]),h=0,i=g.length;hi-a.b&&hi-a.a&&h0&&++n}}}++m}return n} +function hUc(a,b){var c,d,e,f,g;g=BD(vNb(b,(JTc(),FTc)),425);for(f=Jsb(b.b,0);f.b!=f.d.c;){e=BD(Xsb(f),86);if(a.b[e.g]==0){switch(g.g){case 0:iUc(a,e);break;case 1:gUc(a,e);}a.b[e.g]=2}}for(d=Jsb(a.a,0);d.b!=d.d.c;){c=BD(Xsb(d),188);ze(c.b.d,c,true);ze(c.c.b,c,true)}yNb(b,(mTc(),gTc),a.a)} +function S6d(a,b){Q6d();var c,d,e,f;if(!b){return P6d}else if(b==(Q8d(),N8d)||(b==v8d||b==t8d||b==u8d)&&a!=s8d){return new Z6d(a,b)}else{d=BD(b,677);c=d.pk();if(!c){a2d(q1d((O6d(),M6d),b));c=d.pk()}f=(!c.i&&(c.i=new Lqb),c.i);e=BD(Wd(irb(f.f,a)),1942);!e&&Rhb(f,a,e=new Z6d(a,b));return e}} +function Tbc(a,b){var c,d,e,f,g,h,i,j,k;i=BD(vNb(a,(wtc(),$sc)),11);j=l7c(OC(GC(m1,1),nie,8,0,[i.i.n,i.n,i.a])).a;k=a.i.n.b;c=k_b(a.e);for(e=c,f=0,g=e.length;f0){if(f.a){h=f.b.rf().a;if(c>h){e=(c-h)/2;f.d.b=e;f.d.c=e}}else{f.d.c=a.s+c}}else if(tcd(a.u)){d=sfd(f.b);d.c<0&&(f.d.b=-d.c);d.c+d.b>f.b.rf().a&&(f.d.c=d.c+d.b-f.b.rf().a)}}} +function Eec(a,b){var c,d,e,f;Odd(b,'Semi-Interactive Crossing Minimization Processor',1);c=false;for(e=new olb(a.b);e.a=0){if(b==c){return new vgd(meb(-b-1),meb(-b-1))}if(b==-c){return new vgd(meb(-b),meb(c+1))}}if($wnd.Math.abs(b)>$wnd.Math.abs(c)){if(b<0){return new vgd(meb(-b),meb(c))}return new vgd(meb(-b),meb(c+1))}return new vgd(meb(b+1),meb(c))} +function q5b(a){var b,c;c=BD(vNb(a,(Nyc(),mxc)),163);b=BD(vNb(a,(wtc(),Osc)),303);if(c==(Ctc(),ytc)){yNb(a,mxc,Btc);yNb(a,Osc,(esc(),dsc))}else if(c==Atc){yNb(a,mxc,Btc);yNb(a,Osc,(esc(),bsc))}else if(b==(esc(),dsc)){yNb(a,mxc,ytc);yNb(a,Osc,csc)}else if(b==bsc){yNb(a,mxc,Atc);yNb(a,Osc,csc)}} +function FNc(){FNc=ccb;DNc=new RNc;zNc=e3c(new j3c,(qUb(),nUb),(S8b(),o8b));CNc=c3c(e3c(new j3c,nUb,C8b),pUb,B8b);ENc=b3c(b3c(g3c(c3c(e3c(new j3c,lUb,M8b),pUb,L8b),oUb),K8b),N8b);ANc=c3c(e3c(e3c(e3c(new j3c,mUb,r8b),oUb,t8b),oUb,u8b),pUb,s8b);BNc=c3c(e3c(e3c(new j3c,oUb,u8b),oUb,_7b),pUb,$7b)} +function hQc(){hQc=ccb;cQc=e3c(c3c(new j3c,(qUb(),pUb),(S8b(),c8b)),nUb,o8b);gQc=b3c(b3c(g3c(c3c(e3c(new j3c,lUb,M8b),pUb,L8b),oUb),K8b),N8b);dQc=c3c(e3c(e3c(e3c(new j3c,mUb,r8b),oUb,t8b),oUb,u8b),pUb,s8b);fQc=e3c(e3c(new j3c,nUb,C8b),pUb,B8b);eQc=c3c(e3c(e3c(new j3c,oUb,u8b),oUb,_7b),pUb,$7b)} +function GNc(a,b,c,d,e){var f,g;if((!OZb(b)&&b.c.i.c==b.d.i.c||!T6c(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])),c))&&!OZb(b)){b.c==e?St(b.a,0,new g7c(c)):Dsb(b.a,new g7c(c));if(d&&!Rqb(a.a,c)){g=BD(vNb(b,(Nyc(),jxc)),74);if(!g){g=new s7c;yNb(b,jxc,g)}f=new g7c(c);Gsb(g,f,g.c.b,g.c);Qqb(a.a,f)}}} +function Qac(a){var b,c;for(c=new Sr(ur(R_b(a).a.Kc(),new Sq));Qr(c);){b=BD(Rr(c),17);if(b.c.i.k!=(j0b(),f0b)){throw vbb(new y2c(Fne+P_b(a)+"' has its layer constraint set to FIRST, but has at least one incoming edge that "+' does not come from a FIRST_SEPARATE node. That must not happen.'))}}} +function vjd(a,b,c){var d,e,f,g,h,i,j;e=aeb(a.Db&254);if(e==0){a.Eb=c}else{if(e==1){h=KC(SI,Uhe,1,2,5,1);f=zjd(a,b);if(f==0){h[0]=c;h[1]=a.Eb}else{h[0]=a.Eb;h[1]=c}}else{h=KC(SI,Uhe,1,e+1,5,1);g=CD(a.Eb);for(d=2,i=0,j=0;d<=128;d<<=1){d==b?(h[j++]=c):(a.Db&d)!=0&&(h[j++]=g[i++])}}a.Eb=h}a.Db|=b} +function ENb(a,b,c){var d,e,f,g;this.b=new Rkb;e=0;d=0;for(g=new olb(a);g.a0){f=BD(Ikb(this.b,0),167);e+=f.o;d+=f.p}e*=2;d*=2;b>1?(e=QD($wnd.Math.ceil(e*b))):(d=QD($wnd.Math.ceil(d/b)));this.a=new pNb(e,d)} +function Igc(a,b,c,d,e,f){var g,h,i,j,k,l,m,n,o,p,q,r;k=d;if(b.j&&b.o){n=BD(Ohb(a.f,b.A),57);p=n.d.c+n.d.b;--k}else{p=b.a.c+b.a.b}l=e;if(c.q&&c.o){n=BD(Ohb(a.f,c.C),57);j=n.d.c;++l}else{j=c.a.c}q=j-p;i=$wnd.Math.max(2,l-k);h=q/i;o=p+h;for(m=k;m=0;g+=e?1:-1){h=b[g];i=d==(Ucd(),zcd)?e?V_b(h,d):Su(V_b(h,d)):e?Su(V_b(h,d)):V_b(h,d);f&&(a.c[h.p]=i.gc());for(l=i.Kc();l.Ob();){k=BD(l.Pb(),11);a.d[k.p]=j++}Gkb(c,i)}} +function aQc(a,b,c){var d,e,f,g,h,i,j,k;f=Edb(ED(a.b.Kc().Pb()));j=Edb(ED(Pq(b.b)));d=Y6c(R6c(a.a),j-c);e=Y6c(R6c(b.a),c-f);k=P6c(d,e);Y6c(k,1/(j-f));this.a=k;this.b=new Rkb;h=true;g=a.b.Kc();g.Pb();while(g.Ob()){i=Edb(ED(g.Pb()));if(h&&i-c>Oqe){this.b.Fc(c);h=false}this.b.Fc(i)}h&&this.b.Fc(c)} +function vGb(a){var b,c,d,e;yGb(a,a.n);if(a.d.c.length>0){Blb(a.c);while(GGb(a,BD(mlb(new olb(a.e.a)),121))>5;b&=31;if(d>=a.d){return a.e<0?(Hgb(),Bgb):(Hgb(),Ggb)}f=a.d-d;e=KC(WD,oje,25,f+1,15,1);mhb(e,f,a.a,d,b);if(a.e<0){for(c=0;c0&&a.a[c]<<32-b!=0){for(c=0;c=0){return false}else{c=e1d((O6d(),M6d),e,b);if(!c){return true}else{d=c.Zj();return (d>1||d==-1)&&$1d(q1d(M6d,c))!=3}}}}else{return false}} +function R1b(a,b,c,d){var e,f,g,h,i;h=atd(BD(qud((!b.b&&(b.b=new y5d(z2,b,4,7)),b.b),0),82));i=atd(BD(qud((!b.c&&(b.c=new y5d(z2,b,5,8)),b.c),0),82));if(Xod(h)==Xod(i)){return null}if(ntd(i,h)){return null}g=Mld(b);if(g==c){return d}else{f=BD(Ohb(a.a,g),10);if(f){e=f.e;if(e){return e}}}return null} +function Cac(a,b){var c;c=BD(vNb(a,(Nyc(),Rwc)),276);Odd(b,'Label side selection ('+c+')',1);switch(c.g){case 0:Dac(a,(rbd(),nbd));break;case 1:Dac(a,(rbd(),obd));break;case 2:Bac(a,(rbd(),nbd));break;case 3:Bac(a,(rbd(),obd));break;case 4:Eac(a,(rbd(),nbd));break;case 5:Eac(a,(rbd(),obd));}Qdd(b)} +function bGc(a,b,c){var d,e,f,g,h,i;d=RFc(c,a.length);g=a[d];if(g[0].k!=(j0b(),e0b)){return}f=SFc(c,g.length);i=b.j;for(e=0;e0){c[0]+=a.d;g-=c[0]}if(c[2]>0){c[2]+=a.d;g-=c[2]}f=$wnd.Math.max(0,g);c[1]=$wnd.Math.max(c[1],g);vHb(a,eHb,e.c+d.b+c[0]-(c[1]-g)/2,c);if(b==eHb){a.c.b=f;a.c.c=e.c+d.b+(f-g)/2}} +function AYb(){this.c=KC(UD,Vje,25,(Ucd(),OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])).length,15,1);this.b=KC(UD,Vje,25,OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd]).length,15,1);this.a=KC(UD,Vje,25,OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd]).length,15,1);zlb(this.c,Pje);zlb(this.b,Qje);zlb(this.a,Qje)} +function Ufe(a,b,c){var d,e,f,g;if(b<=c){e=b;f=c}else{e=c;f=b}d=0;if(a.b==null){a.b=KC(WD,oje,25,2,15,1);a.b[0]=e;a.b[1]=f;a.c=true}else{d=a.b.length;if(a.b[d-1]+1==e){a.b[d-1]=f;return}g=KC(WD,oje,25,d+2,15,1);$fb(a.b,0,g,0,d);a.b=g;a.b[d-1]>=e&&(a.c=false,a.a=false);a.b[d++]=e;a.b[d]=f;a.c||Yfe(a)}} +function inc(a,b,c){var d,e,f,g,h,i,j;j=b.d;a.a=new Skb(j.c.length);a.c=new Lqb;for(h=new olb(j);h.a=0?a._g(j,false,true):sid(a,c,false),58));n:for(f=l.Kc();f.Ob();){e=BD(f.Pb(),56);for(k=0;k1){Xxd(e,e.i-1)}}return d}} +function Z2b(a,b){var c,d,e,f,g,h,i;Odd(b,'Comment post-processing',1);for(f=new olb(a.b);f.aa.d[g.p]){c+=zHc(a.b,f);Wjb(a.a,meb(f))}}while(!akb(a.a)){xHc(a.b,BD(fkb(a.a),19).a)}}return c} +function o2c(a,b,c){var d,e,f,g;f=(!b.a&&(b.a=new cUd(E2,b,10,11)),b.a).i;for(e=new Fyd((!b.a&&(b.a=new cUd(E2,b,10,11)),b.a));e.e!=e.i.gc();){d=BD(Dyd(e),33);(!d.a&&(d.a=new cUd(E2,d,10,11)),d.a).i==0||(f+=o2c(a,d,false))}if(c){g=Xod(b);while(g){f+=(!g.a&&(g.a=new cUd(E2,g,10,11)),g.a).i;g=Xod(g)}}return f} +function Xxd(a,b){var c,d,e,f;if(a.ej()){d=null;e=a.fj();a.ij()&&(d=a.kj(a.pi(b),null));c=a.Zi(4,f=tud(a,b),null,b,e);if(a.bj()&&f!=null){d=a.dj(f,d);if(!d){a.$i(c)}else{d.Ei(c);d.Fi()}}else{if(!d){a.$i(c)}else{d.Ei(c);d.Fi()}}return f}else{f=tud(a,b);if(a.bj()&&f!=null){d=a.dj(f,null);!!d&&d.Fi()}return f}} +function UKb(a){var b,c,d,e,f,g,h,i,j,k;j=a.a;b=new Tqb;i=0;for(d=new olb(a.d);d.ah.d&&(k=h.d+h.a+j)}}c.c.d=k;b.a.zc(c,b);i=$wnd.Math.max(i,c.c.d+c.c.a)}return i} +function Orc(){Orc=ccb;Frc=new Prc('COMMENTS',0);Hrc=new Prc('EXTERNAL_PORTS',1);Irc=new Prc('HYPEREDGES',2);Jrc=new Prc('HYPERNODES',3);Krc=new Prc('NON_FREE_PORTS',4);Lrc=new Prc('NORTH_SOUTH_PORTS',5);Nrc=new Prc(Wne,6);Erc=new Prc('CENTER_LABELS',7);Grc=new Prc('END_LABELS',8);Mrc=new Prc('PARTITIONS',9)} +function gVc(a){var b,c,d,e,f;e=new Rkb;b=new Vqb((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));for(d=new Sr(ur(_sd(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),79);if(!JD(qud((!c.b&&(c.b=new y5d(z2,c,4,7)),c.b),0),186)){f=atd(BD(qud((!c.c&&(c.c=new y5d(z2,c,5,8)),c.c),0),82));b.a._b(f)||(e.c[e.c.length]=f,true)}}return e} +function fVc(a){var b,c,d,e,f,g;f=new Tqb;b=new Vqb((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));for(e=new Sr(ur(_sd(a).a.Kc(),new Sq));Qr(e);){d=BD(Rr(e),79);if(!JD(qud((!d.b&&(d.b=new y5d(z2,d,4,7)),d.b),0),186)){g=atd(BD(qud((!d.c&&(d.c=new y5d(z2,d,5,8)),d.c),0),82));b.a._b(g)||(c=f.a.zc(g,f),c==null)}}return f} +function zA(a,b,c,d,e){if(d<0){d=oA(a,e,OC(GC(ZI,1),nie,2,6,[bje,cje,dje,eje,fje,gje,hje,ije,jje,kje,lje,mje]),b);d<0&&(d=oA(a,e,OC(GC(ZI,1),nie,2,6,['Jan','Feb','Mar','Apr',fje,'Jun','Jul','Aug','Sep','Oct','Nov','Dec']),b));if(d<0){return false}c.k=d;return true}else if(d>0){c.k=d-1;return true}return false} +function BA(a,b,c,d,e){if(d<0){d=oA(a,e,OC(GC(ZI,1),nie,2,6,[bje,cje,dje,eje,fje,gje,hje,ije,jje,kje,lje,mje]),b);d<0&&(d=oA(a,e,OC(GC(ZI,1),nie,2,6,['Jan','Feb','Mar','Apr',fje,'Jun','Jul','Aug','Sep','Oct','Nov','Dec']),b));if(d<0){return false}c.k=d;return true}else if(d>0){c.k=d-1;return true}return false} +function DA(a,b,c,d,e,f){var g,h,i,j;h=32;if(d<0){if(b[0]>=a.length){return false}h=bfb(a,b[0]);if(h!=43&&h!=45){return false}++b[0];d=rA(a,b);if(d<0){return false}h==45&&(d=-d)}if(h==32&&b[0]-c==2&&e.b==2){i=new eB;j=i.q.getFullYear()-nje+nje-80;g=j%100;f.a=d==g;d+=(j/100|0)*100+(d=j&&(i=d)}!!i&&(k=$wnd.Math.max(k,i.a.o.a));if(k>m){l=j;m=k}}return l} +function ode(a,b,c){var d,e,f;a.e=c;a.d=0;a.b=0;a.f=1;a.i=b;(a.e&16)==16&&(a.i=Xee(a.i));a.j=a.i.length;nde(a);f=rde(a);if(a.d!=a.j)throw vbb(new mde(tvd((h0d(),sue))));if(a.g){for(d=0;dvre?Okb(i,a.b):d<=vre&&d>wre?Okb(i,a.d):d<=wre&&d>xre?Okb(i,a.c):d<=xre&&Okb(i,a.a);f=ZXc(a,i,f)}return e} +function Hgb(){Hgb=ccb;var a;Cgb=new Ugb(1,1);Egb=new Ugb(1,10);Ggb=new Ugb(0,0);Bgb=new Ugb(-1,1);Dgb=OC(GC(cJ,1),nie,91,0,[Ggb,Cgb,new Ugb(1,2),new Ugb(1,3),new Ugb(1,4),new Ugb(1,5),new Ugb(1,6),new Ugb(1,7),new Ugb(1,8),new Ugb(1,9),Egb]);Fgb=KC(cJ,nie,91,32,0,1);for(a=0;a1;if(h){d=new f7c(e,c.b);Dsb(b.a,d)}n7c(b.a,OC(GC(m1,1),nie,8,0,[m,l]))} +function jdd(a){r4c(a,new E3c(P3c(M3c(O3c(N3c(new R3c,Rse),'ELK Randomizer'),'Distributes the nodes randomly on the plane, leading to very obfuscating layouts. Can be useful to demonstrate the power of "real" layout algorithms.'),new mdd)));p4c(a,Rse,ame,fdd);p4c(a,Rse,wme,15);p4c(a,Rse,yme,meb(0));p4c(a,Rse,_le,tme)} +function hde(){hde=ccb;var a,b,c,d,e,f;fde=KC(SD,wte,25,255,15,1);gde=KC(TD,$ie,25,16,15,1);for(b=0;b<255;b++){fde[b]=-1}for(c=57;c>=48;c--){fde[c]=c-48<<24>>24}for(d=70;d>=65;d--){fde[d]=d-65+10<<24>>24}for(e=102;e>=97;e--){fde[e]=e-97+10<<24>>24}for(f=0;f<10;f++)gde[f]=48+f&aje;for(a=10;a<=15;a++)gde[a]=65+a-10&aje} +function BVc(a,b,c){var d,e,f,g,h,i,j,k;h=b.i-a.g/2;i=c.i-a.g/2;j=b.j-a.g/2;k=c.j-a.g/2;f=b.g+a.g/2;g=c.g+a.g/2;d=b.f+a.g/2;e=c.f+a.g/2;if(h>19!=0){return '-'+qD(hD(a))}c=a;d='';while(!(c.l==0&&c.m==0&&c.h==0)){e=RC(Jje);c=UC(c,e,true);b=''+pD(QC);if(!(c.l==0&&c.m==0&&c.h==0)){f=9-b.length;for(;f>0;f--){b='0'+b}}d=b+d}return d} +function xrb(){if(!Object.create||!Object.getOwnPropertyNames){return false}var a='__proto__';var b=Object.create(null);if(b[a]!==undefined){return false}var c=Object.getOwnPropertyNames(b);if(c.length!=0){return false}b[a]=42;if(b[a]!==42){return false}if(Object.getOwnPropertyNames(b).length==0){return false}return true} +function Pgc(a){var b,c,d,e,f,g,h;b=false;c=0;for(e=new olb(a.d.b);e.a=a.a){return -1}if(!F6b(b,c)){return -1}if(Qq(BD(d.Kb(b),20))){return 1}e=0;for(g=BD(d.Kb(b),20).Kc();g.Ob();){f=BD(g.Pb(),17);i=f.c.i==b?f.d.i:f.c.i;h=G6b(a,i,c,d);if(h==-1){return -1}e=$wnd.Math.max(e,h);if(e>a.c-1){return -1}}return e+1} +function Btd(a,b){var c,d,e,f,g,h;if(PD(b)===PD(a)){return true}if(!JD(b,15)){return false}d=BD(b,15);h=a.gc();if(d.gc()!=h){return false}g=d.Kc();if(a.ni()){for(c=0;c0){a.qj();if(b!=null){for(f=0;f>24}case 97:case 98:case 99:case 100:case 101:case 102:{return a-97+10<<24>>24}case 65:case 66:case 67:case 68:case 69:case 70:{return a-65+10<<24>>24}default:{throw vbb(new Oeb('Invalid hexadecimal'))}}} +function AUc(a,b,c){var d,e,f,g;Odd(c,'Processor order nodes',2);a.a=Edb(ED(vNb(b,(JTc(),HTc))));e=new Psb;for(g=Jsb(b.b,0);g.b!=g.d.c;){f=BD(Xsb(g),86);Ccb(DD(vNb(f,(mTc(),jTc))))&&(Gsb(e,f,e.c.b,e.c),true)}d=(sCb(e.b!=0),BD(e.a.a.c,86));yUc(a,d);!c.b&&Rdd(c,1);BUc(a,d,0-Edb(ED(vNb(d,(mTc(),bTc))))/2,0);!c.b&&Rdd(c,1);Qdd(c)} +function rFb(){rFb=ccb;qFb=new sFb('SPIRAL',0);lFb=new sFb('LINE_BY_LINE',1);mFb=new sFb('MANHATTAN',2);kFb=new sFb('JITTER',3);oFb=new sFb('QUADRANTS_LINE_BY_LINE',4);pFb=new sFb('QUADRANTS_MANHATTAN',5);nFb=new sFb('QUADRANTS_JITTER',6);jFb=new sFb('COMBINE_LINE_BY_LINE_MANHATTAN',7);iFb=new sFb('COMBINE_JITTER_MANHATTAN',8)} +function roc(a,b,c,d){var e,f,g,h,i,j;i=woc(a,c);j=woc(b,c);e=false;while(!!i&&!!j){if(d||uoc(i,j,c)){g=woc(i,c);h=woc(j,c);zoc(b);zoc(a);f=i.c;sbc(i,false);sbc(j,false);if(c){Z_b(b,j.p,f);b.p=j.p;Z_b(a,i.p+1,f);a.p=i.p}else{Z_b(a,i.p,f);a.p=i.p;Z_b(b,j.p+1,f);b.p=j.p}$_b(i,null);$_b(j,null);i=g;j=h;e=true}else{break}}return e} +function VDc(a,b,c,d){var e,f,g,h,i;e=false;f=false;for(h=new olb(d.j);h.a=b.length){throw vbb(new qcb('Greedy SwitchDecider: Free layer not in graph.'))}this.c=b[a];this.e=new dIc(d);THc(this.e,this.c,(Ucd(),Tcd));this.i=new dIc(d);THc(this.i,this.c,zcd);this.f=new ejc(this.c);this.a=!f&&e.i&&!e.s&&this.c[0].k==(j0b(),e0b);this.a&&hjc(this,a,b.length)} +function hKb(a,b){var c,d,e,f,g,h;f=!a.B.Hc((Idd(),zdd));g=a.B.Hc(Cdd);a.a=new FHb(g,f,a.c);!!a.n&&u_b(a.a.n,a.n);lIb(a.g,(gHb(),eHb),a.a);if(!b){d=new mIb(1,f,a.c);d.n.a=a.k;Npb(a.p,(Ucd(),Acd),d);e=new mIb(1,f,a.c);e.n.d=a.k;Npb(a.p,Rcd,e);h=new mIb(0,f,a.c);h.n.c=a.k;Npb(a.p,Tcd,h);c=new mIb(0,f,a.c);c.n.b=a.k;Npb(a.p,zcd,c)}} +function Vgc(a){var b,c,d;b=BD(vNb(a.d,(Nyc(),Swc)),218);switch(b.g){case 2:c=Ngc(a);break;case 3:c=(d=new Rkb,MAb(JAb(NAb(LAb(LAb(new YAb(null,new Kub(a.d.b,16)),new Shc),new Uhc),new Whc),new ehc),new Yhc(d)),d);break;default:throw vbb(new Zdb('Compaction not supported for '+b+' edges.'));}Ugc(a,c);reb(new Pib(a.g),new Ehc(a))} +function a2c(a,b){var c;c=new zNb;!!b&&tNb(c,BD(Ohb(a.a,C2),94));JD(b,470)&&tNb(c,BD(Ohb(a.a,G2),94));if(JD(b,354)){tNb(c,BD(Ohb(a.a,D2),94));return c}JD(b,82)&&tNb(c,BD(Ohb(a.a,z2),94));if(JD(b,239)){tNb(c,BD(Ohb(a.a,E2),94));return c}if(JD(b,186)){tNb(c,BD(Ohb(a.a,F2),94));return c}JD(b,352)&&tNb(c,BD(Ohb(a.a,B2),94));return c} +function wSb(){wSb=ccb;oSb=new Osd((Y9c(),D9c),meb(1));uSb=new Osd(T9c,80);tSb=new Osd(M9c,5);bSb=new Osd(r8c,tme);pSb=new Osd(E9c,meb(1));sSb=new Osd(H9c,(Bcb(),true));lSb=new q0b(50);kSb=new Osd(f9c,lSb);dSb=O8c;mSb=t9c;cSb=new Osd(B8c,false);jSb=e9c;iSb=b9c;hSb=Y8c;gSb=W8c;nSb=x9c;fSb=(SRb(),LRb);vSb=QRb;eSb=KRb;qSb=NRb;rSb=PRb} +function ZXb(a){var b,c,d,e,f,g,h,i;i=new jYb;for(h=new olb(a.a);h.a0&&b=0){return false}else{b.p=c.b;Ekb(c.e,b)}if(e==(j0b(),g0b)||e==i0b){for(g=new olb(b.j);g.a1||g==-1)&&(f|=16);(e.Bb&ote)!=0&&(f|=64)}(c.Bb&Tje)!=0&&(f|=Dve);f|=zte}else{if(JD(b,457)){f|=512}else{d=b.Bj();!!d&&(d.i&1)!=0&&(f|=256)}}(a.Bb&512)!=0&&(f|=128);return f} +function hc(a,b){var c,d,e,f,g;a=a==null?Xhe:(uCb(a),a);for(e=0;ea.d[h.p]){c+=zHc(a.b,f);Wjb(a.a,meb(f))}}else{++g}}c+=a.b.d*g;while(!akb(a.a)){xHc(a.b,BD(fkb(a.a),19).a)}}return c} +function Y6d(a,b){var c;if(a.f==W6d){c=$1d(q1d((O6d(),M6d),b));return a.e?c==4&&b!=(m8d(),k8d)&&b!=(m8d(),h8d)&&b!=(m8d(),i8d)&&b!=(m8d(),j8d):c==2}if(!!a.d&&(a.d.Hc(b)||a.d.Hc(_1d(q1d((O6d(),M6d),b)))||a.d.Hc(e1d((O6d(),M6d),a.b,b)))){return true}if(a.f){if(x1d((O6d(),a.f),b2d(q1d(M6d,b)))){c=$1d(q1d(M6d,b));return a.e?c==4:c==2}}return false} +function iVc(a,b,c,d){var e,f,g,h,i,j,k,l;g=BD(hkd(c,(Y9c(),C9c)),8);i=g.a;k=g.b+a;e=$wnd.Math.atan2(k,i);e<0&&(e+=dre);e+=b;e>dre&&(e-=dre);h=BD(hkd(d,C9c),8);j=h.a;l=h.b+a;f=$wnd.Math.atan2(l,j);f<0&&(f+=dre);f+=b;f>dre&&(f-=dre);return Iy(),My(1.0E-10),$wnd.Math.abs(e-f)<=1.0E-10||e==f||isNaN(e)&&isNaN(f)?0:ef?1:Ny(isNaN(e),isNaN(f))} +function YDb(a){var b,c,d,e,f,g,h;h=new Lqb;for(d=new olb(a.a.b);d.a=b.o){throw vbb(new rcb)}i=c>>5;h=c&31;g=Nbb(1,Tbb(Nbb(h,1)));f?(b.n[d][i]=Mbb(b.n[d][i],g)):(b.n[d][i]=xbb(b.n[d][i],Lbb(g)));g=Nbb(g,1);e?(b.n[d][i]=Mbb(b.n[d][i],g)):(b.n[d][i]=xbb(b.n[d][i],Lbb(g)))}catch(a){a=ubb(a);if(JD(a,320)){throw vbb(new qcb(Dle+b.o+'*'+b.p+Ele+c+She+d+Fle))}else throw vbb(a)}} +function BUc(a,b,c,d){var e,f,g;if(b){f=Edb(ED(vNb(b,(mTc(),fTc))))+d;g=c+Edb(ED(vNb(b,bTc)))/2;yNb(b,kTc,meb(Tbb(Cbb($wnd.Math.round(f)))));yNb(b,lTc,meb(Tbb(Cbb($wnd.Math.round(g)))));b.d.b==0||BUc(a,BD(pr((e=Jsb((new ZRc(b)).a.d,0),new aSc(e))),86),c+Edb(ED(vNb(b,bTc)))+a.a,d+Edb(ED(vNb(b,cTc))));vNb(b,iTc)!=null&&BUc(a,BD(vNb(b,iTc),86),c,d)}} +function N9b(a,b){var c,d,e,f,g,h,i,j,k,l,m;i=Q_b(b.a);e=Edb(ED(vNb(i,(Nyc(),pyc))))*2;k=Edb(ED(vNb(i,wyc)));j=$wnd.Math.max(e,k);f=KC(UD,Vje,25,b.f-b.c+1,15,1);d=-j;c=0;for(h=b.b.Kc();h.Ob();){g=BD(h.Pb(),10);d+=a.a[g.c.p]+j;f[c++]=d}d+=a.a[b.a.c.p]+j;f[c++]=d;for(m=new olb(b.e);m.a0){d=(!a.n&&(a.n=new cUd(D2,a,1,7)),BD(qud(a.n,0),137)).a;!d||Qfb(Qfb((b.a+=' "',b),d),'"')}}else{Qfb(Qfb((b.a+=' "',b),c),'"')}Qfb(Lfb(Qfb(Lfb(Qfb(Lfb(Qfb(Lfb((b.a+=' (',b),a.i),','),a.j),' | '),a.g),','),a.f),')');return b.a} +function opd(a){var b,c,d;if((a.Db&64)!=0)return fld(a);b=new Wfb(fte);c=a.k;if(!c){!a.n&&(a.n=new cUd(D2,a,1,7));if(a.n.i>0){d=(!a.n&&(a.n=new cUd(D2,a,1,7)),BD(qud(a.n,0),137)).a;!d||Qfb(Qfb((b.a+=' "',b),d),'"')}}else{Qfb(Qfb((b.a+=' "',b),c),'"')}Qfb(Lfb(Qfb(Lfb(Qfb(Lfb(Qfb(Lfb((b.a+=' (',b),a.i),','),a.j),' | '),a.g),','),a.f),')');return b.a} +function h4c(a,b){var c,d,e,f,g,h,i;if(b==null||b.length==0){return null}e=BD(Phb(a.a,b),149);if(!e){for(d=(h=(new $ib(a.b)).a.vc().Kc(),new djb(h));d.a.Ob();){c=(f=BD(d.a.Pb(),42),BD(f.dd(),149));g=c.c;i=b.length;if(dfb(g.substr(g.length-i,i),b)&&(b.length==g.length||bfb(g,g.length-b.length-1)==46)){if(e){return null}e=c}}!!e&&Shb(a.a,b,e)}return e} +function QLb(a,b){var c,d,e,f;c=new VLb;d=BD(GAb(NAb(new YAb(null,new Kub(a.f,16)),c),Ayb(new hzb,new jzb,new Gzb,new Izb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Eyb),Dyb]))),21);e=d.gc();d=BD(GAb(NAb(new YAb(null,new Kub(b.f,16)),c),Ayb(new hzb,new jzb,new Gzb,new Izb,OC(GC(xL,1),Kie,132,0,[Eyb,Dyb]))),21);f=d.gc();if(ee.p){G0b(f,Rcd);if(f.d){h=f.o.b;b=f.a.b;f.a.b=h-b}}else if(f.j==Rcd&&e.p>a.p){G0b(f,Acd);if(f.d){h=f.o.b;b=f.a.b;f.a.b=-(h-b)}}break}}return e} +function NOc(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o;f=c;if(c1;if(h){d=new f7c(e,c.b);Dsb(b.a,d)}n7c(b.a,OC(GC(m1,1),nie,8,0,[m,l]))} +function Nid(a,b,c){var d,e,f,g,h,i;if(!b){return null}else{if(c<=-1){d=XKd(b.Tg(),-1-c);if(JD(d,99)){return BD(d,18)}else{g=BD(b.ah(d),153);for(h=0,i=g.gc();h0){e=i.length;while(e>0&&i[e-1]==''){--e}e=40;g&&FGb(a);wGb(a);vGb(a);c=zGb(a);d=0;while(!!c&&d0&&Dsb(a.f,f)}else{a.c[g]-=j+1;a.c[g]<=0&&a.a[g]>0&&Dsb(a.e,f)}}}}} +function _Kb(a){var b,c,d,e,f,g,h,i,j;h=new Hxb(BD(Qb(new nLb),62));j=Qje;for(c=new olb(a.d);c.a=0&&ic?b:c;j<=l;++j){if(j==c){h=d++}else{f=e[j];k=o.rl(f.ak());j==b&&(i=j==l&&!k?d-1:d);k&&++d}}m=BD(Wxd(a,b,c),72);h!=i&&GLd(a,new ESd(a.e,7,g,meb(h),n.dd(),i));return m}}}else{return BD(sud(a,b,c),72)}return BD(Wxd(a,b,c),72)} +function Qcc(a,b){var c,d,e,f,g,h,i;Odd(b,'Port order processing',1);i=BD(vNb(a,(Nyc(),_xc)),421);for(d=new olb(a.b);d.a=0){h=bD(a,g);if(h){j<22?(i.l|=1<>>1;g.m=k>>>1|(l&1)<<21;g.l=m>>>1|(k&1)<<21;--j}c&&ZC(i);if(f){if(d){QC=hD(a);e&&(QC=nD(QC,(wD(),uD)))}else{QC=TC(a.l,a.m,a.h)}}return i} +function TDc(a,b){var c,d,e,f,g,h,i,j,k,l;j=a.e[b.c.p][b.p]+1;i=b.c.a.c.length+1;for(h=new olb(a.a);h.a0&&(BCb(0,a.length),a.charCodeAt(0)==45||(BCb(0,a.length),a.charCodeAt(0)==43))?1:0;for(d=g;dc){throw vbb(new Oeb(Oje+a+'"'))}return h} +function dnc(a){var b,c,d,e,f,g,h;g=new Psb;for(f=new olb(a.a);f.a1)&&b==1&&BD(a.a[a.b],10).k==(j0b(),f0b)){zac(BD(a.a[a.b],10),(rbd(),nbd))}else if(d&&(!c||(a.c-a.b&a.a.length-1)>1)&&b==1&&BD(a.a[a.c-1&a.a.length-1],10).k==(j0b(),f0b)){zac(BD(a.a[a.c-1&a.a.length-1],10),(rbd(),obd))}else if((a.c-a.b&a.a.length-1)==2){zac(BD(bkb(a),10),(rbd(),nbd));zac(BD(bkb(a),10),obd)}else{wac(a,e)}Yjb(a)} +function pRc(a,b,c){var d,e,f,g,h;f=0;for(e=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));e.e!=e.i.gc();){d=BD(Dyd(e),33);g='';(!d.n&&(d.n=new cUd(D2,d,1,7)),d.n).i==0||(g=BD(qud((!d.n&&(d.n=new cUd(D2,d,1,7)),d.n),0),137).a);h=new XRc(f++,b,g);tNb(h,d);yNb(h,(mTc(),dTc),d);h.e.b=d.j+d.f/2;h.f.a=$wnd.Math.max(d.g,1);h.e.a=d.i+d.g/2;h.f.b=$wnd.Math.max(d.f,1);Dsb(b.b,h);jrb(c.f,d,h)}} +function B2b(a){var b,c,d,e,f;d=BD(vNb(a,(wtc(),$sc)),33);f=BD(hkd(d,(Nyc(),Fxc)),174).Hc((tdd(),sdd));if(!a.e){e=BD(vNb(a,Ksc),21);b=new f7c(a.f.a+a.d.b+a.d.c,a.f.b+a.d.d+a.d.a);if(e.Hc((Orc(),Hrc))){jkd(d,Vxc,(dcd(),$bd));Afd(d,b.a,b.b,false,true)}else{Ccb(DD(hkd(d,Gxc)))||Afd(d,b.a,b.b,true,true)}}f?jkd(d,Fxc,pqb(sdd)):jkd(d,Fxc,(c=BD(gdb(I1),9),new xqb(c,BD(_Bb(c,c.length),9),0)))} +function tA(a,b,c){var d,e,f,g;if(b[0]>=a.length){c.o=0;return true}switch(bfb(a,b[0])){case 43:e=1;break;case 45:e=-1;break;default:c.o=0;return true;}++b[0];f=b[0];g=rA(a,b);if(g==0&&b[0]==f){return false}if(b[0]=0&&h!=c){f=new nSd(a,1,h,g,null);!d?(d=f):d.Ei(f)}if(c>=0){f=new nSd(a,1,c,h==c?g:null,b);!d?(d=f):d.Ei(f)}}return d} +function LEd(a){var b,c,d;if(a.b==null){d=new Hfb;if(a.i!=null){Efb(d,a.i);d.a+=':'}if((a.f&256)!=0){if((a.f&256)!=0&&a.a!=null){YEd(a.i)||(d.a+='//',d);Efb(d,a.a)}if(a.d!=null){d.a+='/';Efb(d,a.d)}(a.f&16)!=0&&(d.a+='/',d);for(b=0,c=a.j.length;bm){return false}l=(i=MZc(d,m,false),i.a);if(k+h+l<=b.b){KZc(c,f-c.s);c.c=true;KZc(d,f-c.s);OZc(d,c.s,c.t+c.d+h);d.k=true;WZc(c.q,d);n=true;if(e){s$c(b,d);d.j=b;if(a.c.length>g){v$c((tCb(g,a.c.length),BD(a.c[g],200)),d);(tCb(g,a.c.length),BD(a.c[g],200)).a.c.length==0&&Kkb(a,g)}}}return n} +function kcc(a,b){var c,d,e,f,g,h;Odd(b,'Partition midprocessing',1);e=new Hp;MAb(JAb(new YAb(null,new Kub(a.a,16)),new occ),new qcc(e));if(e.d==0){return}h=BD(GAb(UAb((f=e.i,new YAb(null,(!f?(e.i=new zf(e,e.c)):f).Nc()))),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)]))),15);d=h.Kc();c=BD(d.Pb(),19);while(d.Ob()){g=BD(d.Pb(),19);jcc(BD(Qc(e,c),21),BD(Qc(e,g),21));c=g}Qdd(b)} +function DYb(a,b,c){var d,e,f,g,h,i,j,k;if(b.p==0){b.p=1;g=c;if(!g){e=new Rkb;f=(d=BD(gdb(F1),9),new xqb(d,BD(_Bb(d,d.length),9),0));g=new vgd(e,f)}BD(g.a,15).Fc(b);b.k==(j0b(),e0b)&&BD(g.b,21).Fc(BD(vNb(b,(wtc(),Hsc)),61));for(i=new olb(b.j);i.a0){e=BD(a.Ab.g,1934);if(b==null){for(f=0;f1){for(d=new olb(e);d.ac.s&&hh){h=e;k.c=KC(SI,Uhe,1,0,5,1)}e==h&&Ekb(k,new vgd(c.c.i,c))}mmb();Okb(k,a.c);Dkb(a.b,i.p,k)}}} +function MMc(a,b){var c,d,e,f,g,h,i,j,k;for(g=new olb(b.b);g.ah){h=e;k.c=KC(SI,Uhe,1,0,5,1)}e==h&&Ekb(k,new vgd(c.d.i,c))}mmb();Okb(k,a.c);Dkb(a.f,i.p,k)}}} +function Y7c(a){r4c(a,new E3c(P3c(M3c(O3c(N3c(new R3c,qse),'ELK Box'),'Algorithm for packing of unconnected boxes, i.e. graphs without edges.'),new _7c)));p4c(a,qse,ame,U7c);p4c(a,qse,wme,15);p4c(a,qse,vme,meb(0));p4c(a,qse,Jre,Ksd(O7c));p4c(a,qse,Fme,Ksd(Q7c));p4c(a,qse,Eme,Ksd(S7c));p4c(a,qse,_le,pse);p4c(a,qse,Ame,Ksd(P7c));p4c(a,qse,Tme,Ksd(R7c));p4c(a,qse,rse,Ksd(M7c));p4c(a,qse,lqe,Ksd(N7c))} +function W$b(a,b){var c,d,e,f,g,h,i,j,k;e=a.i;g=e.o.a;f=e.o.b;if(g<=0&&f<=0){return Ucd(),Scd}j=a.n.a;k=a.n.b;h=a.o.a;c=a.o.b;switch(b.g){case 2:case 1:if(j<0){return Ucd(),Tcd}else if(j+h>g){return Ucd(),zcd}break;case 4:case 3:if(k<0){return Ucd(),Acd}else if(k+c>f){return Ucd(),Rcd}}i=(j+h/2)/g;d=(k+c/2)/f;return i+d<=1&&i-d<=0?(Ucd(),Tcd):i+d>=1&&i-d>=0?(Ucd(),zcd):d<0.5?(Ucd(),Acd):(Ucd(),Rcd)} +function pJc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p;c=false;k=Edb(ED(vNb(b,(Nyc(),vyc))));o=Qie*k;for(e=new olb(b.b);e.ai+o){p=l.g+m.g;m.a=(m.g*m.a+l.g*l.a)/p;m.g=p;l.f=m;c=true}}f=h;l=m}}return c} +function VGb(a,b,c,d,e,f,g){var h,i,j,k,l,m;m=new I6c;for(j=b.Kc();j.Ob();){h=BD(j.Pb(),839);for(l=new olb(h.wf());l.a0){if(h.a){j=h.b.rf().b;if(e>j){if(a.v||h.c.d.c.length==1){g=(e-j)/2;h.d.d=g;h.d.a=g}else{c=BD(Ikb(h.c.d,0),181).rf().b;d=(c-j)/2;h.d.d=$wnd.Math.max(0,d);h.d.a=e-d-j}}}else{h.d.a=a.t+e}}else if(tcd(a.u)){f=sfd(h.b);f.d<0&&(h.d.d=-f.d);f.d+f.a>h.b.rf().b&&(h.d.a=f.d+f.a-h.b.rf().b)}}} +function FC(a,b){var c;switch(HC(a)){case 6:return ND(b);case 7:return LD(b);case 8:return KD(b);case 3:return Array.isArray(b)&&(c=HC(b),!(c>=14&&c<=16));case 11:return b!=null&&typeof b===Nhe;case 12:return b!=null&&(typeof b===Jhe||typeof b==Nhe);case 0:return AD(b,a.__elementTypeId$);case 2:return OD(b)&&!(b.im===gcb);case 1:return OD(b)&&!(b.im===gcb)||AD(b,a.__elementTypeId$);default:return true;}} +function xOb(a,b){var c,d,e,f;d=$wnd.Math.min($wnd.Math.abs(a.c-(b.c+b.b)),$wnd.Math.abs(a.c+a.b-b.c));f=$wnd.Math.min($wnd.Math.abs(a.d-(b.d+b.a)),$wnd.Math.abs(a.d+a.a-b.d));c=$wnd.Math.abs(a.c+a.b/2-(b.c+b.b/2));if(c>a.b/2+b.b/2){return 1}e=$wnd.Math.abs(a.d+a.a/2-(b.d+b.a/2));if(e>a.a/2+b.a/2){return 1}if(c==0&&e==0){return 0}if(c==0){return f/e+1}if(e==0){return d/c+1}return $wnd.Math.min(d/c,f/e)+1} +function mgb(a,b){var c,d,e,f,g,h;e=pgb(a);h=pgb(b);if(e==h){if(a.e==b.e&&a.a<54&&b.a<54){return a.fb.f?1:0}d=a.e-b.e;c=(a.d>0?a.d:$wnd.Math.floor((a.a-1)*Xje)+1)-(b.d>0?b.d:$wnd.Math.floor((b.a-1)*Xje)+1);if(c>d+1){return e}else if(c0&&(g=Ogb(g,Khb(d)));return Igb(f,g)}}else return e0&&a.d!=(yTb(),xTb)&&(h+=g*(d.d.a+a.a[b.b][d.b]*(b.d.a-d.d.a)/c));c>0&&a.d!=(yTb(),vTb)&&(i+=g*(d.d.b+a.a[b.b][d.b]*(b.d.b-d.d.b)/c))}switch(a.d.g){case 1:return new f7c(h/f,b.d.b);case 2:return new f7c(b.d.a,i/f);default:return new f7c(h/f,i/f);}} +function Wcc(a,b){Occ();var c,d,e,f,g;g=BD(vNb(a.i,(Nyc(),Vxc)),98);f=a.j.g-b.j.g;if(f!=0||!(g==(dcd(),Zbd)||g==_bd||g==$bd)){return 0}if(g==(dcd(),Zbd)){c=BD(vNb(a,Wxc),19);d=BD(vNb(b,Wxc),19);if(!!c&&!!d){e=c.a-d.a;if(e!=0){return e}}}switch(a.j.g){case 1:return Kdb(a.n.a,b.n.a);case 2:return Kdb(a.n.b,b.n.b);case 3:return Kdb(b.n.a,a.n.a);case 4:return Kdb(b.n.b,a.n.b);default:throw vbb(new Zdb(ine));}} +function tfd(a){var b,c,d,e,f,g;c=(!a.a&&(a.a=new xMd(y2,a,5)),a.a).i+2;g=new Skb(c);Ekb(g,new f7c(a.j,a.k));MAb(new YAb(null,(!a.a&&(a.a=new xMd(y2,a,5)),new Kub(a.a,16))),new Qfd(g));Ekb(g,new f7c(a.b,a.c));b=1;while(b0){jEb(i,false,(ead(),aad));jEb(i,true,bad)}Hkb(b.g,new $hc(a,c));Rhb(a.g,b,c)} +function Neb(){Neb=ccb;var a;Jeb=OC(GC(WD,1),oje,25,15,[-1,-1,30,19,15,13,11,11,10,9,9,8,8,8,8,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5]);Keb=KC(WD,oje,25,37,15,1);Leb=OC(GC(WD,1),oje,25,15,[-1,-1,63,40,32,28,25,23,21,20,19,19,18,18,17,17,16,16,16,15,15,15,15,14,14,14,14,14,14,13,13,13,13,13,13,13,13]);Meb=KC(XD,Sje,25,37,14,1);for(a=2;a<=36;a++){Keb[a]=QD($wnd.Math.pow(a,Jeb[a]));Meb[a]=Abb(rie,Keb[a])}} +function pfd(a){var b;if((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a).i!=1){throw vbb(new Wdb(Tse+(!a.a&&(a.a=new cUd(A2,a,6,6)),a.a).i))}b=new s7c;!!btd(BD(qud((!a.b&&(a.b=new y5d(z2,a,4,7)),a.b),0),82))&&ye(b,qfd(a,btd(BD(qud((!a.b&&(a.b=new y5d(z2,a,4,7)),a.b),0),82)),false));!!btd(BD(qud((!a.c&&(a.c=new y5d(z2,a,5,8)),a.c),0),82))&&ye(b,qfd(a,btd(BD(qud((!a.c&&(a.c=new y5d(z2,a,5,8)),a.c),0),82)),true));return b} +function _Mc(a,b){var c,d,e,f,g;b.d?(e=a.a.c==(YLc(),XLc)?R_b(b.b):U_b(b.b)):(e=a.a.c==(YLc(),WLc)?R_b(b.b):U_b(b.b));f=false;for(d=new Sr(ur(e.a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),17);g=Ccb(a.a.f[a.a.g[b.b.p].p]);if(!g&&!OZb(c)&&c.c.i.c==c.d.i.c){continue}if(Ccb(a.a.n[a.a.g[b.b.p].p])||Ccb(a.a.n[a.a.g[b.b.p].p])){continue}f=true;if(Rqb(a.b,a.a.g[TMc(c,b.b).p])){b.c=true;b.a=c;return b}}b.c=f;b.a=null;return b} +function bed(a,b,c,d,e){var f,g,h,i,j,k,l;mmb();Okb(a,new Red);h=new Bib(a,0);l=new Rkb;f=0;while(h.bf*2){k=new wed(l);j=red(g)/qed(g);i=fed(k,b,new p0b,c,d,e,j);P6c(X6c(k.e),i);l.c=KC(SI,Uhe,1,0,5,1);f=0;l.c[l.c.length]=k;l.c[l.c.length]=g;f=red(k)*qed(k)+red(g)*qed(g)}else{l.c[l.c.length]=g;f+=red(g)*qed(g)}}return l} +function qwd(a,b,c){var d,e,f,g,h,i,j;d=c.gc();if(d==0){return false}else{if(a.ej()){i=a.fj();zvd(a,b,c);g=d==1?a.Zi(3,null,c.Kc().Pb(),b,i):a.Zi(5,null,c,b,i);if(a.bj()){h=d<100?null:new Ixd(d);f=b+d;for(e=b;e0){for(g=0;g>16==-15&&a.Cb.nh()&&Rwd(new oSd(a.Cb,9,13,c,a.c,HLd(QSd(BD(a.Cb,59)),a)))}else if(JD(a.Cb,88)){if(a.Db>>16==-23&&a.Cb.nh()){b=a.c;JD(b,88)||(b=(jGd(),_Fd));JD(c,88)||(c=(jGd(),_Fd));Rwd(new oSd(a.Cb,9,10,c,b,HLd(VKd(BD(a.Cb,26)),a)))}}}}return a.c} +function f7b(a,b){var c,d,e,f,g,h,i,j,k,l;Odd(b,'Hypernodes processing',1);for(e=new olb(a.b);e.ac);return e} +function XFc(a,b){var c,d,e;d=Cub(a.d,1)!=0;!Ccb(DD(vNb(b.j,(wtc(),Jsc))))&&!Ccb(DD(vNb(b.j,mtc)))||PD(vNb(b.j,(Nyc(),ywc)))===PD((tAc(),rAc))?b.c.Tf(b.e,d):(d=Ccb(DD(vNb(b.j,Jsc))));dGc(a,b,d,true);Ccb(DD(vNb(b.j,mtc)))&&yNb(b.j,mtc,(Bcb(),false));if(Ccb(DD(vNb(b.j,Jsc)))){yNb(b.j,Jsc,(Bcb(),false));yNb(b.j,mtc,true)}c=NFc(a,b);do{$Fc(a);if(c==0){return 0}d=!d;e=c;dGc(a,b,d,false);c=NFc(a,b)}while(e>c);return e} +function uNd(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o;if(b==c){return true}else{b=vNd(a,b);c=vNd(a,c);d=JQd(b);if(d){k=JQd(c);if(k!=d){if(!k){return false}else{i=d.Dj();o=k.Dj();return i==o&&i!=null}}else{g=(!b.d&&(b.d=new xMd(j5,b,1)),b.d);f=g.i;m=(!c.d&&(c.d=new xMd(j5,c,1)),c.d);if(f==m.i){for(j=0;j0;h=xFb(b,f);c?OFb(h.b,b):OFb(h.g,b);LFb(h).c.length==1&&(Gsb(d,h,d.c.b,d.c),true);e=new vgd(f,b);Wjb(a.o,e);Lkb(a.e.a,f)}} +function _Nb(a,b){var c,d,e,f,g,h,i;d=$wnd.Math.abs(D6c(a.b).a-D6c(b.b).a);h=$wnd.Math.abs(D6c(a.b).b-D6c(b.b).b);e=0;i=0;c=1;g=1;if(d>a.b.b/2+b.b.b/2){e=$wnd.Math.min($wnd.Math.abs(a.b.c-(b.b.c+b.b.b)),$wnd.Math.abs(a.b.c+a.b.b-b.b.c));c=1-e/d}if(h>a.b.a/2+b.b.a/2){i=$wnd.Math.min($wnd.Math.abs(a.b.d-(b.b.d+b.b.a)),$wnd.Math.abs(a.b.d+a.b.a-b.b.d));g=1-i/h}f=$wnd.Math.min(c,g);return (1-f)*$wnd.Math.sqrt(d*d+h*h)} +function lQc(a){var b,c,d,e;nQc(a,a.e,a.f,(FQc(),DQc),true,a.c,a.i);nQc(a,a.e,a.f,DQc,false,a.c,a.i);nQc(a,a.e,a.f,EQc,true,a.c,a.i);nQc(a,a.e,a.f,EQc,false,a.c,a.i);mQc(a,a.c,a.e,a.f,a.i);d=new Bib(a.i,0);while(d.b=65;c--){$ce[c]=c-65<<24>>24}for(d=122;d>=97;d--){$ce[d]=d-97+26<<24>>24}for(e=57;e>=48;e--){$ce[e]=e-48+52<<24>>24}$ce[43]=62;$ce[47]=63;for(f=0;f<=25;f++)_ce[f]=65+f&aje;for(g=26,i=0;g<=51;++g,i++)_ce[g]=97+i&aje;for(a=52,h=0;a<=61;++a,h++)_ce[a]=48+h&aje;_ce[62]=43;_ce[63]=47} +function FXb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n;if(a.dc()){return new d7c}j=0;l=0;for(e=a.Kc();e.Ob();){d=BD(e.Pb(),37);f=d.f;j=$wnd.Math.max(j,f.a);l+=f.a*f.b}j=$wnd.Math.max(j,$wnd.Math.sqrt(l)*Edb(ED(vNb(BD(a.Kc().Pb(),37),(Nyc(),owc)))));m=0;n=0;i=0;c=b;for(h=a.Kc();h.Ob();){g=BD(h.Pb(),37);k=g.f;if(m+k.a>j){m=0;n+=i+b;i=0}uXb(g,m,n);c=$wnd.Math.max(c,m+k.a);i=$wnd.Math.max(i,k.b);m+=k.a+b}return new f7c(c+b,n+i+b)} +function mQc(a,b,c,d,e){var f,g,h,i,j,k,l;for(g=new olb(b);g.af){return Ucd(),zcd}break;case 4:case 3:if(i<0){return Ucd(),Acd}else if(i+a.f>e){return Ucd(),Rcd}}g=(h+a.g/2)/f;c=(i+a.f/2)/e;return g+c<=1&&g-c<=0?(Ucd(),Tcd):g+c>=1&&g-c>=0?(Ucd(),zcd):c<0.5?(Ucd(),Acd):(Ucd(),Rcd)} +function vhb(a,b,c,d,e){var f,g;f=wbb(xbb(b[0],Yje),xbb(d[0],Yje));a[0]=Tbb(f);f=Obb(f,32);if(c>=e){for(g=1;g0){e.b[g++]=0;e.b[g++]=f.b[0]-1}for(b=1;b0){pOc(i,i.d-e.d);e.c==(HOc(),FOc)&&nOc(i,i.a-e.d);i.d<=0&&i.i>0&&(Gsb(b,i,b.c.b,b.c),true)}}}for(f=new olb(a.f);f.a0){qOc(h,h.i-e.d);e.c==(HOc(),FOc)&&oOc(h,h.b-e.d);h.i<=0&&h.d>0&&(Gsb(c,h,c.c.b,c.c),true)}}}} +function gSc(a,b,c){var d,e,f,g,h,i,j,k;Odd(c,'Processor compute fanout',1);Uhb(a.b);Uhb(a.a);h=null;f=Jsb(b.b,0);while(!h&&f.b!=f.d.c){j=BD(Xsb(f),86);Ccb(DD(vNb(j,(mTc(),jTc))))&&(h=j)}i=new Psb;Gsb(i,h,i.c.b,i.c);fSc(a,i);for(k=Jsb(b.b,0);k.b!=k.d.c;){j=BD(Xsb(k),86);g=GD(vNb(j,(mTc(),$Sc)));e=Phb(a.b,g)!=null?BD(Phb(a.b,g),19).a:0;yNb(j,ZSc,meb(e));d=1+(Phb(a.a,g)!=null?BD(Phb(a.a,g),19).a:0);yNb(j,XSc,meb(d))}Qdd(c)} +function WPc(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o;m=VPc(a,c);for(i=0;i0);d.a.Xb(d.c=--d.b);l>m+i&&uib(d)}for(g=new olb(n);g.a0);d.a.Xb(d.c=--d.b)}}}} +function Jfe(){wfe();var a,b,c,d,e,f;if(gfe)return gfe;a=(++vfe,new $fe(4));Xfe(a,Kfe(vxe,true));Zfe(a,Kfe('M',true));Zfe(a,Kfe('C',true));f=(++vfe,new $fe(4));for(d=0;d<11;d++){Ufe(f,d,d)}b=(++vfe,new $fe(4));Xfe(b,Kfe('M',true));Ufe(b,4448,4607);Ufe(b,65438,65439);e=(++vfe,new Lge(2));Kge(e,a);Kge(e,ffe);c=(++vfe,new Lge(2));c.$l(Bfe(f,Kfe('L',true)));c.$l(b);c=(++vfe,new lge(3,c));c=(++vfe,new rge(e,c));gfe=c;return gfe} +function S3c(a){var b,c;b=GD(hkd(a,(Y9c(),o8c)));if(T3c(b,a)){return}if(!ikd(a,F9c)&&((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a).i!=0||Ccb(DD(hkd(a,M8c))))){if(b==null||ufb(b).length==0){if(!T3c(sne,a)){c=Qfb(Qfb(new Wfb('Unable to load default layout algorithm '),sne),' for unconfigured node ');yfd(a,c);throw vbb(new y2c(c.a))}}else{c=Qfb(Qfb(new Wfb("Layout algorithm '"),b),"' not found for ");yfd(a,c);throw vbb(new y2c(c.a))}}} +function hIb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;c=a.i;b=a.n;if(a.b==0){n=c.c+b.b;m=c.b-b.b-b.c;for(g=a.a,i=0,k=g.length;i0){l-=d[0]+a.c;d[0]+=a.c}d[2]>0&&(l-=d[2]+a.c);d[1]=$wnd.Math.max(d[1],l);mHb(a.a[1],c.c+b.b+d[0]-(d[1]-l)/2,d[1])}for(f=a.a,h=0,j=f.length;h0?(a.n.c.length-1)*a.i:0;for(d=new olb(a.n);d.a1){for(d=Jsb(e,0);d.b!=d.d.c;){c=BD(Xsb(d),231);f=0;for(i=new olb(c.e);i.a0){b[0]+=a.c;l-=b[0]}b[2]>0&&(l-=b[2]+a.c);b[1]=$wnd.Math.max(b[1],l);nHb(a.a[1],d.d+c.d+b[0]-(b[1]-l)/2,b[1])}else{o=d.d+c.d;n=d.a-c.d-c.a;for(g=a.a,i=0,k=g.length;i=0&&f!=c){throw vbb(new Wdb(kue))}}e=0;for(i=0;i0||Jy(e.b.d,a.b.d+a.b.a)==0&&d.b<0||Jy(e.b.d+e.b.a,a.b.d)==0&&d.b>0){h=0;break}}else{h=$wnd.Math.min(h,YNb(a,e,d))}h=$wnd.Math.min(h,ONb(a,f,h,d))}return h} +function ifd(a,b){var c,d,e,f,g,h,i;if(a.b<2){throw vbb(new Wdb('The vector chain must contain at least a source and a target point.'))}e=(sCb(a.b!=0),BD(a.a.a.c,8));nmd(b,e.a,e.b);i=new Oyd((!b.a&&(b.a=new xMd(y2,b,5)),b.a));g=Jsb(a,1);while(g.aEdb(REc(g.g,g.d[0]).a)){sCb(i.b>0);i.a.Xb(i.c=--i.b);Aib(i,g);e=true}else if(!!h.e&&h.e.gc()>0){f=(!h.e&&(h.e=new Rkb),h.e).Mc(b);j=(!h.e&&(h.e=new Rkb),h.e).Mc(c);if(f||j){(!h.e&&(h.e=new Rkb),h.e).Fc(g);++g.c}}}e||(d.c[d.c.length]=g,true)} +function odc(a){var b,c,d;if(fcd(BD(vNb(a,(Nyc(),Vxc)),98))){for(c=new olb(a.j);c.a>>0,'0'+b.toString(16));d='\\x'+qfb(c,c.length-2,c.length)}else if(a>=Tje){c=(b=a>>>0,'0'+b.toString(16));d='\\v'+qfb(c,c.length-6,c.length)}else d=''+String.fromCharCode(a&aje);}return d} +function yhb(a,b){var c,d,e,f,g,h,i,j,k,l;g=a.e;i=b.e;if(i==0){return a}if(g==0){return b.e==0?b:new Vgb(-b.e,b.d,b.a)}f=a.d;h=b.d;if(f+h==2){c=xbb(a.a[0],Yje);d=xbb(b.a[0],Yje);g<0&&(c=Jbb(c));i<0&&(d=Jbb(d));return ghb(Qbb(c,d))}e=f!=h?f>h?1:-1:whb(a.a,b.a,f);if(e==-1){l=-i;k=g==i?zhb(b.a,h,a.a,f):uhb(b.a,h,a.a,f)}else{l=g;if(g==i){if(e==0){return Hgb(),Ggb}k=zhb(a.a,f,b.a,h)}else{k=uhb(a.a,f,b.a,h)}}j=new Vgb(l,k.length,k);Jgb(j);return j} +function YPc(a){var b,c,d,e,f,g;this.e=new Rkb;this.a=new Rkb;for(c=a.b-1;c<3;c++){St(a,0,BD(Ut(a,0),8))}if(a.b<4){throw vbb(new Wdb('At (least dimension + 1) control points are necessary!'))}else{this.b=3;this.d=true;this.c=false;TPc(this,a.b+this.b-1);g=new Rkb;f=new olb(this.e);for(b=0;b=b.o&&c.f<=b.f||b.a*0.5<=c.f&&b.a*1.5>=c.f){g=BD(Ikb(b.n,b.n.c.length-1),211);if(g.e+g.d+c.g+e<=d&&(f=BD(Ikb(b.n,b.n.c.length-1),211),f.f-a.f+c.f<=a.b||a.a.c.length==1)){EZc(b,c);return true}else if(b.s+c.g<=d&&(b.t+b.d+c.f+e<=a.b||a.a.c.length==1)){Ekb(b.b,c);h=BD(Ikb(b.n,b.n.c.length-1),211);Ekb(b.n,new VZc(b.s,h.f+h.a+b.i,b.i));QZc(BD(Ikb(b.n,b.n.c.length-1),211),c);GZc(b,c);return true}}return false} +function Zxd(a,b,c){var d,e,f,g;if(a.ej()){e=null;f=a.fj();d=a.Zi(1,g=uud(a,b,c),c,b,f);if(a.bj()&&!(a.ni()&&g!=null?pb(g,c):PD(g)===PD(c))){g!=null&&(e=a.dj(g,e));e=a.cj(c,e);a.ij()&&(e=a.lj(g,c,e));if(!e){a.$i(d)}else{e.Ei(d);e.Fi()}}else{a.ij()&&(e=a.lj(g,c,e));if(!e){a.$i(d)}else{e.Ei(d);e.Fi()}}return g}else{g=uud(a,b,c);if(a.bj()&&!(a.ni()&&g!=null?pb(g,c):PD(g)===PD(c))){e=null;g!=null&&(e=a.dj(g,null));e=a.cj(c,e);!!e&&e.Fi()}return g}} +function YA(a,b){var c,d,e,f,g,h,i,j;b%=24;if(a.q.getHours()!=b){d=new $wnd.Date(a.q.getTime());d.setDate(d.getDate()+1);h=a.q.getTimezoneOffset()-d.getTimezoneOffset();if(h>0){i=h/60|0;j=h%60;e=a.q.getDate();c=a.q.getHours();c+i>=24&&++e;f=new $wnd.Date(a.q.getFullYear(),a.q.getMonth(),e,b+i,a.q.getMinutes()+j,a.q.getSeconds(),a.q.getMilliseconds());a.q.setTime(f.getTime())}}g=a.q.getTime();a.q.setTime(g+3600000);a.q.getHours()!=b&&a.q.setTime(g)} +function opc(a,b){var c,d,e,f,g;Odd(b,'Path-Like Graph Wrapping',1);if(a.b.c.length==0){Qdd(b);return}e=new Xoc(a);g=(e.i==null&&(e.i=Soc(e,new Zoc)),Edb(e.i)*e.f);c=g/(e.i==null&&(e.i=Soc(e,new Zoc)),Edb(e.i));if(e.b>c){Qdd(b);return}switch(BD(vNb(a,(Nyc(),Gyc)),337).g){case 2:f=new hpc;break;case 0:f=new Ync;break;default:f=new kpc;}d=f.Vf(a,e);if(!f.Wf()){switch(BD(vNb(a,Myc),338).g){case 2:d=tpc(e,d);break;case 1:d=rpc(e,d);}}npc(a,e,d);Qdd(b)} +function MFc(a,b){var c,d,e,f;Fub(a.d,a.e);a.c.a.$b();if(Edb(ED(vNb(b.j,(Nyc(),uwc))))!=0||Edb(ED(vNb(b.j,uwc)))!=0){c=dme;PD(vNb(b.j,ywc))!==PD((tAc(),rAc))&&yNb(b.j,(wtc(),Jsc),(Bcb(),true));f=BD(vNb(b.j,Ayc),19).a;for(e=0;ee&&++j;Ekb(g,(tCb(h+j,b.c.length),BD(b.c[h+j],19)));i+=(tCb(h+j,b.c.length),BD(b.c[h+j],19)).a-d;++c;while(c1&&(i>red(h)*qed(h)/2||g.b==0)){l=new wed(m);k=red(h)/qed(h);j=fed(l,b,new p0b,c,d,e,k);P6c(X6c(l.e),j);h=l;n.c[n.c.length]=l;i=0;m.c=KC(SI,Uhe,1,0,5,1)}}}Gkb(n,m);return n} +function y6d(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p;if(c.mh(b)){k=(n=b,!n?null:BD(d,49).xh(n));if(k){p=c.bh(b,a.a);o=b.t;if(o>1||o==-1){l=BD(p,69);m=BD(k,69);if(l.dc()){m.$b()}else{g=!!zUd(b);f=0;for(h=a.a?l.Kc():l.Zh();h.Ob();){j=BD(h.Pb(),56);e=BD(Wrb(a,j),56);if(!e){if(a.b&&!g){m.Xh(f,j);++f}}else{if(g){i=m.Xc(e);i==-1?m.Xh(f,e):f!=i&&m.ji(f,e)}else{m.Xh(f,e)}++f}}}}else{if(p==null){k.Wb(null)}else{e=Wrb(a,p);e==null?a.b&&!zUd(b)&&k.Wb(p):k.Wb(e)}}}}} +function E6b(a,b){var c,d,e,f,g,h,i,j;c=new L6b;for(e=new Sr(ur(R_b(b).a.Kc(),new Sq));Qr(e);){d=BD(Rr(e),17);if(OZb(d)){continue}h=d.c.i;if(F6b(h,C6b)){j=G6b(a,h,C6b,B6b);if(j==-1){continue}c.b=$wnd.Math.max(c.b,j);!c.a&&(c.a=new Rkb);Ekb(c.a,h)}}for(g=new Sr(ur(U_b(b).a.Kc(),new Sq));Qr(g);){f=BD(Rr(g),17);if(OZb(f)){continue}i=f.d.i;if(F6b(i,B6b)){j=G6b(a,i,B6b,C6b);if(j==-1){continue}c.d=$wnd.Math.max(c.d,j);!c.c&&(c.c=new Rkb);Ekb(c.c,i)}}return c} +function Khb(a){Dhb();var b,c,d,e;b=QD(a);if(a1000000){throw vbb(new ocb('power of ten too big'))}if(a<=Ohe){return Qgb(Pgb(Bhb[1],b),b)}d=Pgb(Bhb[1],Ohe);e=d;c=Cbb(a-Ohe);b=QD(a%Ohe);while(ybb(c,Ohe)>0){e=Ogb(e,d);c=Qbb(c,Ohe)}e=Ogb(e,Pgb(Bhb[1],b));e=Qgb(e,Ohe);c=Cbb(a-Ohe);while(ybb(c,Ohe)>0){e=Qgb(e,Ohe);c=Qbb(c,Ohe)}e=Qgb(e,b);return e} +function X5b(a,b){var c,d,e,f,g,h,i,j,k;Odd(b,'Hierarchical port dummy size processing',1);i=new Rkb;k=new Rkb;d=Edb(ED(vNb(a,(Nyc(),myc))));c=d*2;for(f=new olb(a.b);f.aj&&d>j){k=h;j=Edb(b.p[h.p])+Edb(b.d[h.p])+h.o.b+h.d.a}else{e=false;c.n&&Sdd(c,'bk node placement breaks on '+h+' which should have been after '+k);break}}if(!e){break}}c.n&&Sdd(c,b+' is feasible: '+e);return e} +function XNc(a,b,c,d){var e,f,g,h,i,j,k;h=-1;for(k=new olb(a);k.a=q&&a.e[i.p]>o*a.b||t>=c*q){m.c[m.c.length]=h;h=new Rkb;ye(g,f);f.a.$b();j-=k;n=$wnd.Math.max(n,j*a.b+p);j+=t;s=t;t=0;k=0;p=0}}return new vgd(n,m)} +function q4c(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;for(c=(j=(new $ib(a.c.b)).a.vc().Kc(),new djb(j));c.a.Ob();){b=(h=BD(c.a.Pb(),42),BD(h.dd(),149));e=b.a;e==null&&(e='');d=i4c(a.c,e);!d&&e.length==0&&(d=u4c(a));!!d&&!ze(d.c,b,false)&&Dsb(d.c,b)}for(g=Jsb(a.a,0);g.b!=g.d.c;){f=BD(Xsb(g),478);k=j4c(a.c,f.a);n=j4c(a.c,f.b);!!k&&!!n&&Dsb(k.c,new vgd(n,f.c))}Osb(a.a);for(m=Jsb(a.b,0);m.b!=m.d.c;){l=BD(Xsb(m),478);b=g4c(a.c,l.a);i=j4c(a.c,l.b);!!b&&!!i&&B3c(b,i,l.c)}Osb(a.b)} +function qvd(a,b,c){var d,e,f,g,h,i,j,k,l,m,n;f=new fC(a);g=new ird;e=(ko(g.g),ko(g.j),Uhb(g.b),ko(g.d),ko(g.i),Uhb(g.k),Uhb(g.c),Uhb(g.e),n=drd(g,f,null),ard(g,f),n);if(b){j=new fC(b);h=rvd(j);jfd(e,OC(GC(g2,1),Uhe,527,0,[h]))}m=false;l=false;if(c){j=new fC(c);que in j.a&&(m=aC(j,que).ge().a);rue in j.a&&(l=aC(j,rue).ge().a)}k=Vdd(Xdd(new Zdd,m),l);t2c(new w2c,e,k);que in f.a&&cC(f,que,null);if(m||l){i=new eC;nvd(k,i,m,l);cC(f,que,i)}d=new Prd(g);Ghe(new _ud(e),d)} +function pA(a,b,c){var d,e,f,g,h,i,j,k,l;g=new nB;j=OC(GC(WD,1),oje,25,15,[0]);e=-1;f=0;d=0;for(i=0;i0){if(e<0&&k.a){e=i;f=j[0];d=0}if(e>=0){h=k.b;if(i==e){h-=d++;if(h==0){return 0}}if(!wA(b,j,k,h,g)){i=e-1;j[0]=f;continue}}else{e=-1;if(!wA(b,j,k,0,g)){return 0}}}else{e=-1;if(bfb(k.c,0)==32){l=j[0];uA(b,j);if(j[0]>l){continue}}else if(ofb(b,k.c,j[0])){j[0]+=k.c.length;continue}return 0}}if(!mB(g,c)){return 0}return j[0]} +function SKd(a){var b,c,d,e,f,g,h,i;if(!a.f){i=new CNd;h=new CNd;b=KKd;g=b.a.zc(a,b);if(g==null){for(f=new Fyd(_Kd(a));f.e!=f.i.gc();){e=BD(Dyd(f),26);ytd(i,SKd(e))}b.a.Bc(a)!=null;b.a.gc()==0&&undefined}for(d=(!a.s&&(a.s=new cUd(t5,a,21,17)),new Fyd(a.s));d.e!=d.i.gc();){c=BD(Dyd(d),170);JD(c,99)&&wtd(h,BD(c,18))}vud(h);a.r=new UNd(a,(BD(qud(ZKd((NFd(),MFd).o),6),18),h.i),h.g);ytd(i,a.r);vud(i);a.f=new nNd((BD(qud(ZKd(MFd.o),5),18),i.i),i.g);$Kd(a).b&=-3}return a.f} +function rMb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o;g=a.o;d=KC(WD,oje,25,g,15,1);e=KC(WD,oje,25,g,15,1);c=a.p;b=KC(WD,oje,25,c,15,1);f=KC(WD,oje,25,c,15,1);for(j=0;j=0&&!YMb(a,k,l)){--l}e[k]=l}for(n=0;n=0&&!YMb(a,h,o)){--h}f[o]=h}for(i=0;ib[m]&&md[i]&&aNb(a,i,m,false,true)}}} +function lRb(a){var b,c,d,e,f,g,h,i;c=Ccb(DD(vNb(a,(wSb(),cSb))));f=a.a.c.d;h=a.a.d.d;if(c){g=Y6c(c7c(new f7c(h.a,h.b),f),0.5);i=Y6c(R6c(a.e),0.5);b=c7c(P6c(new f7c(f.a,f.b),g),i);a7c(a.d,b)}else{e=Edb(ED(vNb(a.a,tSb)));d=a.d;if(f.a>=h.a){if(f.b>=h.b){d.a=h.a+(f.a-h.a)/2+e;d.b=h.b+(f.b-h.b)/2-e-a.e.b}else{d.a=h.a+(f.a-h.a)/2+e;d.b=f.b+(h.b-f.b)/2+e}}else{if(f.b>=h.b){d.a=f.a+(h.a-f.a)/2+e;d.b=h.b+(f.b-h.b)/2+e}else{d.a=f.a+(h.a-f.a)/2+e;d.b=f.b+(h.b-f.b)/2-e-a.e.b}}}} +function Qge(a,b){var c,d,e,f,g,h,i;if(a==null){return null}f=a.length;if(f==0){return ''}i=KC(TD,$ie,25,f,15,1);ACb(0,f,a.length);ACb(0,f,i.length);ffb(a,0,f,i,0);c=null;h=b;for(e=0,g=0;e0?qfb(c.a,0,f-1):''}}else{return !c?a:c.a}} +function DPb(a){r4c(a,new E3c(P3c(M3c(O3c(N3c(new R3c,Yle),'ELK DisCo'),'Layouter for arranging unconnected subgraphs. The subgraphs themselves are, by default, not laid out.'),new GPb)));p4c(a,Yle,Zle,Ksd(BPb));p4c(a,Yle,$le,Ksd(vPb));p4c(a,Yle,_le,Ksd(qPb));p4c(a,Yle,ame,Ksd(wPb));p4c(a,Yle,Zke,Ksd(zPb));p4c(a,Yle,$ke,Ksd(yPb));p4c(a,Yle,Yke,Ksd(APb));p4c(a,Yle,_ke,Ksd(xPb));p4c(a,Yle,Tle,Ksd(sPb));p4c(a,Yle,Ule,Ksd(rPb));p4c(a,Yle,Vle,Ksd(tPb));p4c(a,Yle,Wle,Ksd(uPb))} +function Zbc(a,b,c,d){var e,f,g,h,i,j,k,l,m;f=new b0b(a);__b(f,(j0b(),i0b));yNb(f,(Nyc(),Vxc),(dcd(),$bd));e=0;if(b){g=new H0b;yNb(g,(wtc(),$sc),b);yNb(f,$sc,b.i);G0b(g,(Ucd(),Tcd));F0b(g,f);m=k_b(b.e);for(j=m,k=0,l=j.length;k0){c-=d.length-b;if(c>=0){e.a+='0.';for(;c>egb.length;c-=egb.length){Rfb(e,egb)}Sfb(e,egb,QD(c));Qfb(e,d.substr(b))}else{c=b-c;Qfb(e,qfb(d,b,QD(c)));e.a+='.';Qfb(e,pfb(d,QD(c)))}}else{Qfb(e,d.substr(b));for(;c<-egb.length;c+=egb.length){Rfb(e,egb)}Sfb(e,egb,QD(-c))}return e.a} +function v6c(a,b,c,d){var e,f,g,h,i,j,k,l,m;i=c7c(new f7c(c.a,c.b),a);j=i.a*b.b-i.b*b.a;k=b.a*d.b-b.b*d.a;l=(i.a*d.b-i.b*d.a)/k;m=j/k;if(k==0){if(j==0){e=P6c(new f7c(c.a,c.b),Y6c(new f7c(d.a,d.b),0.5));f=S6c(a,e);g=S6c(P6c(new f7c(a.a,a.b),b),e);h=$wnd.Math.sqrt(d.a*d.a+d.b*d.b)*0.5;if(f=0&&l<=1&&m>=0&&m<=1?P6c(new f7c(a.a,a.b),Y6c(new f7c(b.a,b.b),l)):null}} +function OTb(a,b,c){var d,e,f,g,h;d=BD(vNb(a,(Nyc(),zwc)),21);c.a>b.a&&(d.Hc((i8c(),c8c))?(a.c.a+=(c.a-b.a)/2):d.Hc(e8c)&&(a.c.a+=c.a-b.a));c.b>b.b&&(d.Hc((i8c(),g8c))?(a.c.b+=(c.b-b.b)/2):d.Hc(f8c)&&(a.c.b+=c.b-b.b));if(BD(vNb(a,(wtc(),Ksc)),21).Hc((Orc(),Hrc))&&(c.a>b.a||c.b>b.b)){for(h=new olb(a.a);h.ab.a&&(d.Hc((i8c(),c8c))?(a.c.a+=(c.a-b.a)/2):d.Hc(e8c)&&(a.c.a+=c.a-b.a));c.b>b.b&&(d.Hc((i8c(),g8c))?(a.c.b+=(c.b-b.b)/2):d.Hc(f8c)&&(a.c.b+=c.b-b.b));if(BD(vNb(a,(wtc(),Ksc)),21).Hc((Orc(),Hrc))&&(c.a>b.a||c.b>b.b)){for(g=new olb(a.a);g.ab){e=0;f+=k.b+c;l.c[l.c.length]=k;k=new x$c(f,c);d=new PZc(0,k.f,k,c);s$c(k,d);e=0}if(d.b.c.length==0||i.f>=d.o&&i.f<=d.f||d.a*0.5<=i.f&&d.a*1.5>=i.f){EZc(d,i)}else{g=new PZc(d.s+d.r+c,k.f,k,c);s$c(k,g);EZc(g,i)}e=i.i+i.g}l.c[l.c.length]=k;return l} +function OKd(a){var b,c,d,e,f,g,h,i;if(!a.a){a.o=null;i=new GNd(a);b=new KNd;c=KKd;h=c.a.zc(a,c);if(h==null){for(g=new Fyd(_Kd(a));g.e!=g.i.gc();){f=BD(Dyd(g),26);ytd(i,OKd(f))}c.a.Bc(a)!=null;c.a.gc()==0&&undefined}for(e=(!a.s&&(a.s=new cUd(t5,a,21,17)),new Fyd(a.s));e.e!=e.i.gc();){d=BD(Dyd(e),170);JD(d,322)&&wtd(b,BD(d,34))}vud(b);a.k=new PNd(a,(BD(qud(ZKd((NFd(),MFd).o),7),18),b.i),b.g);ytd(i,a.k);vud(i);a.a=new nNd((BD(qud(ZKd(MFd.o),4),18),i.i),i.g);$Kd(a).b&=-2}return a.a} +function vZc(a,b,c,d,e,f,g){var h,i,j,k,l,m;l=false;i=ZZc(c.q,b.f+b.b-c.q.f);m=e-(c.q.e+i-g);if(m=(tCb(f,a.c.length),BD(a.c[f],200)).e;k=(h=MZc(d,m,false),h.a);if(k>b.b&&!j){return false}if(j||k<=b.b){if(j&&k>b.b){c.d=k;KZc(c,JZc(c,k))}else{$Zc(c.q,i);c.c=true}KZc(d,e-(c.s+c.r));OZc(d,c.q.e+c.q.d,b.f);s$c(b,d);if(a.c.length>f){v$c((tCb(f,a.c.length),BD(a.c[f],200)),d);(tCb(f,a.c.length),BD(a.c[f],200)).a.c.length==0&&Kkb(a,f)}l=true}return l} +function C2d(a,b,c,d){var e,f,g,h,i,j,k;k=S6d(a.e.Tg(),b);e=0;f=BD(a.g,119);i=null;Q6d();if(BD(b,66).Oj()){for(h=0;ha.o.a){k=(i-a.o.a)/2;h.b=$wnd.Math.max(h.b,k);h.c=$wnd.Math.max(h.c,k)}} +function rvd(a){var b,c,d,e,f,g,h,i;f=new b2c;Z1c(f,(Y1c(),V1c));for(d=(e=$B(a,KC(ZI,nie,2,0,6,1)),new vib(new amb((new mC(a,e)).b)));d.b0?a.i:0)>b&&i>0){f=0;g+=i+a.i;e=$wnd.Math.max(e,m);d+=i+a.i;i=0;m=0;if(c){++l;Ekb(a.n,new VZc(a.s,g,a.i))}h=0}m+=j.g+(h>0?a.i:0);i=$wnd.Math.max(i,j.f);c&&QZc(BD(Ikb(a.n,l),211),j);f+=j.g+(h>0?a.i:0);++h}e=$wnd.Math.max(e,m);d+=i;if(c){a.r=e;a.d=d;u$c(a.j)}return new J6c(a.s,a.t,e,d)} +function $fb(a,b,c,d,e){Zfb();var f,g,h,i,j,k,l,m,n;vCb(a,'src');vCb(c,'dest');m=rb(a);i=rb(c);rCb((m.i&4)!=0,'srcType is not an array');rCb((i.i&4)!=0,'destType is not an array');l=m.c;g=i.c;rCb((l.i&1)!=0?l==g:(g.i&1)==0,"Array types don't match");n=a.length;j=c.length;if(b<0||d<0||e<0||b+e>n||d+e>j){throw vbb(new pcb)}if((l.i&1)==0&&m!=i){k=CD(a);f=CD(c);if(PD(a)===PD(c)&&bd;){NC(f,h,k[--b])}}else{for(h=d+e;d0&&$Bb(a,b,c,d,e,true)} +function phb(){phb=ccb;nhb=OC(GC(WD,1),oje,25,15,[Rie,1162261467,Iie,1220703125,362797056,1977326743,Iie,387420489,Jje,214358881,429981696,815730721,1475789056,170859375,268435456,410338673,612220032,893871739,1280000000,1801088541,113379904,148035889,191102976,244140625,308915776,387420489,481890304,594823321,729000000,887503681,Iie,1291467969,1544804416,1838265625,60466176]);ohb=OC(GC(WD,1),oje,25,15,[-1,-1,31,19,15,13,11,11,10,9,9,8,8,8,8,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5])} +function soc(a){var b,c,d,e,f,g,h,i;for(e=new olb(a.b);e.a=a.b.length){f[e++]=g.b[d++];f[e++]=g.b[d++]}else if(d>=g.b.length){f[e++]=a.b[c++];f[e++]=a.b[c++]}else if(g.b[d]0?a.i:0)}++b}Ce(a.n,i);a.d=c;a.r=d;a.g=0;a.f=0;a.e=0;a.o=Pje;a.p=Pje;for(f=new olb(a.b);f.a0){e=(!a.n&&(a.n=new cUd(D2,a,1,7)),BD(qud(a.n,0),137)).a;!e||Qfb(Qfb((b.a+=' "',b),e),'"')}}else{Qfb(Qfb((b.a+=' "',b),d),'"')}c=(!a.b&&(a.b=new y5d(z2,a,4,7)),!(a.b.i<=1&&(!a.c&&(a.c=new y5d(z2,a,5,8)),a.c.i<=1)));c?(b.a+=' [',b):(b.a+=' ',b);Qfb(b,Eb(new Gb,new Fyd(a.b)));c&&(b.a+=']',b);b.a+=gne;c&&(b.a+='[',b);Qfb(b,Eb(new Gb,new Fyd(a.c)));c&&(b.a+=']',b);return b.a} +function TQd(a,b){var c,d,e,f,g,h,i;if(a.a){h=a.a.ne();i=null;if(h!=null){b.a+=''+h}else{g=a.a.Dj();if(g!=null){f=hfb(g,wfb(91));if(f!=-1){i=g.substr(f);b.a+=''+qfb(g==null?Xhe:(uCb(g),g),0,f)}else{b.a+=''+g}}}if(!!a.d&&a.d.i!=0){e=true;b.a+='<';for(d=new Fyd(a.d);d.e!=d.i.gc();){c=BD(Dyd(d),87);e?(e=false):(b.a+=She,b);TQd(c,b)}b.a+='>'}i!=null&&(b.a+=''+i,b)}else if(a.e){h=a.e.zb;h!=null&&(b.a+=''+h,b)}else{b.a+='?';if(a.b){b.a+=' super ';TQd(a.b,b)}else{if(a.f){b.a+=' extends ';TQd(a.f,b)}}}} +function Z9b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D;v=a.c;w=b.c;c=Jkb(v.a,a,0);d=Jkb(w.a,b,0);t=BD(W_b(a,(KAc(),HAc)).Kc().Pb(),11);C=BD(W_b(a,IAc).Kc().Pb(),11);u=BD(W_b(b,HAc).Kc().Pb(),11);D=BD(W_b(b,IAc).Kc().Pb(),11);r=k_b(t.e);A=k_b(C.g);s=k_b(u.e);B=k_b(D.g);Z_b(a,d,w);for(g=s,k=0,o=g.length;kk){new DOc((HOc(),GOc),c,b,j-k)}else if(j>0&&k>0){new DOc((HOc(),GOc),b,c,0);new DOc(GOc,c,b,0)}}return g} +function TUb(a,b){var c,d,e,f,g,h;for(g=new nib((new eib(a.f.b)).a);g.b;){f=lib(g);e=BD(f.cd(),594);if(b==1){if(e.gf()!=(ead(),dad)&&e.gf()!=_9c){continue}}else{if(e.gf()!=(ead(),aad)&&e.gf()!=bad){continue}}d=BD(BD(f.dd(),46).b,81);h=BD(BD(f.dd(),46).a,189);c=h.c;switch(e.gf().g){case 2:d.g.c=a.e.a;d.g.b=$wnd.Math.max(1,d.g.b+c);break;case 1:d.g.c=d.g.c+c;d.g.b=$wnd.Math.max(1,d.g.b-c);break;case 4:d.g.d=a.e.b;d.g.a=$wnd.Math.max(1,d.g.a+c);break;case 3:d.g.d=d.g.d+c;d.g.a=$wnd.Math.max(1,d.g.a-c);}}} +function nJc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p;h=KC(WD,oje,25,b.b.c.length,15,1);j=KC(NQ,Kie,267,b.b.c.length,0,1);i=KC(OQ,kne,10,b.b.c.length,0,1);for(l=a.a,m=0,n=l.length;m0&&!!i[d]&&(o=jBc(a.b,i[d],e));p=$wnd.Math.max(p,e.c.c.b+o)}for(f=new olb(k.e);f.a1){throw vbb(new Wdb(Hwe))}if(!i){f=R6d(b,d.Kc().Pb());g.Fc(f)}}return xtd(a,I2d(a,b,c),g)} +function Pmc(a,b){var c,d,e,f;Jmc(b.b.j);MAb(NAb(new YAb(null,new Kub(b.d,16)),new $mc),new anc);for(f=new olb(b.d);f.aa.o.b){return false}c=V_b(a,zcd);h=b.d+b.a+(c.gc()-1)*g;if(h>a.o.b){return false}}return true} +function thb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;g=a.e;i=b.e;if(g==0){return b}if(i==0){return a}f=a.d;h=b.d;if(f+h==2){c=xbb(a.a[0],Yje);d=xbb(b.a[0],Yje);if(g==i){k=wbb(c,d);o=Tbb(k);n=Tbb(Pbb(k,32));return n==0?new Ugb(g,o):new Vgb(g,2,OC(GC(WD,1),oje,25,15,[o,n]))}return ghb(g<0?Qbb(d,c):Qbb(c,d))}else if(g==i){m=g;l=f>=h?uhb(a.a,f,b.a,h):uhb(b.a,h,a.a,f)}else{e=f!=h?f>h?1:-1:whb(a.a,b.a,f);if(e==0){return Hgb(),Ggb}if(e==1){m=g;l=zhb(a.a,f,b.a,h)}else{m=i;l=zhb(b.a,h,a.a,f)}}j=new Vgb(m,l.length,l);Jgb(j);return j} +function oZb(a,b,c,d,e,f,g){var h,i,j,k,l,m,n;l=Ccb(DD(vNb(b,(Nyc(),vxc))));m=null;f==(KAc(),HAc)&&d.c.i==c?(m=d.c):f==IAc&&d.d.i==c&&(m=d.d);j=g;if(!j||!l||!!m){k=(Ucd(),Scd);m?(k=m.j):fcd(BD(vNb(c,Vxc),98))&&(k=f==HAc?Tcd:zcd);i=lZb(a,b,c,f,k,d);h=kZb((Q_b(c),d));if(f==HAc){QZb(h,BD(Ikb(i.j,0),11));RZb(h,e)}else{QZb(h,e);RZb(h,BD(Ikb(i.j,0),11))}j=new yZb(d,h,i,BD(vNb(i,(wtc(),$sc)),11),f,!m)}else{Ekb(j.e,d);n=$wnd.Math.max(Edb(ED(vNb(j.d,Zwc))),Edb(ED(vNb(d,Zwc))));yNb(j.d,Zwc,n)}Rc(a.a,d,new BZb(j.d,b,f));return j} +function V1d(a,b){var c,d,e,f,g,h,i,j,k,l;k=null;!!a.d&&(k=BD(Phb(a.d,b),138));if(!k){f=a.a.Mh();l=f.i;if(!a.d||Vhb(a.d)!=l){i=new Lqb;!!a.d&&Ld(i,a.d);j=i.f.c+i.g.c;for(h=j;h0){n=(o-1)*c;!!h&&(n+=d);!!k&&(n+=d);n=a.b[e+1]){e+=2}else if(c0){d=new Tkb(BD(Qc(a.a,f),21));mmb();Okb(d,new EZb(b));e=new Bib(f.b,0);while(e.bv)){i=2;g=Ohe}else if(i==0){i=1;g=A}else{i=0;g=A}}else{n=A>=g||g-A0?1:Ny(isNaN(d),isNaN(0)))>=0^(null,My(Jqe),($wnd.Math.abs(h)<=Jqe||h==0||isNaN(h)&&isNaN(0)?0:h<0?-1:h>0?1:Ny(isNaN(h),isNaN(0)))>=0)){return $wnd.Math.max(h,d)}My(Jqe);if(($wnd.Math.abs(d)<=Jqe||d==0||isNaN(d)&&isNaN(0)?0:d<0?-1:d>0?1:Ny(isNaN(d),isNaN(0)))>0){return $wnd.Math.sqrt(h*h+d*d)}return -$wnd.Math.sqrt(h*h+d*d)} +function Kge(a,b){var c,d,e,f,g,h;if(!b)return;!a.a&&(a.a=new Wvb);if(a.e==2){Tvb(a.a,b);return}if(b.e==1){for(e=0;e=Tje?Efb(c,Tee(d)):Afb(c,d&aje);g=(++vfe,new Hge(10,null,0));Vvb(a.a,g,h-1)}else{c=(g.bm().length+f,new Ifb);Efb(c,g.bm())}if(b.e==0){d=b._l();d>=Tje?Efb(c,Tee(d)):Afb(c,d&aje)}else{Efb(c,b.bm())}BD(g,521).b=c.a} +function rgb(a){var b,c,d,e,f;if(a.g!=null){return a.g}if(a.a<32){a.g=rhb(Cbb(a.f),QD(a.e));return a.g}e=shb((!a.c&&(a.c=fhb(a.f)),a.c),0);if(a.e==0){return e}b=(!a.c&&(a.c=fhb(a.f)),a.c).e<0?2:1;c=e.length;d=-a.e+c-b;f=new Ufb;f.a+=''+e;if(a.e>0&&d>=-6){if(d>=0){Tfb(f,c-QD(a.e),String.fromCharCode(46))}else{f.a=qfb(f.a,0,b-1)+'0.'+pfb(f.a,b-1);Tfb(f,b+1,zfb(egb,0,-QD(d)-1))}}else{if(c-b>=1){Tfb(f,b,String.fromCharCode(46));++c}Tfb(f,c,String.fromCharCode(69));d>0&&Tfb(f,++c,String.fromCharCode(43));Tfb(f,++c,''+Ubb(Cbb(d)))}a.g=f.a;return a.g} +function npc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q;if(c.dc()){return}h=0;m=0;d=c.Kc();o=BD(d.Pb(),19).a;while(h1&&(i=j.mg(i,a.a,h))}if(i.c.length==1){return BD(Ikb(i,i.c.length-1),220)}if(i.c.length==2){return lYc((tCb(0,i.c.length),BD(i.c[0],220)),(tCb(1,i.c.length),BD(i.c[1],220)),g,f)}return null} +function JNb(a){var b,c,d,e,f,g;Hkb(a.a,new PNb);for(c=new olb(a.a);c.a=$wnd.Math.abs(d.b)){d.b=0;f.d+f.a>g.d&&f.dg.c&&f.c0){b=new _zd(a.i,a.g);c=a.i;f=c<100?null:new Ixd(c);if(a.ij()){for(d=0;d0){h=a.g;j=a.i;oud(a);f=j<100?null:new Ixd(j);for(d=0;d>13|(a.m&15)<<9;e=a.m>>4&8191;f=a.m>>17|(a.h&255)<<5;g=(a.h&1048320)>>8;h=b.l&8191;i=b.l>>13|(b.m&15)<<9;j=b.m>>4&8191;k=b.m>>17|(b.h&255)<<5;l=(b.h&1048320)>>8;B=c*h;C=d*h;D=e*h;F=f*h;G=g*h;if(i!=0){C+=c*i;D+=d*i;F+=e*i;G+=f*i}if(j!=0){D+=c*j;F+=d*j;G+=e*j}if(k!=0){F+=c*k;G+=d*k}l!=0&&(G+=c*l);n=B&Eje;o=(C&511)<<13;m=n+o;q=B>>22;r=C>>9;s=(D&262143)<<4;t=(F&31)<<17;p=q+r+s+t;v=D>>18;w=F>>5;A=(G&4095)<<8;u=v+w+A;p+=m>>22;m&=Eje;u+=p>>22;p&=Eje;u&=Fje;return TC(m,p,u)} +function o7b(a){var b,c,d,e,f,g,h;h=BD(Ikb(a.j,0),11);if(h.g.c.length!=0&&h.e.c.length!=0){throw vbb(new Zdb('Interactive layout does not support NORTH/SOUTH ports with incoming _and_ outgoing edges.'))}if(h.g.c.length!=0){f=Pje;for(c=new olb(h.g);c.a4){if(a.wj(b)){if(a.rk()){e=BD(b,49);d=e.Ug();i=d==a.e&&(a.Dk()?e.Og(e.Vg(),a.zk())==a.Ak():-1-e.Vg()==a.aj());if(a.Ek()&&!i&&!d&&!!e.Zg()){for(f=0;f0&&(j=a.n.a/f);break;case 2:case 4:e=a.i.o.b;e>0&&(j=a.n.b/e);}yNb(a,(wtc(),htc),j)}i=a.o;g=a.a;if(d){g.a=d.a;g.b=d.b;a.d=true}else if(b!=bcd&&b!=ccd&&h!=Scd){switch(h.g){case 1:g.a=i.a/2;break;case 2:g.a=i.a;g.b=i.b/2;break;case 3:g.a=i.a/2;g.b=i.b;break;case 4:g.b=i.b/2;}}else{g.a=i.a/2;g.b=i.b/2}} +function vwd(a){var b,c,d,e,f,g,h,i,j,k;if(a.ej()){k=a.Vi();i=a.fj();if(k>0){b=new Aud(a.Gi());c=k;f=c<100?null:new Ixd(c);Cvd(a,c,b.g);e=c==1?a.Zi(4,qud(b,0),null,0,i):a.Zi(6,b,null,-1,i);if(a.bj()){for(d=new Fyd(b);d.e!=d.i.gc();){f=a.dj(Dyd(d),f)}if(!f){a.$i(e)}else{f.Ei(e);f.Fi()}}else{if(!f){a.$i(e)}else{f.Ei(e);f.Fi()}}}else{Cvd(a,a.Vi(),a.Wi());a.$i(a.Zi(6,(mmb(),jmb),null,-1,i))}}else if(a.bj()){k=a.Vi();if(k>0){h=a.Wi();j=k;Cvd(a,k,h);f=j<100?null:new Ixd(j);for(d=0;da.d[g.p]){c+=zHc(a.b,f)*BD(i.b,19).a;Wjb(a.a,meb(f))}}while(!akb(a.a)){xHc(a.b,BD(fkb(a.a),19).a)}}return c} +function eed(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q;l=new g7c(BD(hkd(a,(X7c(),R7c)),8));l.a=$wnd.Math.max(l.a-c.b-c.c,0);l.b=$wnd.Math.max(l.b-c.d-c.a,0);e=ED(hkd(a,L7c));(e==null||(uCb(e),e)<=0)&&(e=1.3);h=new Rkb;for(o=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));o.e!=o.i.gc();){n=BD(Dyd(o),33);g=new xed(n);h.c[h.c.length]=g}m=BD(hkd(a,M7c),311);switch(m.g){case 3:q=bed(h,b,l.a,l.b,(j=d,uCb(e),e,j));break;case 1:q=aed(h,b,l.a,l.b,(k=d,uCb(e),e,k));break;default:q=ced(h,b,l.a,l.b,(i=d,uCb(e),e,i));}f=new wed(q);p=fed(f,b,c,l.a,l.b,d,(uCb(e),e));Afd(a,p.a,p.b,false,true)} +function vkc(a,b){var c,d,e,f;c=b.b;f=new Tkb(c.j);e=0;d=c.j;d.c=KC(SI,Uhe,1,0,5,1);hkc(BD(Si(a.b,(Ucd(),Acd),(Fkc(),Ekc)),15),c);e=ikc(f,e,new blc,d);hkc(BD(Si(a.b,Acd,Dkc),15),c);e=ikc(f,e,new dlc,d);hkc(BD(Si(a.b,Acd,Ckc),15),c);hkc(BD(Si(a.b,zcd,Ekc),15),c);hkc(BD(Si(a.b,zcd,Dkc),15),c);e=ikc(f,e,new flc,d);hkc(BD(Si(a.b,zcd,Ckc),15),c);hkc(BD(Si(a.b,Rcd,Ekc),15),c);e=ikc(f,e,new hlc,d);hkc(BD(Si(a.b,Rcd,Dkc),15),c);e=ikc(f,e,new jlc,d);hkc(BD(Si(a.b,Rcd,Ckc),15),c);hkc(BD(Si(a.b,Tcd,Ekc),15),c);e=ikc(f,e,new Pkc,d);hkc(BD(Si(a.b,Tcd,Dkc),15),c);hkc(BD(Si(a.b,Tcd,Ckc),15),c)} +function nbc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p;Odd(b,'Layer size calculation',1);k=Pje;j=Qje;e=false;for(h=new olb(a.b);h.a0.5?(r-=g*2*(o-0.5)):o<0.5&&(r+=f*2*(0.5-o));e=h.d.b;rq.a-p-k&&(r=q.a-p-k);h.n.a=b+r}} +function ced(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q;h=KC(UD,Vje,25,a.c.length,15,1);m=new gub(new Ned);_tb(m,a);j=0;p=new Rkb;while(m.b.c.length!=0){g=BD(m.b.c.length==0?null:Ikb(m.b,0),157);if(j>1&&red(g)*qed(g)/2>h[0]){f=0;while(fh[f]){++f}o=new Jib(p,0,f+1);l=new wed(o);k=red(g)/qed(g);i=fed(l,b,new p0b,c,d,e,k);P6c(X6c(l.e),i);zCb(cub(m,l));n=new Jib(p,f+1,p.c.length);_tb(m,n);p.c=KC(SI,Uhe,1,0,5,1);j=0;Dlb(h,h.length,0)}else{q=m.b.c.length==0?null:Ikb(m.b,0);q!=null&&fub(m,0);j>0&&(h[j]=h[j-1]);h[j]+=red(g)*qed(g);++j;p.c[p.c.length]=g}}return p} +function Wac(a){var b,c,d,e,f;d=BD(vNb(a,(Nyc(),mxc)),163);if(d==(Ctc(),ytc)){for(c=new Sr(ur(R_b(a).a.Kc(),new Sq));Qr(c);){b=BD(Rr(c),17);if(!Yac(b)){throw vbb(new y2c(Fne+P_b(a)+"' has its layer constraint set to FIRST_SEPARATE, but has at least one incoming edge. "+'FIRST_SEPARATE nodes must not have incoming edges.'))}}}else if(d==Atc){for(f=new Sr(ur(U_b(a).a.Kc(),new Sq));Qr(f);){e=BD(Rr(f),17);if(!Yac(e)){throw vbb(new y2c(Fne+P_b(a)+"' has its layer constraint set to LAST_SEPARATE, but has at least one outgoing edge. "+'LAST_SEPARATE nodes must not have outgoing edges.'))}}}} +function C9b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;Odd(b,'Label dummy removal',1);d=Edb(ED(vNb(a,(Nyc(),nyc))));e=Edb(ED(vNb(a,ryc)));j=BD(vNb(a,Lwc),103);for(i=new olb(a.b);i.a0&&iCc(a,h,l)}for(e=new olb(l);e.a>19!=0){b=hD(b);i=!i}g=_C(b);f=false;e=false;d=false;if(a.h==Gje&&a.m==0&&a.l==0){e=true;f=true;if(g==-1){a=SC((wD(),sD));d=true;i=!i}else{h=lD(a,g);i&&ZC(h);c&&(QC=TC(0,0,0));return h}}else if(a.h>>19!=0){f=true;a=hD(a);d=true;i=!i}if(g!=-1){return WC(a,g,i,f,c)}if(eD(a,b)<0){c&&(f?(QC=hD(a)):(QC=TC(a.l,a.m,a.h)));return TC(0,0,0)}return XC(d?a:TC(a.l,a.m,a.h),b,i,f,e,c)} +function F2c(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;if(a.e&&a.c.cb.f||b.g>a.f){return}c=0;d=0;for(g=a.w.a.ec().Kc();g.Ob();){e=BD(g.Pb(),11);aRc(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])).b,b.g,b.f)&&++c}for(h=a.r.a.ec().Kc();h.Ob();){e=BD(h.Pb(),11);aRc(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])).b,b.g,b.f)&&--c}for(i=b.w.a.ec().Kc();i.Ob();){e=BD(i.Pb(),11);aRc(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])).b,a.g,a.f)&&++d}for(f=b.r.a.ec().Kc();f.Ob();){e=BD(f.Pb(),11);aRc(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])).b,a.g,a.f)&&--d}if(c=0){f=wid(b,c.substr(1,h-1));l=c.substr(h+1,j-(h+1));return pid(b,l,f)}}else{d=-1;Vcb==null&&(Vcb=new RegExp('\\d'));if(Vcb.test(String.fromCharCode(i))){d=lfb(c,wfb(46),j-1);if(d>=0){e=BD(hid(b,Bid(b,c.substr(1,d-1)),false),58);k=0;try{k=Icb(c.substr(d+1),Rie,Ohe)}catch(a){a=ubb(a);if(JD(a,127)){g=a;throw vbb(new rFd(g))}else throw vbb(a)}if(k=0){return c}switch($1d(q1d(a,c))){case 2:{if(dfb('',o1d(a,c.Hj()).ne())){i=b2d(q1d(a,c));h=a2d(q1d(a,c));k=r1d(a,b,i,h);if(k){return k}e=f1d(a,b);for(g=0,l=e.gc();g1){throw vbb(new Wdb(Hwe))}k=S6d(a.e.Tg(),b);d=BD(a.g,119);for(g=0;g1;for(j=new b1b(m.b);llb(j.a)||llb(j.b);){i=BD(llb(j.a)?mlb(j.a):mlb(j.b),17);l=i.c==m?i.d:i.c;$wnd.Math.abs(l7c(OC(GC(m1,1),nie,8,0,[l.i.n,l.n,l.a])).b-g.b)>1&&GNc(a,i,g,f,m)}}} +function XPc(a){var b,c,d,e,f,g;e=new Bib(a.e,0);d=new Bib(a.a,0);if(a.d){for(c=0;cOqe){f=b;g=0;while($wnd.Math.abs(b-f)0);e.a.Xb(e.c=--e.b);WPc(a,a.b-g,f,d,e);sCb(e.b0);d.a.Xb(d.c=--d.b)}if(!a.d){for(c=0;c0){a.f[k.p]=n/(k.e.c.length+k.g.c.length);a.c=$wnd.Math.min(a.c,a.f[k.p]);a.b=$wnd.Math.max(a.b,a.f[k.p])}else h&&(a.f[k.p]=n)}} +function $9d(a){a.b=null;a.bb=null;a.fb=null;a.qb=null;a.a=null;a.c=null;a.d=null;a.e=null;a.f=null;a.n=null;a.M=null;a.L=null;a.Q=null;a.R=null;a.K=null;a.db=null;a.eb=null;a.g=null;a.i=null;a.j=null;a.k=null;a.gb=null;a.o=null;a.p=null;a.q=null;a.r=null;a.$=null;a.ib=null;a.S=null;a.T=null;a.t=null;a.s=null;a.u=null;a.v=null;a.w=null;a.B=null;a.A=null;a.C=null;a.D=null;a.F=null;a.G=null;a.H=null;a.I=null;a.J=null;a.P=null;a.Z=null;a.U=null;a.V=null;a.W=null;a.X=null;a.Y=null;a._=null;a.ab=null;a.cb=null;a.hb=null;a.nb=null;a.lb=null;a.mb=null;a.ob=null;a.pb=null;a.jb=null;a.kb=null;a.N=false;a.O=false} +function l5b(a,b,c){var d,e,f,g;Odd(c,'Graph transformation ('+a.a+')',1);g=Mu(b.a);for(f=new olb(b.b);f.a0){a.a=i+(n-1)*f;b.c.b+=a.a;b.f.b+=a.a}}if(o.a.gc()!=0){m=new tPc(1,f);n=sPc(m,b,o,p,b.f.b+i-b.c.b);n>0&&(b.f.b+=i+(n-1)*f)}} +function kKd(a,b){var c,d,e,f;f=a.F;if(b==null){a.F=null;$Jd(a,null)}else{a.F=(uCb(b),b);d=hfb(b,wfb(60));if(d!=-1){e=b.substr(0,d);hfb(b,wfb(46))==-1&&!dfb(e,Khe)&&!dfb(e,Eve)&&!dfb(e,Fve)&&!dfb(e,Gve)&&!dfb(e,Hve)&&!dfb(e,Ive)&&!dfb(e,Jve)&&!dfb(e,Kve)&&(e=Lve);c=kfb(b,wfb(62));c!=-1&&(e+=''+b.substr(c+1));$Jd(a,e)}else{e=b;if(hfb(b,wfb(46))==-1){d=hfb(b,wfb(91));d!=-1&&(e=b.substr(0,d));if(!dfb(e,Khe)&&!dfb(e,Eve)&&!dfb(e,Fve)&&!dfb(e,Gve)&&!dfb(e,Hve)&&!dfb(e,Ive)&&!dfb(e,Jve)&&!dfb(e,Kve)){e=Lve;d!=-1&&(e+=''+b.substr(d))}else{e=b}}$Jd(a,e);e==b&&(a.F=a.D)}}(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,5,f,b))} +function AMc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;p=b.b.c.length;if(p<3){return}n=KC(WD,oje,25,p,15,1);l=0;for(k=new olb(b.b);k.ag)&&Qqb(a.b,BD(q.b,17))}}++h}f=g}}}} +function o5c(b,c){var d;if(c==null||dfb(c,Xhe)){return null}if(c.length==0&&b.k!=(_5c(),W5c)){return null}switch(b.k.g){case 1:return efb(c,kse)?(Bcb(),Acb):efb(c,lse)?(Bcb(),zcb):null;case 2:try{return meb(Icb(c,Rie,Ohe))}catch(a){a=ubb(a);if(JD(a,127)){return null}else throw vbb(a)}case 4:try{return Hcb(c)}catch(a){a=ubb(a);if(JD(a,127)){return null}else throw vbb(a)}case 3:return c;case 5:j5c(b);return m5c(b,c);case 6:j5c(b);return n5c(b,b.a,c);case 7:try{d=l5c(b);d.Jf(c);return d}catch(a){a=ubb(a);if(JD(a,32)){return null}else throw vbb(a)}default:throw vbb(new Zdb('Invalid type set for this layout option.'));}} +function JWb(a){AWb();var b,c,d,e,f,g,h;h=new CWb;for(c=new olb(a);c.a=h.b.c)&&(h.b=b);if(!h.c||b.c<=h.c.c){h.d=h.c;h.c=b}(!h.e||b.d>=h.e.d)&&(h.e=b);(!h.f||b.d<=h.f.d)&&(h.f=b)}d=new NWb((lWb(),hWb));rXb(a,yWb,new amb(OC(GC(bQ,1),Uhe,369,0,[d])));g=new NWb(kWb);rXb(a,xWb,new amb(OC(GC(bQ,1),Uhe,369,0,[g])));e=new NWb(iWb);rXb(a,wWb,new amb(OC(GC(bQ,1),Uhe,369,0,[e])));f=new NWb(jWb);rXb(a,vWb,new amb(OC(GC(bQ,1),Uhe,369,0,[f])));DWb(d.c,hWb);DWb(e.c,iWb);DWb(f.c,jWb);DWb(g.c,kWb);h.a.c=KC(SI,Uhe,1,0,5,1);Gkb(h.a,d.c);Gkb(h.a,Su(e.c));Gkb(h.a,f.c);Gkb(h.a,Su(g.c));return h} +function jxd(a){var b;switch(a.d){case 1:{if(a.hj()){return a.o!=-2}break}case 2:{if(a.hj()){return a.o==-2}break}case 3:case 5:case 4:case 6:case 7:{return a.o>-2}default:{return false}}b=a.gj();switch(a.p){case 0:return b!=null&&Ccb(DD(b))!=Kbb(a.k,0);case 1:return b!=null&&BD(b,217).a!=Tbb(a.k)<<24>>24;case 2:return b!=null&&BD(b,172).a!=(Tbb(a.k)&aje);case 6:return b!=null&&Kbb(BD(b,162).a,a.k);case 5:return b!=null&&BD(b,19).a!=Tbb(a.k);case 7:return b!=null&&BD(b,184).a!=Tbb(a.k)<<16>>16;case 3:return b!=null&&Edb(ED(b))!=a.j;case 4:return b!=null&&BD(b,155).a!=a.j;default:return b==null?a.n!=null:!pb(b,a.n);}} +function nOd(a,b,c){var d,e,f,g;if(a.Fk()&&a.Ek()){g=oOd(a,BD(c,56));if(PD(g)!==PD(c)){a.Oi(b);a.Ui(b,pOd(a,b,g));if(a.rk()){f=(e=BD(c,49),a.Dk()?a.Bk()?e.ih(a.b,zUd(BD(XKd(wjd(a.b),a.aj()),18)).n,BD(XKd(wjd(a.b),a.aj()).Yj(),26).Bj(),null):e.ih(a.b,bLd(e.Tg(),zUd(BD(XKd(wjd(a.b),a.aj()),18))),null,null):e.ih(a.b,-1-a.aj(),null,null));!BD(g,49).eh()&&(f=(d=BD(g,49),a.Dk()?a.Bk()?d.gh(a.b,zUd(BD(XKd(wjd(a.b),a.aj()),18)).n,BD(XKd(wjd(a.b),a.aj()).Yj(),26).Bj(),f):d.gh(a.b,bLd(d.Tg(),zUd(BD(XKd(wjd(a.b),a.aj()),18))),null,f):d.gh(a.b,-1-a.aj(),null,f)));!!f&&f.Fi()}oid(a.b)&&a.$i(a.Zi(9,c,g,b,false));return g}}return c} +function Noc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;k=Edb(ED(vNb(a,(Nyc(),oyc))));d=Edb(ED(vNb(a,Cyc)));m=new _fd;yNb(m,oyc,k+d);j=b;r=j.d;p=j.c.i;s=j.d.i;q=G1b(p.c);t=G1b(s.c);e=new Rkb;for(l=q;l<=t;l++){h=new b0b(a);__b(h,(j0b(),g0b));yNb(h,(wtc(),$sc),j);yNb(h,Vxc,(dcd(),$bd));yNb(h,qyc,m);n=BD(Ikb(a.b,l),29);l==q?Z_b(h,n.a.c.length-c,n):$_b(h,n);u=Edb(ED(vNb(j,Zwc)));if(u<0){u=0;yNb(j,Zwc,u)}h.o.b=u;o=$wnd.Math.floor(u/2);g=new H0b;G0b(g,(Ucd(),Tcd));F0b(g,h);g.n.b=o;i=new H0b;G0b(i,zcd);F0b(i,h);i.n.b=o;RZb(j,g);f=new UZb;tNb(f,j);yNb(f,jxc,null);QZb(f,i);RZb(f,r);Ooc(h,j,f);e.c[e.c.length]=f;j=f}return e} +function sbc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;i=BD(Y_b(a,(Ucd(),Tcd)).Kc().Pb(),11).e;n=BD(Y_b(a,zcd).Kc().Pb(),11).g;h=i.c.length;t=A0b(BD(Ikb(a.j,0),11));while(h-->0){p=(tCb(0,i.c.length),BD(i.c[0],17));e=(tCb(0,n.c.length),BD(n.c[0],17));s=e.d.e;f=Jkb(s,e,0);SZb(p,e.d,f);QZb(e,null);RZb(e,null);o=p.a;b&&Dsb(o,new g7c(t));for(d=Jsb(e.a,0);d.b!=d.d.c;){c=BD(Xsb(d),8);Dsb(o,new g7c(c))}r=p.b;for(m=new olb(e.b);m.a0&&(g=$wnd.Math.max(g,IJb(a.C.b+d.d.b,e)))}else{n=m+k.d.c+a.w+d.d.b;g=$wnd.Math.max(g,(Iy(),My(ple),$wnd.Math.abs(l-e)<=ple||l==e||isNaN(l)&&isNaN(e)?0:n/(e-l)))}k=d;l=e;m=f}if(!!a.C&&a.C.c>0){n=m+a.C.c;j&&(n+=k.d.c);g=$wnd.Math.max(g,(Iy(),My(ple),$wnd.Math.abs(l-1)<=ple||l==1||isNaN(l)&&isNaN(1)?0:n/(1-l)))}c.n.b=0;c.a.a=g} +function NKb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n;c=BD(Mpb(a.b,b),124);i=BD(BD(Qc(a.r,b),21),84);if(i.dc()){c.n.d=0;c.n.a=0;return}j=a.u.Hc((rcd(),ncd));g=0;a.A.Hc((tdd(),sdd))&&SKb(a,b);h=i.Kc();k=null;m=0;l=0;while(h.Ob()){d=BD(h.Pb(),111);f=Edb(ED(d.b.We((CKb(),BKb))));e=d.b.rf().b;if(!k){!!a.C&&a.C.d>0&&(g=$wnd.Math.max(g,IJb(a.C.d+d.d.d,f)))}else{n=l+k.d.a+a.w+d.d.d;g=$wnd.Math.max(g,(Iy(),My(ple),$wnd.Math.abs(m-f)<=ple||m==f||isNaN(m)&&isNaN(f)?0:n/(f-m)))}k=d;m=f;l=e}if(!!a.C&&a.C.a>0){n=l+a.C.a;j&&(n+=k.d.a);g=$wnd.Math.max(g,(Iy(),My(ple),$wnd.Math.abs(m-1)<=ple||m==1||isNaN(m)&&isNaN(1)?0:n/(1-m)))}c.n.d=0;c.a.b=g} +function _Ec(a,b,c){var d,e,f,g,h,i;this.g=a;h=b.d.length;i=c.d.length;this.d=KC(OQ,kne,10,h+i,0,1);for(g=0;g0?ZEc(this,this.f/this.a):REc(b.g,b.d[0]).a!=null&&REc(c.g,c.d[0]).a!=null?ZEc(this,(Edb(REc(b.g,b.d[0]).a)+Edb(REc(c.g,c.d[0]).a))/2):REc(b.g,b.d[0]).a!=null?ZEc(this,REc(b.g,b.d[0]).a):REc(c.g,c.d[0]).a!=null&&ZEc(this,REc(c.g,c.d[0]).a)} +function BUb(a,b){var c,d,e,f,g,h,i,j,k,l;a.a=new dVb(oqb(t1));for(d=new olb(b.a);d.a=1){if(q-g>0&&l>=0){i.n.a+=p;i.n.b+=f*g}else if(q-g<0&&k>=0){i.n.a+=p*q;i.n.b+=f}}}a.o.a=b.a;a.o.b=b.b;yNb(a,(Nyc(),Fxc),(tdd(),d=BD(gdb(I1),9),new xqb(d,BD(_Bb(d,d.length),9),0)))} +function iFd(a,b,c,d,e,f){var g;if(!(b==null||!OEd(b,zEd,AEd))){throw vbb(new Wdb('invalid scheme: '+b))}if(!a&&!(c!=null&&hfb(c,wfb(35))==-1&&c.length>0&&(BCb(0,c.length),c.charCodeAt(0)!=47))){throw vbb(new Wdb('invalid opaquePart: '+c))}if(a&&!(b!=null&&hnb(GEd,b.toLowerCase()))&&!(c==null||!OEd(c,CEd,DEd))){throw vbb(new Wdb(mve+c))}if(a&&b!=null&&hnb(GEd,b.toLowerCase())&&!eFd(c)){throw vbb(new Wdb(mve+c))}if(!fFd(d)){throw vbb(new Wdb('invalid device: '+d))}if(!hFd(e)){g=e==null?'invalid segments: null':'invalid segment: '+VEd(e);throw vbb(new Wdb(g))}if(!(f==null||hfb(f,wfb(35))==-1)){throw vbb(new Wdb('invalid query: '+f))}} +function nVc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;Odd(b,'Calculate Graph Size',1);b.n&&!!a&&Tdd(b,i6d(a),(pgd(),mgd));h=dme;i=dme;f=ere;g=ere;for(l=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));l.e!=l.i.gc();){j=BD(Dyd(l),33);o=j.i;p=j.j;r=j.g;d=j.f;e=BD(hkd(j,(Y9c(),S8c)),142);h=$wnd.Math.min(h,o-e.b);i=$wnd.Math.min(i,p-e.d);f=$wnd.Math.max(f,o+r+e.c);g=$wnd.Math.max(g,p+d+e.a)}n=BD(hkd(a,(Y9c(),f9c)),116);m=new f7c(h-n.b,i-n.d);for(k=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));k.e!=k.i.gc();){j=BD(Dyd(k),33);dld(j,j.i-m.a);eld(j,j.j-m.b)}q=f-h+(n.b+n.c);c=g-i+(n.d+n.a);cld(a,q);ald(a,c);b.n&&!!a&&Tdd(b,i6d(a),(pgd(),mgd))} +function rGb(a){var b,c,d,e,f,g,h,i,j,k;d=new Rkb;for(g=new olb(a.e.a);g.a0){gA(a,c,0);c.a+=String.fromCharCode(d);e=lA(b,f);gA(a,c,e);f+=e-1;continue}if(d==39){if(f+11){p=KC(WD,oje,25,a.b.b.c.length,15,1);l=0;for(j=new olb(a.b.b);j.a=h&&e<=i){if(h<=e&&f<=i){c[k++]=e;c[k++]=f;d+=2}else if(h<=e){c[k++]=e;c[k++]=i;a.b[d]=i+1;g+=2}else if(f<=i){c[k++]=h;c[k++]=f;d+=2}else{c[k++]=h;c[k++]=i;a.b[d]=i+1}}else if(iQie)&&h<10);zVb(a.c,new _Ub);OUb(a);vVb(a.c);yUb(a.f)} +function sZb(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q;if(!Ccb(DD(vNb(c,(Nyc(),fxc))))){return}for(h=new olb(c.j);h.a=2){i=Jsb(c,0);g=BD(Xsb(i),8);h=BD(Xsb(i),8);while(h.a0&&jEb(j,true,(ead(),bad));h.k==(j0b(),e0b)&&kEb(j);Rhb(a.f,h,b)}}} +function Bbc(a,b,c){var d,e,f,g,h,i,j,k,l,m;Odd(c,'Node promotion heuristic',1);a.g=b;Abc(a);a.q=BD(vNb(b,(Nyc(),rxc)),260);k=BD(vNb(a.g,qxc),19).a;f=new Jbc;switch(a.q.g){case 2:case 1:Dbc(a,f);break;case 3:a.q=(kAc(),jAc);Dbc(a,f);i=0;for(h=new olb(a.a);h.aa.j){a.q=dAc;Dbc(a,f)}break;case 4:a.q=(kAc(),jAc);Dbc(a,f);j=0;for(e=new olb(a.b);e.aa.k){a.q=gAc;Dbc(a,f)}break;case 6:m=QD($wnd.Math.ceil(a.f.length*k/100));Dbc(a,new Mbc(m));break;case 5:l=QD($wnd.Math.ceil(a.d*k/100));Dbc(a,new Pbc(l));break;default:Dbc(a,f);}Ebc(a,b);Qdd(c)} +function fFc(a,b,c){var d,e,f,g;this.j=a;this.e=WZb(a);this.o=this.j.e;this.i=!!this.o;this.p=this.i?BD(Ikb(c,Q_b(this.o).p),214):null;e=BD(vNb(a,(wtc(),Ksc)),21);this.g=e.Hc((Orc(),Hrc));this.b=new Rkb;this.d=new rHc(this.e);g=BD(vNb(this.j,jtc),230);this.q=wFc(b,g,this.e);this.k=new BGc(this);f=Ou(OC(GC(qY,1),Uhe,225,0,[this,this.d,this.k,this.q]));if(b==(rGc(),oGc)&&!Ccb(DD(vNb(a,(Nyc(),Awc))))){d=new SEc(this.e);f.c[f.c.length]=d;this.c=new uEc(d,g,BD(this.q,402))}else if(b==oGc&&Ccb(DD(vNb(a,(Nyc(),Awc))))){d=new SEc(this.e);f.c[f.c.length]=d;this.c=new XGc(d,g,BD(this.q,402))}else{this.c=new Oic(b,this)}Ekb(f,this.c);$Ic(f,this.e);this.s=AGc(this.k)} +function xUc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;l=BD(pr((g=Jsb((new ZRc(b)).a.d,0),new aSc(g))),86);o=l?BD(vNb(l,(mTc(),_Sc)),86):null;e=1;while(!!l&&!!o){i=0;u=0;c=l;d=o;for(h=0;h=a.i){++a.i;Ekb(a.a,meb(1));Ekb(a.b,k)}else{d=a.c[b.p][1];Nkb(a.a,j,meb(BD(Ikb(a.a,j),19).a+1-d));Nkb(a.b,j,Edb(ED(Ikb(a.b,j)))+k-d*a.e)}(a.q==(kAc(),dAc)&&(BD(Ikb(a.a,j),19).a>a.j||BD(Ikb(a.a,j-1),19).a>a.j)||a.q==gAc&&(Edb(ED(Ikb(a.b,j)))>a.k||Edb(ED(Ikb(a.b,j-1)))>a.k))&&(i=false);for(g=new Sr(ur(R_b(b).a.Kc(),new Sq));Qr(g);){f=BD(Rr(g),17);h=f.c.i;if(a.f[h.p]==j){l=Cbc(a,h);e=e+BD(l.a,19).a;i=i&&Ccb(DD(l.b))}}a.f[b.p]=j;e=e+a.c[b.p][0];return new vgd(meb(e),(Bcb(),i?true:false))} +function sPc(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r;l=new Lqb;g=new Rkb;qPc(a,c,a.d.fg(),g,l);qPc(a,d,a.d.gg(),g,l);a.b=0.2*(p=rPc(LAb(new YAb(null,new Kub(g,16)),new xPc)),q=rPc(LAb(new YAb(null,new Kub(g,16)),new zPc)),$wnd.Math.min(p,q));f=0;for(h=0;h=2&&(r=WNc(g,true,m),!a.e&&(a.e=new ZOc(a)),VOc(a.e,r,g,a.b),undefined);uPc(g,m);wPc(g);n=-1;for(k=new olb(g);k.ah} +function k6b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p;c=BD(vNb(a,(Nyc(),Vxc)),98);g=a.f;f=a.d;h=g.a+f.b+f.c;i=0-f.d-a.c.b;k=g.b+f.d+f.a-a.c.b;j=new Rkb;l=new Rkb;for(e=new olb(b);e.a0),BD(k.a.Xb(k.c=--k.b),17));while(f!=d&&k.b>0){a.a[f.p]=true;a.a[d.p]=true;f=(sCb(k.b>0),BD(k.a.Xb(k.c=--k.b),17))}k.b>0&&uib(k)}}}} +function Vmd(b,c,d){var e,f,g,h,i,j,k,l,m;if(b.a!=c.Aj()){throw vbb(new Wdb(tte+c.ne()+ute))}e=o1d((O6d(),M6d),c).$k();if(e){return e.Aj().Nh().Ih(e,d)}h=o1d(M6d,c).al();if(h){if(d==null){return null}i=BD(d,15);if(i.dc()){return ''}m=new Hfb;for(g=i.Kc();g.Ob();){f=g.Pb();Efb(m,h.Aj().Nh().Ih(h,f));m.a+=' '}return lcb(m,m.a.length-1)}l=o1d(M6d,c).bl();if(!l.dc()){for(k=l.Kc();k.Ob();){j=BD(k.Pb(),148);if(j.wj(d)){try{m=j.Aj().Nh().Ih(j,d);if(m!=null){return m}}catch(a){a=ubb(a);if(!JD(a,102))throw vbb(a)}}}throw vbb(new Wdb("Invalid value: '"+d+"' for datatype :"+c.ne()))}BD(c,834).Fj();return d==null?null:JD(d,172)?''+BD(d,172).a:rb(d)==$J?CQd(Pmd[0],BD(d,199)):fcb(d)} +function zQc(a){var b,c,d,e,f,g,h,i,j,k;j=new Psb;h=new Psb;for(f=new olb(a);f.a-1){for(e=Jsb(h,0);e.b!=e.d.c;){d=BD(Xsb(e),128);d.v=g}while(h.b!=0){d=BD(Vt(h,0),128);for(c=new olb(d.i);c.a0){c+=i.n.a+i.o.a/2;++l}for(o=new olb(i.j);o.a0&&(c/=l);r=KC(UD,Vje,25,d.a.c.length,15,1);h=0;for(j=new olb(d.a);j.a=h&&e<=i){if(h<=e&&f<=i){d+=2}else if(h<=e){a.b[d]=i+1;g+=2}else if(f<=i){c[k++]=e;c[k++]=h-1;d+=2}else{c[k++]=e;c[k++]=h-1;a.b[d]=i+1;g+=2}}else if(i0?(e-=86400000):(e+=86400000);i=new gB(wbb(Cbb(b.q.getTime()),e))}k=new Vfb;j=a.a.length;for(f=0;f=97&&d<=122||d>=65&&d<=90){for(g=f+1;g=j){throw vbb(new Wdb("Missing trailing '"))}g+10&&c.c==0){!b&&(b=new Rkb);b.c[b.c.length]=c}}if(b){while(b.c.length!=0){c=BD(Kkb(b,0),233);if(!!c.b&&c.b.c.length>0){for(f=(!c.b&&(c.b=new Rkb),new olb(c.b));f.aJkb(a,c,0)){return new vgd(e,c)}}else if(Edb(REc(e.g,e.d[0]).a)>Edb(REc(c.g,c.d[0]).a)){return new vgd(e,c)}}}for(h=(!c.e&&(c.e=new Rkb),c.e).Kc();h.Ob();){g=BD(h.Pb(),233);i=(!g.b&&(g.b=new Rkb),g.b);wCb(0,i.c.length);aCb(i.c,0,c);g.c==i.c.length&&(b.c[b.c.length]=g,true)}}}return null} +function wlb(a,b){var c,d,e,f,g,h,i,j,k;if(a==null){return Xhe}i=b.a.zc(a,b);if(i!=null){return '[...]'}c=new xwb(She,'[',']');for(e=a,f=0,g=e.length;f=14&&k<=16))){if(b.a._b(d)){!c.a?(c.a=new Wfb(c.d)):Qfb(c.a,c.b);Nfb(c.a,'[...]')}else{h=CD(d);j=new Vqb(b);uwb(c,wlb(h,j))}}else JD(d,177)?uwb(c,Xlb(BD(d,177))):JD(d,190)?uwb(c,Qlb(BD(d,190))):JD(d,195)?uwb(c,Rlb(BD(d,195))):JD(d,2012)?uwb(c,Wlb(BD(d,2012))):JD(d,48)?uwb(c,Ulb(BD(d,48))):JD(d,364)?uwb(c,Vlb(BD(d,364))):JD(d,832)?uwb(c,Tlb(BD(d,832))):JD(d,104)&&uwb(c,Slb(BD(d,104)))}else{uwb(c,d==null?Xhe:fcb(d))}}return !c.a?c.c:c.e.length==0?c.a.a:c.a.a+(''+c.e)} +function xQb(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;h=itd(b,false,false);r=ofd(h);d&&(r=w7c(r));t=Edb(ED(hkd(b,(CPb(),vPb))));q=(sCb(r.b!=0),BD(r.a.a.c,8));l=BD(Ut(r,1),8);if(r.b>2){k=new Rkb;Gkb(k,new Jib(r,1,r.b));f=sQb(k,t+a.a);s=new XOb(f);tNb(s,b);c.c[c.c.length]=s}else{d?(s=BD(Ohb(a.b,jtd(b)),266)):(s=BD(Ohb(a.b,ltd(b)),266))}i=jtd(b);d&&(i=ltd(b));g=zQb(q,i);j=t+a.a;if(g.a){j+=$wnd.Math.abs(q.b-l.b);p=new f7c(l.a,(l.b+q.b)/2)}else{j+=$wnd.Math.abs(q.a-l.a);p=new f7c((l.a+q.a)/2,l.b)}d?Rhb(a.d,b,new ZOb(s,g,p,j)):Rhb(a.c,b,new ZOb(s,g,p,j));Rhb(a.b,b,s);o=(!b.n&&(b.n=new cUd(D2,b,1,7)),b.n);for(n=new Fyd(o);n.e!=n.i.gc();){m=BD(Dyd(n),137);e=wQb(a,m,true,0,0);c.c[c.c.length]=e}} +function wPc(a){var b,c,d,e,f,g,h,i,j,k;j=new Rkb;h=new Rkb;for(g=new olb(a);g.a-1){for(f=new olb(h);f.a0){continue}rOc(i,$wnd.Math.min(i.o,e.o-1));qOc(i,i.i-1);i.i==0&&(h.c[h.c.length]=i,true)}}}} +function QQd(a,b,c){var d,e,f,g,h,i,j;j=a.c;!b&&(b=FQd);a.c=b;if((a.Db&4)!=0&&(a.Db&1)==0){i=new nSd(a,1,2,j,a.c);!c?(c=i):c.Ei(i)}if(j!=b){if(JD(a.Cb,284)){if(a.Db>>16==-10){c=BD(a.Cb,284).nk(b,c)}else if(a.Db>>16==-15){!b&&(b=(jGd(),YFd));!j&&(j=(jGd(),YFd));if(a.Cb.nh()){i=new pSd(a.Cb,1,13,j,b,HLd(QSd(BD(a.Cb,59)),a),false);!c?(c=i):c.Ei(i)}}}else if(JD(a.Cb,88)){if(a.Db>>16==-23){JD(b,88)||(b=(jGd(),_Fd));JD(j,88)||(j=(jGd(),_Fd));if(a.Cb.nh()){i=new pSd(a.Cb,1,10,j,b,HLd(VKd(BD(a.Cb,26)),a),false);!c?(c=i):c.Ei(i)}}}else if(JD(a.Cb,444)){h=BD(a.Cb,836);g=(!h.b&&(h.b=new RYd(new NYd)),h.b);for(f=(d=new nib((new eib(g.a)).a),new ZYd(d));f.a.b;){e=BD(lib(f.a).cd(),87);c=QQd(e,MQd(e,h),c)}}}return c} +function O1b(a,b){var c,d,e,f,g,h,i,j,k,l,m;g=Ccb(DD(hkd(a,(Nyc(),fxc))));m=BD(hkd(a,Yxc),21);i=false;j=false;l=new Fyd((!a.c&&(a.c=new cUd(F2,a,9,9)),a.c));while(l.e!=l.i.gc()&&(!i||!j)){f=BD(Dyd(l),118);h=0;for(e=ul(pl(OC(GC(KI,1),Uhe,20,0,[(!f.d&&(f.d=new y5d(B2,f,8,5)),f.d),(!f.e&&(f.e=new y5d(B2,f,7,4)),f.e)])));Qr(e);){d=BD(Rr(e),79);k=g&&Qld(d)&&Ccb(DD(hkd(d,gxc)));c=ELd((!d.b&&(d.b=new y5d(z2,d,4,7)),d.b),f)?a==Xod(atd(BD(qud((!d.c&&(d.c=new y5d(z2,d,5,8)),d.c),0),82))):a==Xod(atd(BD(qud((!d.b&&(d.b=new y5d(z2,d,4,7)),d.b),0),82)));if(k||c){++h;if(h>1){break}}}h>0?(i=true):m.Hc((rcd(),ncd))&&(!f.n&&(f.n=new cUd(D2,f,1,7)),f.n).i>0&&(i=true);h>1&&(j=true)}i&&b.Fc((Orc(),Hrc));j&&b.Fc((Orc(),Irc))} +function zfd(a){var b,c,d,e,f,g,h,i,j,k,l,m;m=BD(hkd(a,(Y9c(),Y8c)),21);if(m.dc()){return null}h=0;g=0;if(m.Hc((tdd(),rdd))){k=BD(hkd(a,t9c),98);d=2;c=2;e=2;f=2;b=!Xod(a)?BD(hkd(a,z8c),103):BD(hkd(Xod(a),z8c),103);for(j=new Fyd((!a.c&&(a.c=new cUd(F2,a,9,9)),a.c));j.e!=j.i.gc();){i=BD(Dyd(j),118);l=BD(hkd(i,A9c),61);if(l==(Ucd(),Scd)){l=lfd(i,b);jkd(i,A9c,l)}if(k==(dcd(),$bd)){switch(l.g){case 1:d=$wnd.Math.max(d,i.i+i.g);break;case 2:c=$wnd.Math.max(c,i.j+i.f);break;case 3:e=$wnd.Math.max(e,i.i+i.g);break;case 4:f=$wnd.Math.max(f,i.j+i.f);}}else{switch(l.g){case 1:d+=i.g+2;break;case 2:c+=i.f+2;break;case 3:e+=i.g+2;break;case 4:f+=i.f+2;}}}h=$wnd.Math.max(d,e);g=$wnd.Math.max(c,f)}return Afd(a,h,g,true,true)} +function lnc(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;s=BD(GAb(VAb(JAb(new YAb(null,new Kub(b.d,16)),new pnc(c)),new rnc(c)),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)]))),15);l=Ohe;k=Rie;for(i=new olb(b.b.j);i.a0;if(j){if(j){m=r.p;g?++m:--m;l=BD(Ikb(r.c.a,m),10);d=I4b(l);n=!(s6c(d,w,c[0])||n6c(d,w,c[0]))}}else{n=true}}o=false;v=b.D.i;if(!!v&&!!v.c&&h.e){k=g&&v.p>0||!g&&v.p0&&(b.a+=She,b);yfd(BD(Dyd(h),160),b)}b.a+=gne;i=new Oyd((!d.c&&(d.c=new y5d(z2,d,5,8)),d.c));while(i.e!=i.i.gc()){i.e>0&&(b.a+=She,b);yfd(BD(Dyd(i),160),b)}b.a+=')'}}} +function y2b(a,b,c){var d,e,f,g,h,i,j,k,l,m,n;f=BD(vNb(a,(wtc(),$sc)),79);if(!f){return}d=a.a;e=new g7c(c);P6c(e,C2b(a));if(f_b(a.d.i,a.c.i)){m=a.c;l=l7c(OC(GC(m1,1),nie,8,0,[m.n,m.a]));c7c(l,c)}else{l=A0b(a.c)}Gsb(d,l,d.a,d.a.a);n=A0b(a.d);vNb(a,utc)!=null&&P6c(n,BD(vNb(a,utc),8));Gsb(d,n,d.c.b,d.c);q7c(d,e);g=itd(f,true,true);kmd(g,BD(qud((!f.b&&(f.b=new y5d(z2,f,4,7)),f.b),0),82));lmd(g,BD(qud((!f.c&&(f.c=new y5d(z2,f,5,8)),f.c),0),82));ifd(d,g);for(k=new olb(a.b);k.a=0){i=null;h=new Bib(k.a,j+1);while(h.bg?1:Ny(isNaN(0),isNaN(g)))<0&&(null,My(Jqe),($wnd.Math.abs(g-1)<=Jqe||g==1||isNaN(g)&&isNaN(1)?0:g<1?-1:g>1?1:Ny(isNaN(g),isNaN(1)))<0)&&(null,My(Jqe),($wnd.Math.abs(0-h)<=Jqe||0==h||isNaN(0)&&isNaN(h)?0:0h?1:Ny(isNaN(0),isNaN(h)))<0)&&(null,My(Jqe),($wnd.Math.abs(h-1)<=Jqe||h==1||isNaN(h)&&isNaN(1)?0:h<1?-1:h>1?1:Ny(isNaN(h),isNaN(1)))<0));return f} +function z6d(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w;for(l=new usb(new nsb(a));l.b!=l.c.a.d;){k=tsb(l);h=BD(k.d,56);b=BD(k.e,56);g=h.Tg();for(p=0,u=(g.i==null&&TKd(g),g.i).length;p=0&&p=j.c.c.length?(k=JJc((j0b(),h0b),g0b)):(k=JJc((j0b(),g0b),g0b));k*=2;f=c.a.g;c.a.g=$wnd.Math.max(f,f+(k-f));g=c.b.g;c.b.g=$wnd.Math.max(g,g+(k-g));e=b}}} +function VNc(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;v=Hx(a);k=new Rkb;h=a.c.length;l=h-1;m=h+1;while(v.a.c!=0){while(c.b!=0){t=(sCb(c.b!=0),BD(Nsb(c,c.a.a),112));Jwb(v.a,t)!=null;t.g=l--;YNc(t,b,c,d)}while(b.b!=0){u=(sCb(b.b!=0),BD(Nsb(b,b.a.a),112));Jwb(v.a,u)!=null;u.g=m++;YNc(u,b,c,d)}j=Rie;for(r=(g=new Ywb((new cxb((new Gjb(v.a)).a)).b),new Njb(g));sib(r.a.a);){q=(f=Wwb(r.a),BD(f.cd(),112));if(!d&&q.b>0&&q.a<=0){k.c=KC(SI,Uhe,1,0,5,1);k.c[k.c.length]=q;break}p=q.i-q.d;if(p>=j){if(p>j){k.c=KC(SI,Uhe,1,0,5,1);j=p}k.c[k.c.length]=q}}if(k.c.length!=0){i=BD(Ikb(k,Bub(e,k.c.length)),112);Jwb(v.a,i)!=null;i.g=m++;YNc(i,b,c,d);k.c=KC(SI,Uhe,1,0,5,1)}}s=a.c.length+1;for(o=new olb(a);o.a0){m.d+=k.n.d;m.d+=k.d}if(m.a>0){m.a+=k.n.a;m.a+=k.d}if(m.b>0){m.b+=k.n.b;m.b+=k.d}if(m.c>0){m.c+=k.n.c;m.c+=k.d}return m} +function d6b(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o;m=c.d;l=c.c;f=new f7c(c.f.a+c.d.b+c.d.c,c.f.b+c.d.d+c.d.a);g=f.b;for(j=new olb(a.a);j.a0){a.c[b.c.p][b.p].d+=Cub(a.i,24)*lke*0.07000000029802322-0.03500000014901161;a.c[b.c.p][b.p].a=a.c[b.c.p][b.p].d/a.c[b.c.p][b.p].b}} +function m5b(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;for(o=new olb(a);o.ad.d;d.d=$wnd.Math.max(d.d,b);if(h&&c){d.d=$wnd.Math.max(d.d,d.a);d.a=d.d+e}break;case 3:c=b>d.a;d.a=$wnd.Math.max(d.a,b);if(h&&c){d.a=$wnd.Math.max(d.a,d.d);d.d=d.a+e}break;case 2:c=b>d.c;d.c=$wnd.Math.max(d.c,b);if(h&&c){d.c=$wnd.Math.max(d.b,d.c);d.b=d.c+e}break;case 4:c=b>d.b;d.b=$wnd.Math.max(d.b,b);if(h&&c){d.b=$wnd.Math.max(d.b,d.c);d.c=d.b+e}}}}} +function l3b(a){var b,c,d,e,f,g,h,i,j,k,l;for(j=new olb(a);j.a0||k.j==Tcd&&k.e.c.length-k.g.c.length<0)){b=false;break}for(e=new olb(k.g);e.a=j&&v>=q){m+=o.n.b+p.n.b+p.a.b-u;++h}}}}if(c){for(g=new olb(s.e);g.a=j&&v>=q){m+=o.n.b+p.n.b+p.a.b-u;++h}}}}}if(h>0){w+=m/h;++n}}if(n>0){b.a=e*w/n;b.g=n}else{b.a=0;b.g=0}} +function oMc(a,b){var c,d,e,f,g,h,i,j,k,l,m;for(e=new olb(a.a.b);e.aQje||b.o==cMc&&k0&&dld(r,u*w);v>0&&eld(r,v*A)}stb(a.b,new CQb);b=new Rkb;for(h=new nib((new eib(a.c)).a);h.b;){g=lib(h);d=BD(g.cd(),79);c=BD(g.dd(),395).a;e=itd(d,false,false);l=oQb(jtd(d),ofd(e),c);ifd(l,e);t=ktd(d);if(!!t&&Jkb(b,t,0)==-1){b.c[b.c.length]=t;pQb(t,(sCb(l.b!=0),BD(l.a.a.c,8)),c)}}for(q=new nib((new eib(a.d)).a);q.b;){p=lib(q);d=BD(p.cd(),79);c=BD(p.dd(),395).a;e=itd(d,false,false);l=oQb(ltd(d),w7c(ofd(e)),c);l=w7c(l);ifd(l,e);t=mtd(d);if(!!t&&Jkb(b,t,0)==-1){b.c[b.c.length]=t;pQb(t,(sCb(l.b!=0),BD(l.c.b.c,8)),c)}}} +function _Vc(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B;if(c.c.length!=0){o=new Rkb;for(n=new olb(c);n.a1){n=new ZQc(o,t,d);reb(t,new PQc(a,n));g.c[g.c.length]=n;for(l=t.a.ec().Kc();l.Ob();){k=BD(l.Pb(),46);Lkb(f,k.b)}}if(h.a.gc()>1){n=new ZQc(o,h,d);reb(h,new RQc(a,n));g.c[g.c.length]=n;for(l=h.a.ec().Kc();l.Ob();){k=BD(l.Pb(),46);Lkb(f,k.b)}}}} +function $Wc(a){r4c(a,new E3c(L3c(P3c(M3c(O3c(N3c(new R3c,sre),'ELK Radial'),'A radial layout provider which is based on the algorithm of Peter Eades published in "Drawing free trees.", published by International Institute for Advanced Study of Social Information Science, Fujitsu Limited in 1991. The radial layouter takes a tree and places the nodes in radial order around the root. The nodes of the same tree level are placed on the same radius.'),new bXc),sre)));p4c(a,sre,uqe,Ksd(UWc));p4c(a,sre,wme,Ksd(XWc));p4c(a,sre,Fme,Ksd(NWc));p4c(a,sre,Tme,Ksd(OWc));p4c(a,sre,Eme,Ksd(PWc));p4c(a,sre,Gme,Ksd(MWc));p4c(a,sre,Dme,Ksd(QWc));p4c(a,sre,Hme,Ksd(TWc));p4c(a,sre,ore,Ksd(KWc));p4c(a,sre,nre,Ksd(LWc));p4c(a,sre,rre,Ksd(RWc));p4c(a,sre,lre,Ksd(SWc));p4c(a,sre,mre,Ksd(VWc));p4c(a,sre,pre,Ksd(WWc));p4c(a,sre,qre,Ksd(YWc))} +function LIb(a){var b;this.r=Cy(new OIb,new SIb);this.b=new Rpb(BD(Qb(F1),290));this.p=new Rpb(BD(Qb(F1),290));this.i=new Rpb(BD(Qb(DN),290));this.e=a;this.o=new g7c(a.rf());this.D=a.Df()||Ccb(DD(a.We((Y9c(),M8c))));this.A=BD(a.We((Y9c(),Y8c)),21);this.B=BD(a.We(b9c),21);this.q=BD(a.We(t9c),98);this.u=BD(a.We(x9c),21);if(!ucd(this.u)){throw vbb(new y2c('Invalid port label placement: '+this.u))}this.v=Ccb(DD(a.We(z9c)));this.j=BD(a.We(W8c),21);if(!Jbd(this.j)){throw vbb(new y2c('Invalid node label placement: '+this.j))}this.n=BD(bgd(a,U8c),116);this.k=Edb(ED(bgd(a,Q9c)));this.d=Edb(ED(bgd(a,P9c)));this.w=Edb(ED(bgd(a,X9c)));this.s=Edb(ED(bgd(a,R9c)));this.t=Edb(ED(bgd(a,S9c)));this.C=BD(bgd(a,V9c),142);this.c=2*this.d;b=!this.B.Hc((Idd(),zdd));this.f=new mIb(0,b,0);this.g=new mIb(1,b,0);lIb(this.f,(gHb(),eHb),this.g)} +function Lgd(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D;t=0;o=0;n=0;m=1;for(s=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));s.e!=s.i.gc();){q=BD(Dyd(s),33);m+=sr(new Sr(ur(_sd(q).a.Kc(),new Sq)));B=q.g;o=$wnd.Math.max(o,B);l=q.f;n=$wnd.Math.max(n,l);t+=B*l}p=(!a.a&&(a.a=new cUd(E2,a,10,11)),a.a).i;g=t+2*d*d*m*p;f=$wnd.Math.sqrt(g);i=$wnd.Math.max(f*c,o);h=$wnd.Math.max(f/c,n);for(r=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));r.e!=r.i.gc();){q=BD(Dyd(r),33);C=e.b+(Cub(b,26)*ike+Cub(b,27)*jke)*(i-q.g);D=e.b+(Cub(b,26)*ike+Cub(b,27)*jke)*(h-q.f);dld(q,C);eld(q,D)}A=i+(e.b+e.c);w=h+(e.d+e.a);for(v=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));v.e!=v.i.gc();){u=BD(Dyd(v),33);for(k=new Sr(ur(_sd(u).a.Kc(),new Sq));Qr(k);){j=BD(Rr(k),79);Pld(j)||Kgd(j,b,A,w)}}A+=e.b+e.c;w+=e.d+e.a;Afd(a,A,w,false,true)} +function Jcb(a){var b,c,d,e,f,g,h,i,j,k,l;if(a==null){throw vbb(new Oeb(Xhe))}j=a;f=a.length;i=false;if(f>0){b=(BCb(0,a.length),a.charCodeAt(0));if(b==45||b==43){a=a.substr(1);--f;i=b==45}}if(f==0){throw vbb(new Oeb(Oje+j+'"'))}while(a.length>0&&(BCb(0,a.length),a.charCodeAt(0)==48)){a=a.substr(1);--f}if(f>(Neb(),Leb)[10]){throw vbb(new Oeb(Oje+j+'"'))}for(e=0;e0){l=-parseInt(a.substr(0,d),10);a=a.substr(d);f-=d;c=false}while(f>=g){d=parseInt(a.substr(0,g),10);a=a.substr(g);f-=g;if(c){c=false}else{if(ybb(l,h)<0){throw vbb(new Oeb(Oje+j+'"'))}l=Ibb(l,k)}l=Qbb(l,d)}if(ybb(l,0)>0){throw vbb(new Oeb(Oje+j+'"'))}if(!i){l=Jbb(l);if(ybb(l,0)<0){throw vbb(new Oeb(Oje+j+'"'))}}return l} +function Z6d(a,b){X6d();var c,d,e,f,g,h,i;this.a=new a7d(this);this.b=a;this.c=b;this.f=c2d(q1d((O6d(),M6d),b));if(this.f.dc()){if((h=t1d(M6d,a))==b){this.e=true;this.d=new Rkb;this.f=new oFd;this.f.Fc(Ewe);BD(V1d(p1d(M6d,bKd(a)),''),26)==a&&this.f.Fc(u1d(M6d,bKd(a)));for(e=g1d(M6d,a).Kc();e.Ob();){d=BD(e.Pb(),170);switch($1d(q1d(M6d,d))){case 4:{this.d.Fc(d);break}case 5:{this.f.Gc(c2d(q1d(M6d,d)));break}}}}else{Q6d();if(BD(b,66).Oj()){this.e=true;this.f=null;this.d=new Rkb;for(g=0,i=(a.i==null&&TKd(a),a.i).length;g=0&&g0&&(BD(Mpb(a.b,b),124).a.b=c)} +function b3b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;Odd(b,'Comment pre-processing',1);c=0;i=new olb(a.a);while(i.a0){j=(BCb(0,c.length),c.charCodeAt(0));if(j!=64){if(j==37){m=c.lastIndexOf('%');k=false;if(m!=0&&(m==n-1||(k=(BCb(m+1,c.length),c.charCodeAt(m+1)==46)))){h=c.substr(1,m-1);u=dfb('%',h)?null:QEd(h);e=0;if(k){try{e=Icb(c.substr(m+2),Rie,Ohe)}catch(a){a=ubb(a);if(JD(a,127)){i=a;throw vbb(new rFd(i))}else throw vbb(a)}}for(r=pRd(b.Wg());r.Ob();){p=MRd(r);if(JD(p,510)){f=BD(p,590);t=f.d;if((u==null?t==null:dfb(u,t))&&e--==0){return f}}}return null}}l=c.lastIndexOf('.');o=l==-1?c:c.substr(0,l);d=0;if(l!=-1){try{d=Icb(c.substr(l+1),Rie,Ohe)}catch(a){a=ubb(a);if(JD(a,127)){o=c}else throw vbb(a)}}o=dfb('%',o)?null:QEd(o);for(q=pRd(b.Wg());q.Ob();){p=MRd(q);if(JD(p,191)){g=BD(p,191);s=g.ne();if((o==null?s==null:dfb(o,s))&&d--==0){return g}}}return null}}return rid(b,c)} +function f6b(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F;w=new Rkb;for(o=new olb(a.b);o.a=b.length)return {done:true};var a=b[d++];return {value:[a,c.get(a)],done:false}}}};if(!xrb()){e.prototype.createObject=function(){return {}};e.prototype.get=function(a){return this.obj[':'+a]};e.prototype.set=function(a,b){this.obj[':'+a]=b};e.prototype[hke]=function(a){delete this.obj[':'+a]};e.prototype.keys=function(){var a=[];for(var b in this.obj){b.charCodeAt(0)==58&&a.push(b.substring(1))}return a}}return e} +function cde(a){ade();var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;if(a==null)return null;l=a.length*8;if(l==0){return ''}h=l%24;n=l/24|0;m=h!=0?n+1:n;f=null;f=KC(TD,$ie,25,m*4,15,1);j=0;k=0;b=0;c=0;d=0;g=0;e=0;for(i=0;i>24;j=(b&3)<<24>>24;o=(b&-128)==0?b>>2<<24>>24:(b>>2^192)<<24>>24;p=(c&-128)==0?c>>4<<24>>24:(c>>4^240)<<24>>24;q=(d&-128)==0?d>>6<<24>>24:(d>>6^252)<<24>>24;f[g++]=_ce[o];f[g++]=_ce[p|j<<4];f[g++]=_ce[k<<2|q];f[g++]=_ce[d&63]}if(h==8){b=a[e];j=(b&3)<<24>>24;o=(b&-128)==0?b>>2<<24>>24:(b>>2^192)<<24>>24;f[g++]=_ce[o];f[g++]=_ce[j<<4];f[g++]=61;f[g++]=61}else if(h==16){b=a[e];c=a[e+1];k=(c&15)<<24>>24;j=(b&3)<<24>>24;o=(b&-128)==0?b>>2<<24>>24:(b>>2^192)<<24>>24;p=(c&-128)==0?c>>4<<24>>24:(c>>4^240)<<24>>24;f[g++]=_ce[o];f[g++]=_ce[p|j<<4];f[g++]=_ce[k<<2];f[g++]=61}return zfb(f,0,f.length)} +function mB(a,b){var c,d,e,f,g,h,i;a.e==0&&a.p>0&&(a.p=-(a.p-1));a.p>Rie&&dB(b,a.p-nje);g=b.q.getDate();ZA(b,1);a.k>=0&&aB(b,a.k);if(a.c>=0){ZA(b,a.c)}else if(a.k>=0){i=new fB(b.q.getFullYear()-nje,b.q.getMonth(),35);d=35-i.q.getDate();ZA(b,$wnd.Math.min(d,g))}else{ZA(b,g)}a.f<0&&(a.f=b.q.getHours());a.b>0&&a.f<12&&(a.f+=12);$A(b,a.f==24&&a.g?0:a.f);a.j>=0&&_A(b,a.j);a.n>=0&&bB(b,a.n);a.i>=0&&cB(b,wbb(Ibb(Abb(Cbb(b.q.getTime()),_ie),_ie),a.i));if(a.a){e=new eB;dB(e,e.q.getFullYear()-nje-80);Gbb(Cbb(b.q.getTime()),Cbb(e.q.getTime()))&&dB(b,e.q.getFullYear()-nje+100)}if(a.d>=0){if(a.c==-1){c=(7+a.d-b.q.getDay())%7;c>3&&(c-=7);h=b.q.getMonth();ZA(b,b.q.getDate()+c);b.q.getMonth()!=h&&ZA(b,b.q.getDate()+(c>0?-7:7))}else{if(b.q.getDay()!=a.d){return false}}}if(a.o>Rie){f=b.q.getTimezoneOffset();cB(b,wbb(Cbb(b.q.getTime()),(a.o-f)*60*_ie))}return true} +function z2b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;e=vNb(b,(wtc(),$sc));if(!JD(e,239)){return}o=BD(e,33);p=b.e;m=new g7c(b.c);f=b.d;m.a+=f.b;m.b+=f.d;u=BD(hkd(o,(Nyc(),Ixc)),174);if(uqb(u,(Idd(),Add))){n=BD(hkd(o,Kxc),116);w_b(n,f.a);z_b(n,f.d);x_b(n,f.b);y_b(n,f.c)}c=new Rkb;for(k=new olb(b.a);k.a0&&Ekb(a.p,k);Ekb(a.o,k)}b-=d;n=i+b;j+=b*a.e;Nkb(a.a,h,meb(n));Nkb(a.b,h,j);a.j=$wnd.Math.max(a.j,n);a.k=$wnd.Math.max(a.k,j);a.d+=b;b+=p}} +function Ucd(){Ucd=ccb;var a;Scd=new Ycd(ole,0);Acd=new Ycd(xle,1);zcd=new Ycd(yle,2);Rcd=new Ycd(zle,3);Tcd=new Ycd(Ale,4);Fcd=(mmb(),new zob((a=BD(gdb(F1),9),new xqb(a,BD(_Bb(a,a.length),9),0))));Gcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[])));Bcd=Up(qqb(zcd,OC(GC(F1,1),bne,61,0,[])));Ocd=Up(qqb(Rcd,OC(GC(F1,1),bne,61,0,[])));Qcd=Up(qqb(Tcd,OC(GC(F1,1),bne,61,0,[])));Lcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[Rcd])));Ecd=Up(qqb(zcd,OC(GC(F1,1),bne,61,0,[Tcd])));Ncd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[Tcd])));Hcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[zcd])));Pcd=Up(qqb(Rcd,OC(GC(F1,1),bne,61,0,[Tcd])));Ccd=Up(qqb(zcd,OC(GC(F1,1),bne,61,0,[Rcd])));Kcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[zcd,Tcd])));Dcd=Up(qqb(zcd,OC(GC(F1,1),bne,61,0,[Rcd,Tcd])));Mcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[Rcd,Tcd])));Icd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[zcd,Rcd])));Jcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[zcd,Rcd,Tcd])))} +function fSc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;if(b.b!=0){n=new Psb;h=null;o=null;d=QD($wnd.Math.floor($wnd.Math.log(b.b)*$wnd.Math.LOG10E)+1);i=0;for(t=Jsb(b,0);t.b!=t.d.c;){r=BD(Xsb(t),86);if(PD(o)!==PD(vNb(r,(mTc(),$Sc)))){o=GD(vNb(r,$Sc));i=0}o!=null?(h=o+iSc(i++,d)):(h=iSc(i++,d));yNb(r,$Sc,h);for(q=(e=Jsb((new ZRc(r)).a.d,0),new aSc(e));Wsb(q.a);){p=BD(Xsb(q.a),188).c;Gsb(n,p,n.c.b,n.c);yNb(p,$Sc,h)}}m=new Lqb;for(g=0;g=i){sCb(r.b>0);r.a.Xb(r.c=--r.b);break}else if(p.a>j){if(!e){Ekb(p.b,l);p.c=$wnd.Math.min(p.c,j);p.a=$wnd.Math.max(p.a,i);e=p}else{Gkb(e.b,p.b);e.a=$wnd.Math.max(e.a,p.a);uib(r)}}}if(!e){e=new TCc;e.c=j;e.a=i;Aib(r,e);Ekb(e.b,l)}}h=b.b;k=0;for(q=new olb(d);q.ah?1:0}if(a.b){a.b._b(f)&&(e=BD(a.b.xc(f),19).a);a.b._b(i)&&(h=BD(a.b.xc(i),19).a)}return eh?1:0}return b.e.c.length!=0&&c.g.c.length!=0?1:-1} +function acc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A;Odd(b,Ine,1);p=new Rkb;w=new Rkb;for(j=new olb(a.b);j.a0&&(t-=n);h_b(g,t);k=0;for(m=new olb(g.a);m.a0);h.a.Xb(h.c=--h.b)}i=0.4*d*k;!f&&h.bb.d.c){n=a.c[b.a.d];q=a.c[l.a.d];if(n==q){continue}AFb(DFb(CFb(EFb(BFb(new FFb,1),100),n),q))}}}}}}} +function QEd(a){IEd();var b,c,d,e,f,g,h,i;if(a==null)return null;e=hfb(a,wfb(37));if(e<0){return a}else{i=new Wfb(a.substr(0,e));b=KC(SD,wte,25,4,15,1);h=0;d=0;for(g=a.length;ee+2&&_Ed((BCb(e+1,a.length),a.charCodeAt(e+1)),xEd,yEd)&&_Ed((BCb(e+2,a.length),a.charCodeAt(e+2)),xEd,yEd)){c=dFd((BCb(e+1,a.length),a.charCodeAt(e+1)),(BCb(e+2,a.length),a.charCodeAt(e+2)));e+=2;if(d>0){(c&192)==128?(b[h++]=c<<24>>24):(d=0)}else if(c>=128){if((c&224)==192){b[h++]=c<<24>>24;d=2}else if((c&240)==224){b[h++]=c<<24>>24;d=3}else if((c&248)==240){b[h++]=c<<24>>24;d=4}}if(d>0){if(h==d){switch(h){case 2:{Kfb(i,((b[0]&31)<<6|b[1]&63)&aje);break}case 3:{Kfb(i,((b[0]&15)<<12|(b[1]&63)<<6|b[2]&63)&aje);break}}h=0;d=0}}else{for(f=0;f0){if(g+d>a.length){return false}h=rA(a.substr(0,g+d),b)}else{h=rA(a,b)}}switch(f){case 71:h=oA(a,g,OC(GC(ZI,1),nie,2,6,[pje,qje]),b);e.e=h;return true;case 77:return zA(a,b,e,h,g);case 76:return BA(a,b,e,h,g);case 69:return xA(a,b,g,e);case 99:return AA(a,b,g,e);case 97:h=oA(a,g,OC(GC(ZI,1),nie,2,6,['AM','PM']),b);e.b=h;return true;case 121:return DA(a,b,g,h,c,e);case 100:if(h<=0){return false}e.c=h;return true;case 83:if(h<0){return false}return yA(h,g,b[0],e);case 104:h==12&&(h=0);case 75:case 72:if(h<0){return false}e.f=h;e.g=false;return true;case 107:if(h<0){return false}e.f=h;e.g=true;return true;case 109:if(h<0){return false}e.j=h;return true;case 115:if(h<0){return false}e.n=h;return true;case 90:if(gw&&(o.c=w-o.b);Ekb(g.d,new BLb(o,bLb(g,o)));s=b==Acd?$wnd.Math.max(s,p.b+j.b.rf().b):$wnd.Math.min(s,p.b)}s+=b==Acd?a.t:-a.t;t=cLb((g.e=s,g));t>0&&(BD(Mpb(a.b,b),124).a.b=t);for(k=m.Kc();k.Ob();){j=BD(k.Pb(),111);if(!j.c||j.c.d.c.length<=0){continue}o=j.c.i;o.c-=j.e.a;o.d-=j.e.b}} +function SPb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;b=new Lqb;for(i=new Fyd(a);i.e!=i.i.gc();){h=BD(Dyd(i),33);c=new Tqb;Rhb(OPb,h,c);n=new aQb;e=BD(GAb(new YAb(null,new Lub(new Sr(ur($sd(h).a.Kc(),new Sq)))),Wyb(n,Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)])))),83);RPb(c,BD(e.xc((Bcb(),true)),14),new cQb);d=BD(GAb(JAb(BD(e.xc(false),15).Lc(),new eQb),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[Dyb]))),15);for(g=d.Kc();g.Ob();){f=BD(g.Pb(),79);m=ktd(f);if(m){j=BD(Wd(irb(b.f,m)),21);if(!j){j=UPb(m);jrb(b.f,m,j)}ye(c,j)}}e=BD(GAb(new YAb(null,new Lub(new Sr(ur(_sd(h).a.Kc(),new Sq)))),Wyb(n,Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[Dyb])))),83);RPb(c,BD(e.xc(true),14),new gQb);d=BD(GAb(JAb(BD(e.xc(false),15).Lc(),new iQb),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[Dyb]))),15);for(l=d.Kc();l.Ob();){k=BD(l.Pb(),79);m=mtd(k);if(m){j=BD(Wd(irb(b.f,m)),21);if(!j){j=UPb(m);jrb(b.f,m,j)}ye(c,j)}}}} +function rhb(a,b){phb();var c,d,e,f,g,h,i,j,k,l,m,n,o,p;i=ybb(a,0)<0;i&&(a=Jbb(a));if(ybb(a,0)==0){switch(b){case 0:return '0';case 1:return $je;case 2:return '0.00';case 3:return '0.000';case 4:return '0.0000';case 5:return '0.00000';case 6:return '0.000000';default:n=new Ufb;b<0?(n.a+='0E+',n):(n.a+='0E',n);n.a+=b==Rie?'2147483648':''+-b;return n.a;}}k=18;l=KC(TD,$ie,25,k+1,15,1);c=k;p=a;do{j=p;p=Abb(p,10);l[--c]=Tbb(wbb(48,Qbb(j,Ibb(p,10))))&aje}while(ybb(p,0)!=0);e=Qbb(Qbb(Qbb(k,c),b),1);if(b==0){i&&(l[--c]=45);return zfb(l,c,k-c)}if(b>0&&ybb(e,-6)>=0){if(ybb(e,0)>=0){f=c+Tbb(e);for(h=k-1;h>=f;h--){l[h+1]=l[h]}l[++f]=46;i&&(l[--c]=45);return zfb(l,c,k-c+1)}for(g=2;Gbb(g,wbb(Jbb(e),1));g++){l[--c]=48}l[--c]=46;l[--c]=48;i&&(l[--c]=45);return zfb(l,c,k-c)}o=c+1;d=k;m=new Vfb;i&&(m.a+='-',m);if(d-o>=1){Kfb(m,l[c]);m.a+='.';m.a+=zfb(l,c+1,k-c-1)}else{m.a+=zfb(l,c,k-c)}m.a+='E';ybb(e,0)>0&&(m.a+='+',m);m.a+=''+Ubb(e);return m.a} +function iQc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n;a.e.a.$b();a.f.a.$b();a.c.c=KC(SI,Uhe,1,0,5,1);a.i.c=KC(SI,Uhe,1,0,5,1);a.g.a.$b();if(b){for(g=new olb(b.a);g.a=1){if(v-j>0&&o>=0){dld(l,l.i+u);eld(l,l.j+i*j)}else if(v-j<0&&n>=0){dld(l,l.i+u*v);eld(l,l.j+i)}}}}jkd(a,(Y9c(),Y8c),(tdd(),f=BD(gdb(I1),9),new xqb(f,BD(_Bb(f,f.length),9),0)));return new f7c(w,k)} +function Yfd(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o;n=Xod(atd(BD(qud((!a.b&&(a.b=new y5d(z2,a,4,7)),a.b),0),82)));o=Xod(atd(BD(qud((!a.c&&(a.c=new y5d(z2,a,5,8)),a.c),0),82)));l=n==o;h=new d7c;b=BD(hkd(a,(Zad(),Sad)),74);if(!!b&&b.b>=2){if((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a).i==0){c=(Fhd(),e=new rmd,e);wtd((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a),c)}else if((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a).i>1){m=new Oyd((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a));while(m.e!=m.i.gc()){Eyd(m)}}ifd(b,BD(qud((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a),0),202))}if(l){for(d=new Fyd((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a));d.e!=d.i.gc();){c=BD(Dyd(d),202);for(j=new Fyd((!c.a&&(c.a=new xMd(y2,c,5)),c.a));j.e!=j.i.gc();){i=BD(Dyd(j),469);h.a=$wnd.Math.max(h.a,i.a);h.b=$wnd.Math.max(h.b,i.b)}}}for(g=new Fyd((!a.n&&(a.n=new cUd(D2,a,1,7)),a.n));g.e!=g.i.gc();){f=BD(Dyd(g),137);k=BD(hkd(f,Yad),8);!!k&&bld(f,k.a,k.b);if(l){h.a=$wnd.Math.max(h.a,f.i+f.g);h.b=$wnd.Math.max(h.b,f.j+f.f)}}return h} +function yMc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B;t=b.c.length;e=new ULc(a.a,c,null,null);B=KC(UD,Vje,25,t,15,1);p=KC(UD,Vje,25,t,15,1);o=KC(UD,Vje,25,t,15,1);q=0;for(h=0;hB[i]&&(q=i);for(l=new olb(a.a.b);l.an){if(f){Fsb(w,m);Fsb(B,meb(j.b-1))}H=c.b;I+=m+b;m=0;k=$wnd.Math.max(k,c.b+c.c+G)}dld(h,H);eld(h,I);k=$wnd.Math.max(k,H+G+c.c);m=$wnd.Math.max(m,l);H+=G+b}k=$wnd.Math.max(k,d);F=I+m+c.a;if(Fqme;C=$wnd.Math.abs(m.b-o.b)>qme;(!c&&B&&C||c&&(B||C))&&Dsb(q.a,u)}ye(q.a,d);d.b==0?(m=u):(m=(sCb(d.b!=0),BD(d.c.b.c,8)));bZb(n,l,p);if(AZb(e)==A){if(Q_b(A.i)!=e.a){p=new d7c;Y$b(p,Q_b(A.i),s)}yNb(q,utc,p)}cZb(n,q,s);k.a.zc(n,k)}QZb(q,v);RZb(q,A)}for(j=k.a.ec().Kc();j.Ob();){i=BD(j.Pb(),17);QZb(i,null);RZb(i,null)}Qdd(b)} +function KQb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;if(a.gc()==1){return BD(a.Xb(0),231)}else if(a.gc()<=0){return new kRb}for(e=a.Kc();e.Ob();){c=BD(e.Pb(),231);o=0;k=Ohe;l=Ohe;i=Rie;j=Rie;for(n=new olb(c.e);n.ah){t=0;u+=g+r;g=0}JQb(p,c,t,u);b=$wnd.Math.max(b,t+q.a);g=$wnd.Math.max(g,q.b);t+=q.a+r}return p} +function Ioc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;k=new s7c;switch(a.a.g){case 3:m=BD(vNb(b.e,(wtc(),rtc)),15);n=BD(vNb(b.j,rtc),15);o=BD(vNb(b.f,rtc),15);c=BD(vNb(b.e,ptc),15);d=BD(vNb(b.j,ptc),15);e=BD(vNb(b.f,ptc),15);g=new Rkb;Gkb(g,m);n.Jc(new Loc);Gkb(g,JD(n,152)?km(BD(n,152)):JD(n,131)?BD(n,131).a:JD(n,54)?new ov(n):new dv(n));Gkb(g,o);f=new Rkb;Gkb(f,c);Gkb(f,JD(d,152)?km(BD(d,152)):JD(d,131)?BD(d,131).a:JD(d,54)?new ov(d):new dv(d));Gkb(f,e);yNb(b.f,rtc,g);yNb(b.f,ptc,f);yNb(b.f,stc,b.f);yNb(b.e,rtc,null);yNb(b.e,ptc,null);yNb(b.j,rtc,null);yNb(b.j,ptc,null);break;case 1:ye(k,b.e.a);Dsb(k,b.i.n);ye(k,Su(b.j.a));Dsb(k,b.a.n);ye(k,b.f.a);break;default:ye(k,b.e.a);ye(k,Su(b.j.a));ye(k,b.f.a);}Osb(b.f.a);ye(b.f.a,k);QZb(b.f,b.e.c);h=BD(vNb(b.e,(Nyc(),jxc)),74);j=BD(vNb(b.j,jxc),74);i=BD(vNb(b.f,jxc),74);if(!!h||!!j||!!i){l=new s7c;Goc(l,i);Goc(l,j);Goc(l,h);yNb(b.f,jxc,l)}QZb(b.j,null);RZb(b.j,null);QZb(b.e,null);RZb(b.e,null);$_b(b.a,null);$_b(b.i,null);!!b.g&&Ioc(a,b.g)} +function bde(a){ade();var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;if(a==null)return null;f=rfb(a);o=ede(f);if(o%4!=0){return null}p=o/4|0;if(p==0)return KC(SD,wte,25,0,15,1);l=null;b=0;c=0;d=0;e=0;g=0;h=0;i=0;j=0;n=0;m=0;k=0;l=KC(SD,wte,25,p*3,15,1);for(;n>4)<<24>>24;l[m++]=((c&15)<<4|d>>2&15)<<24>>24;l[m++]=(d<<6|e)<<24>>24}if(!dde(g=f[k++])||!dde(h=f[k++])){return null}b=$ce[g];c=$ce[h];i=f[k++];j=f[k++];if($ce[i]==-1||$ce[j]==-1){if(i==61&&j==61){if((c&15)!=0)return null;q=KC(SD,wte,25,n*3+1,15,1);$fb(l,0,q,0,n*3);q[m]=(b<<2|c>>4)<<24>>24;return q}else if(i!=61&&j==61){d=$ce[i];if((d&3)!=0)return null;q=KC(SD,wte,25,n*3+2,15,1);$fb(l,0,q,0,n*3);q[m++]=(b<<2|c>>4)<<24>>24;q[m]=((c&15)<<4|d>>2&15)<<24>>24;return q}else{return null}}else{d=$ce[i];e=$ce[j];l[m++]=(b<<2|c>>4)<<24>>24;l[m++]=((c&15)<<4|d>>2&15)<<24>>24;l[m++]=(d<<6|e)<<24>>24}return l} +function Sbc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;Odd(b,Ine,1);o=BD(vNb(a,(Nyc(),Swc)),218);for(e=new olb(a.b);e.a=2){p=true;m=new olb(f.j);c=BD(mlb(m),11);n=null;while(m.a0){e=BD(Ikb(q.c.a,w-1),10);g=a.i[e.p];B=$wnd.Math.ceil(jBc(a.n,e,q));f=v.a.e-q.d.d-(g.a.e+e.o.b+e.d.a)-B}j=Pje;if(w0&&A.a.e.e-A.a.a-(A.b.e.e-A.b.a)<0;o=t.a.e.e-t.a.a-(t.b.e.e-t.b.a)<0&&A.a.e.e-A.a.a-(A.b.e.e-A.b.a)>0;n=t.a.e.e+t.b.aA.b.e.e+A.a.a;u=0;!p&&!o&&(m?f+l>0?(u=l):j-d>0&&(u=d):n&&(f+h>0?(u=h):j-s>0&&(u=s)));v.a.e+=u;v.b&&(v.d.e+=u);return false} +function XGb(a,b,c){var d,e,f,g,h,i,j,k,l,m;d=new J6c(b.qf().a,b.qf().b,b.rf().a,b.rf().b);e=new I6c;if(a.c){for(g=new olb(b.wf());g.aj&&(d.a+=yfb(KC(TD,$ie,25,-j,15,1)));d.a+='Is';if(hfb(i,wfb(32))>=0){for(e=0;e=d.o.b/2}else{s=!l}if(s){r=BD(vNb(d,(wtc(),vtc)),15);if(!r){f=new Rkb;yNb(d,vtc,f)}else if(m){f=r}else{e=BD(vNb(d,tsc),15);if(!e){f=new Rkb;yNb(d,tsc,f)}else{r.gc()<=e.gc()?(f=r):(f=e)}}}else{e=BD(vNb(d,(wtc(),tsc)),15);if(!e){f=new Rkb;yNb(d,tsc,f)}else if(l){f=e}else{r=BD(vNb(d,vtc),15);if(!r){f=new Rkb;yNb(d,vtc,f)}else{e.gc()<=r.gc()?(f=e):(f=r)}}}f.Fc(a);yNb(a,(wtc(),vsc),c);if(b.d==c){RZb(b,null);c.e.c.length+c.g.c.length==0&&F0b(c,null);d3b(c)}else{QZb(b,null);c.e.c.length+c.g.c.length==0&&F0b(c,null)}Osb(b.a)} +function aoc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H;s=new Bib(a.b,0);k=b.Kc();o=0;j=BD(k.Pb(),19).a;v=0;c=new Tqb;A=new zsb;while(s.b=a.a){d=E6b(a,s);k=$wnd.Math.max(k,d.b);u=$wnd.Math.max(u,d.d);Ekb(h,new vgd(s,d))}}B=new Rkb;for(j=0;j0),q.a.Xb(q.c=--q.b),C=new H1b(a.b),Aib(q,C),sCb(q.b0){j=0;!!q&&(j+=h);j+=(C-1)*g;!!t&&(j+=h);B&&!!t&&(j=$wnd.Math.max(j,jQc(t,g,s,A)));if(j0){m=k<100?null:new Ixd(k);j=new Aud(b);o=j.g;r=KC(WD,oje,25,k,15,1);d=0;u=new zud(k);for(e=0;e=0;){if(n!=null?pb(n,o[i]):PD(n)===PD(o[i])){if(r.length<=d){q=r;r=KC(WD,oje,25,2*r.length,15,1);$fb(q,0,r,0,d)}r[d++]=e;wtd(u,o[i]);break v}}n=n;if(PD(n)===PD(h)){break}}}j=u;o=u.g;k=d;if(d>r.length){q=r;r=KC(WD,oje,25,d,15,1);$fb(q,0,r,0,d)}if(d>0){t=true;for(f=0;f=0;){tud(a,r[g])}if(d!=k){for(e=k;--e>=d;){tud(j,e)}q=r;r=KC(WD,oje,25,d,15,1);$fb(q,0,r,0,d)}b=j}}}else{b=Ctd(a,b);for(e=a.i;--e>=0;){if(b.Hc(a.g[e])){tud(a,e);t=true}}}if(t){if(r!=null){c=b.gc();l=c==1?FLd(a,4,b.Kc().Pb(),null,r[0],p):FLd(a,6,b,r,r[0],p);m=c<100?null:new Ixd(c);for(e=b.Kc();e.Ob();){n=e.Pb();m=Q2d(a,BD(n,72),m)}if(!m){Uhd(a.e,l)}else{m.Ei(l);m.Fi()}}else{m=Vxd(b.gc());for(e=b.Kc();e.Ob();){n=e.Pb();m=Q2d(a,BD(n,72),m)}!!m&&m.Fi()}return true}else{return false}} +function fYb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;c=new mYb(b);c.a||$Xb(b);j=ZXb(b);i=new Hp;q=new AYb;for(p=new olb(b.a);p.a0||c.o==dMc&&e0){l=BD(Ikb(m.c.a,g-1),10);B=jBc(a.b,m,l);q=m.n.b-m.d.d-(l.n.b+l.o.b+l.d.a+B)}else{q=m.n.b-m.d.d}j=$wnd.Math.min(q,j);if(gg?Anc(a,b,c):Anc(a,c,b);return eg?1:0}}d=BD(vNb(b,(wtc(),Zsc)),19).a;f=BD(vNb(c,Zsc),19).a;d>f?Anc(a,b,c):Anc(a,c,b);return df?1:0} +function u2c(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;if(Ccb(DD(hkd(b,(Y9c(),d9c))))){return mmb(),mmb(),jmb}j=(!b.a&&(b.a=new cUd(E2,b,10,11)),b.a).i!=0;l=s2c(b);k=!l.dc();if(j||k){e=BD(hkd(b,F9c),149);if(!e){throw vbb(new y2c('Resolved algorithm is not set; apply a LayoutAlgorithmResolver before computing layout.'))}s=D3c(e,(Csd(),ysd));q2c(b);if(!j&&k&&!s){return mmb(),mmb(),jmb}i=new Rkb;if(PD(hkd(b,J8c))===PD((hbd(),ebd))&&(D3c(e,vsd)||D3c(e,usd))){n=p2c(a,b);o=new Psb;ye(o,(!b.a&&(b.a=new cUd(E2,b,10,11)),b.a));while(o.b!=0){m=BD(o.b==0?null:(sCb(o.b!=0),Nsb(o,o.a.a)),33);q2c(m);r=PD(hkd(m,J8c))===PD(gbd);if(r||ikd(m,o8c)&&!C3c(e,hkd(m,F9c))){h=u2c(a,m,c,d);Gkb(i,h);jkd(m,J8c,gbd);hfd(m)}else{ye(o,(!m.a&&(m.a=new cUd(E2,m,10,11)),m.a))}}}else{n=(!b.a&&(b.a=new cUd(E2,b,10,11)),b.a).i;for(g=new Fyd((!b.a&&(b.a=new cUd(E2,b,10,11)),b.a));g.e!=g.i.gc();){f=BD(Dyd(g),33);h=u2c(a,f,c,d);Gkb(i,h);hfd(f)}}for(q=new olb(i);q.a=0?(n=Zcd(h)):(n=Wcd(Zcd(h)));a.Ye($xc,n)}j=new d7c;m=false;if(a.Xe(Txc)){a7c(j,BD(a.We(Txc),8));m=true}else{_6c(j,g.a/2,g.b/2)}switch(n.g){case 4:yNb(k,mxc,(Ctc(),ytc));yNb(k,Bsc,(Gqc(),Fqc));k.o.b=g.b;p<0&&(k.o.a=-p);G0b(l,(Ucd(),zcd));m||(j.a=g.a);j.a-=g.a;break;case 2:yNb(k,mxc,(Ctc(),Atc));yNb(k,Bsc,(Gqc(),Dqc));k.o.b=g.b;p<0&&(k.o.a=-p);G0b(l,(Ucd(),Tcd));m||(j.a=0);break;case 1:yNb(k,Osc,(esc(),dsc));k.o.a=g.a;p<0&&(k.o.b=-p);G0b(l,(Ucd(),Rcd));m||(j.b=g.b);j.b-=g.b;break;case 3:yNb(k,Osc,(esc(),bsc));k.o.a=g.a;p<0&&(k.o.b=-p);G0b(l,(Ucd(),Acd));m||(j.b=0);}a7c(l.n,j);yNb(k,Txc,j);if(b==Zbd||b==_bd||b==$bd){o=0;if(b==Zbd&&a.Xe(Wxc)){switch(n.g){case 1:case 2:o=BD(a.We(Wxc),19).a;break;case 3:case 4:o=-BD(a.We(Wxc),19).a;}}else{switch(n.g){case 4:case 2:o=f.b;b==_bd&&(o/=e.b);break;case 1:case 3:o=f.a;b==_bd&&(o/=e.a);}}yNb(k,htc,o)}yNb(k,Hsc,n);return k} +function AGc(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C;c=Edb(ED(vNb(a.a.j,(Nyc(),Ewc))));if(c<-1||!a.a.i||ecd(BD(vNb(a.a.o,Vxc),98))||V_b(a.a.o,(Ucd(),zcd)).gc()<2&&V_b(a.a.o,Tcd).gc()<2){return true}if(a.a.c.Rf()){return false}v=0;u=0;t=new Rkb;for(i=a.a.e,j=0,k=i.length;j=c} +function ovd(){mvd();function h(f){var g=this;this.dispatch=function(a){var b=a.data;switch(b.cmd){case 'algorithms':var c=pvd((mmb(),new lnb(new $ib(lvd.b))));f.postMessage({id:b.id,data:c});break;case 'categories':var d=pvd((mmb(),new lnb(new $ib(lvd.c))));f.postMessage({id:b.id,data:d});break;case 'options':var e=pvd((mmb(),new lnb(new $ib(lvd.d))));f.postMessage({id:b.id,data:e});break;case 'register':svd(b.algorithms);f.postMessage({id:b.id});break;case 'layout':qvd(b.graph,b.layoutOptions||{},b.options||{});f.postMessage({id:b.id,data:b.graph});break;}};this.saveDispatch=function(b){try{g.dispatch(b)}catch(a){f.postMessage({id:b.data.id,error:a})}}} +function j(b){var c=this;this.dispatcher=new h({postMessage:function(a){c.onmessage({data:a})}});this.postMessage=function(a){setTimeout(function(){c.dispatcher.saveDispatch({data:a})},0)}} +if(typeof document===uke&&typeof self!==uke){var i=new h(self);self.onmessage=i.saveDispatch}else if(typeof module!==uke&&module.exports){Object.defineProperty(exports,'__esModule',{value:true});module.exports={'default':j,Worker:j}}} +function aae(a){if(a.N)return;a.N=true;a.b=Lnd(a,0);Knd(a.b,0);Knd(a.b,1);Knd(a.b,2);a.bb=Lnd(a,1);Knd(a.bb,0);Knd(a.bb,1);a.fb=Lnd(a,2);Knd(a.fb,3);Knd(a.fb,4);Qnd(a.fb,5);a.qb=Lnd(a,3);Knd(a.qb,0);Qnd(a.qb,1);Qnd(a.qb,2);Knd(a.qb,3);Knd(a.qb,4);Qnd(a.qb,5);Knd(a.qb,6);a.a=Mnd(a,4);a.c=Mnd(a,5);a.d=Mnd(a,6);a.e=Mnd(a,7);a.f=Mnd(a,8);a.g=Mnd(a,9);a.i=Mnd(a,10);a.j=Mnd(a,11);a.k=Mnd(a,12);a.n=Mnd(a,13);a.o=Mnd(a,14);a.p=Mnd(a,15);a.q=Mnd(a,16);a.s=Mnd(a,17);a.r=Mnd(a,18);a.t=Mnd(a,19);a.u=Mnd(a,20);a.v=Mnd(a,21);a.w=Mnd(a,22);a.B=Mnd(a,23);a.A=Mnd(a,24);a.C=Mnd(a,25);a.D=Mnd(a,26);a.F=Mnd(a,27);a.G=Mnd(a,28);a.H=Mnd(a,29);a.J=Mnd(a,30);a.I=Mnd(a,31);a.K=Mnd(a,32);a.M=Mnd(a,33);a.L=Mnd(a,34);a.P=Mnd(a,35);a.Q=Mnd(a,36);a.R=Mnd(a,37);a.S=Mnd(a,38);a.T=Mnd(a,39);a.U=Mnd(a,40);a.V=Mnd(a,41);a.X=Mnd(a,42);a.W=Mnd(a,43);a.Y=Mnd(a,44);a.Z=Mnd(a,45);a.$=Mnd(a,46);a._=Mnd(a,47);a.ab=Mnd(a,48);a.cb=Mnd(a,49);a.db=Mnd(a,50);a.eb=Mnd(a,51);a.gb=Mnd(a,52);a.hb=Mnd(a,53);a.ib=Mnd(a,54);a.jb=Mnd(a,55);a.kb=Mnd(a,56);a.lb=Mnd(a,57);a.mb=Mnd(a,58);a.nb=Mnd(a,59);a.ob=Mnd(a,60);a.pb=Mnd(a,61)} +function f5b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;s=0;if(b.f.a==0){for(q=new olb(a);q.aj&&(tCb(j,b.c.length),BD(b.c[j],200)).a.c.length==0){Lkb(b,(tCb(j,b.c.length),b.c[j]))}}if(!i){--f;continue}if(uZc(b,k,e,i,m,c,j,d)){l=true;continue}if(m){if(vZc(b,k,e,i,c,j,d)){l=true;continue}else if(wZc(k,e)){e.c=true;l=true;continue}}else if(wZc(k,e)){e.c=true;l=true;continue}if(l){continue}}if(wZc(k,e)){e.c=true;l=true;!!i&&(i.k=false);continue}else{a$c(e.q)}}return l} +function fed(a,b,c,d,e,f,g){var h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I;p=0;D=0;for(j=new olb(a.b);j.ap){if(f){Fsb(w,n);Fsb(B,meb(k.b-1));Ekb(a.d,o);h.c=KC(SI,Uhe,1,0,5,1)}H=c.b;I+=n+b;n=0;l=$wnd.Math.max(l,c.b+c.c+G)}h.c[h.c.length]=i;ued(i,H,I);l=$wnd.Math.max(l,H+G+c.c);n=$wnd.Math.max(n,m);H+=G+b;o=i}Gkb(a.a,h);Ekb(a.d,BD(Ikb(h,h.c.length-1),157));l=$wnd.Math.max(l,d);F=I+n+c.a;if(F1&&(g=$wnd.Math.min(g,$wnd.Math.abs(BD(Ut(h.a,1),8).b-k.b)))}}}}}else{for(p=new olb(b.j);p.ae){f=m.a-e;g=Ohe;d.c=KC(SI,Uhe,1,0,5,1);e=m.a}if(m.a>=e){d.c[d.c.length]=h;h.a.b>1&&(g=$wnd.Math.min(g,$wnd.Math.abs(BD(Ut(h.a,h.a.b-2),8).b-m.b)))}}}}}if(d.c.length!=0&&f>b.o.a/2&&g>b.o.b/2){n=new H0b;F0b(n,b);G0b(n,(Ucd(),Acd));n.n.a=b.o.a/2;r=new H0b;F0b(r,b);G0b(r,Rcd);r.n.a=b.o.a/2;r.n.b=b.o.b;for(i=new olb(d);i.a=j.b?QZb(h,r):QZb(h,n)}else{j=BD(Msb(h.a),8);q=h.a.b==0?A0b(h.c):BD(Isb(h.a),8);q.b>=j.b?RZb(h,r):RZb(h,n)}l=BD(vNb(h,(Nyc(),jxc)),74);!!l&&ze(l,j,true)}b.n.a=e-b.o.a/2}} +function erd(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K;D=null;G=b;F=Rqd(a,dtd(c),G);Lkd(F,_pd(G,Vte));H=BD(oo(a.g,Vpd(aC(G,Cte))),33);m=aC(G,'sourcePort');d=null;!!m&&(d=Vpd(m));I=BD(oo(a.j,d),118);if(!H){h=Wpd(G);o="An edge must have a source node (edge id: '"+h;p=o+$te;throw vbb(new cqd(p))}if(!!I&&!Hb(mpd(I),H)){i=_pd(G,Vte);q="The source port of an edge must be a port of the edge's source node (edge id: '"+i;r=q+$te;throw vbb(new cqd(r))}B=(!F.b&&(F.b=new y5d(z2,F,4,7)),F.b);f=null;I?(f=I):(f=H);wtd(B,f);J=BD(oo(a.g,Vpd(aC(G,bue))),33);n=aC(G,'targetPort');e=null;!!n&&(e=Vpd(n));K=BD(oo(a.j,e),118);if(!J){l=Wpd(G);s="An edge must have a target node (edge id: '"+l;t=s+$te;throw vbb(new cqd(t))}if(!!K&&!Hb(mpd(K),J)){j=_pd(G,Vte);u="The target port of an edge must be a port of the edge's target node (edge id: '"+j;v=u+$te;throw vbb(new cqd(v))}C=(!F.c&&(F.c=new y5d(z2,F,5,8)),F.c);g=null;K?(g=K):(g=J);wtd(C,g);if((!F.b&&(F.b=new y5d(z2,F,4,7)),F.b).i==0||(!F.c&&(F.c=new y5d(z2,F,5,8)),F.c).i==0){k=_pd(G,Vte);w=Zte+k;A=w+$te;throw vbb(new cqd(A))}grd(G,F);frd(G,F);D=crd(a,G,F);return D} +function DXb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D;l=FXb(zXb(a,(Ucd(),Fcd)),b);o=EXb(zXb(a,Gcd),b);u=EXb(zXb(a,Ocd),b);B=GXb(zXb(a,Qcd),b);m=GXb(zXb(a,Bcd),b);s=EXb(zXb(a,Ncd),b);p=EXb(zXb(a,Hcd),b);w=EXb(zXb(a,Pcd),b);v=EXb(zXb(a,Ccd),b);C=GXb(zXb(a,Ecd),b);r=EXb(zXb(a,Lcd),b);t=EXb(zXb(a,Kcd),b);A=EXb(zXb(a,Dcd),b);D=GXb(zXb(a,Mcd),b);n=GXb(zXb(a,Icd),b);q=EXb(zXb(a,Jcd),b);c=w6c(OC(GC(UD,1),Vje,25,15,[s.a,B.a,w.a,D.a]));d=w6c(OC(GC(UD,1),Vje,25,15,[o.a,l.a,u.a,q.a]));e=r.a;f=w6c(OC(GC(UD,1),Vje,25,15,[p.a,m.a,v.a,n.a]));j=w6c(OC(GC(UD,1),Vje,25,15,[s.b,o.b,p.b,t.b]));i=w6c(OC(GC(UD,1),Vje,25,15,[B.b,l.b,m.b,q.b]));k=C.b;h=w6c(OC(GC(UD,1),Vje,25,15,[w.b,u.b,v.b,A.b]));vXb(zXb(a,Fcd),c+e,j+k);vXb(zXb(a,Jcd),c+e,j+k);vXb(zXb(a,Gcd),c+e,0);vXb(zXb(a,Ocd),c+e,j+k+i);vXb(zXb(a,Qcd),0,j+k);vXb(zXb(a,Bcd),c+e+d,j+k);vXb(zXb(a,Hcd),c+e+d,0);vXb(zXb(a,Pcd),0,j+k+i);vXb(zXb(a,Ccd),c+e+d,j+k+i);vXb(zXb(a,Ecd),0,j);vXb(zXb(a,Lcd),c,0);vXb(zXb(a,Dcd),0,j+k+i);vXb(zXb(a,Icd),c+e+d,0);g=new d7c;g.a=w6c(OC(GC(UD,1),Vje,25,15,[c+d+e+f,C.a,t.a,A.a]));g.b=w6c(OC(GC(UD,1),Vje,25,15,[j+i+k+h,r.b,D.b,n.b]));return g} +function Ngc(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;p=new Rkb;for(m=new olb(a.d.b);m.ae.d.d+e.d.a){k.f.d=true}else{k.f.d=true;k.f.a=true}}}d.b!=d.d.c&&(b=c)}if(k){f=BD(Ohb(a.f,g.d.i),57);if(b.bf.d.d+f.d.a){k.f.d=true}else{k.f.d=true;k.f.a=true}}}}for(h=new Sr(ur(R_b(n).a.Kc(),new Sq));Qr(h);){g=BD(Rr(h),17);if(g.a.b!=0){b=BD(Isb(g.a),8);if(g.d.j==(Ucd(),Acd)){q=new hic(b,new f7c(b.a,e.d.d),e,g);q.f.a=true;q.a=g.d;p.c[p.c.length]=q}if(g.d.j==Rcd){q=new hic(b,new f7c(b.a,e.d.d+e.d.a),e,g);q.f.d=true;q.a=g.d;p.c[p.c.length]=q}}}}}return p} +function WJc(a,b,c){var d,e,f,g,h,i,j,k,l;Odd(c,'Network simplex node placement',1);a.e=b;a.n=BD(vNb(b,(wtc(),otc)),304);VJc(a);HJc(a);MAb(LAb(new YAb(null,new Kub(a.e.b,16)),new KKc),new MKc(a));MAb(JAb(LAb(JAb(LAb(new YAb(null,new Kub(a.e.b,16)),new zLc),new BLc),new DLc),new FLc),new IKc(a));if(Ccb(DD(vNb(a.e,(Nyc(),Axc))))){g=Udd(c,1);Odd(g,'Straight Edges Pre-Processing',1);UJc(a);Qdd(g)}JFb(a.f);f=BD(vNb(b,Ayc),19).a*a.f.a.c.length;uGb(HGb(IGb(LGb(a.f),f),false),Udd(c,1));if(a.d.a.gc()!=0){g=Udd(c,1);Odd(g,'Flexible Where Space Processing',1);h=BD(Btb(RAb(NAb(new YAb(null,new Kub(a.f.a,16)),new OKc),new iKc)),19).a;i=BD(Btb(QAb(NAb(new YAb(null,new Kub(a.f.a,16)),new QKc),new mKc)),19).a;j=i-h;k=nGb(new pGb,a.f);l=nGb(new pGb,a.f);AFb(DFb(CFb(BFb(EFb(new FFb,20000),j),k),l));MAb(JAb(JAb(Plb(a.i),new SKc),new UKc),new WKc(h,k,j,l));for(e=a.d.a.ec().Kc();e.Ob();){d=BD(e.Pb(),213);d.g=1}uGb(HGb(IGb(LGb(a.f),f),false),Udd(g,1));Qdd(g)}if(Ccb(DD(vNb(b,Axc)))){g=Udd(c,1);Odd(g,'Straight Edges Post-Processing',1);TJc(a);Qdd(g)}GJc(a);a.e=null;a.f=null;a.i=null;a.c=null;Uhb(a.k);a.j=null;a.a=null;a.o=null;a.d.a.$b();Qdd(c)} +function lMc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;for(h=new olb(a.a.b);h.a0){d=l.gc();j=QD($wnd.Math.floor((d+1)/2))-1;e=QD($wnd.Math.ceil((d+1)/2))-1;if(b.o==dMc){for(k=e;k>=j;k--){if(b.a[u.p]==u){p=BD(l.Xb(k),46);o=BD(p.a,10);if(!Rqb(c,p.b)&&n>a.b.e[o.p]){b.a[o.p]=u;b.g[u.p]=b.g[o.p];b.a[u.p]=b.g[u.p];b.f[b.g[u.p].p]=(Bcb(),Ccb(b.f[b.g[u.p].p])&u.k==(j0b(),g0b)?true:false);n=a.b.e[o.p]}}}}else{for(k=j;k<=e;k++){if(b.a[u.p]==u){r=BD(l.Xb(k),46);q=BD(r.a,10);if(!Rqb(c,r.b)&&n=o){if(s>o){n.c=KC(SI,Uhe,1,0,5,1);o=s}n.c[n.c.length]=g}}if(n.c.length!=0){m=BD(Ikb(n,Bub(b,n.c.length)),128);F.a.Bc(m)!=null;m.s=p++;AQc(m,C,w);n.c=KC(SI,Uhe,1,0,5,1)}}u=a.c.length+1;for(h=new olb(a);h.aD.s){uib(c);Lkb(D.i,d);if(d.c>0){d.a=D;Ekb(D.t,d);d.b=A;Ekb(A.i,d)}}}}} +function qde(a){var b,c,d,e,f;b=a.c;switch(b){case 11:return a.Ml();case 12:return a.Ol();case 14:return a.Ql();case 15:return a.Tl();case 16:return a.Rl();case 17:return a.Ul();case 21:nde(a);return wfe(),wfe(),ffe;case 10:switch(a.a){case 65:return a.yl();case 90:return a.Dl();case 122:return a.Kl();case 98:return a.El();case 66:return a.zl();case 60:return a.Jl();case 62:return a.Hl();}}f=pde(a);b=a.c;switch(b){case 3:return a.Zl(f);case 4:return a.Xl(f);case 5:return a.Yl(f);case 0:if(a.a==123&&a.d=48&&b<=57){d=b-48;while(e=48&&b<=57){d=d*10+b-48;if(d<0)throw vbb(new mde(tvd((h0d(),bve))))}}else{throw vbb(new mde(tvd((h0d(),Zue))))}c=d;if(b==44){if(e>=a.j){throw vbb(new mde(tvd((h0d(),_ue))))}else if((b=bfb(a.i,e++))>=48&&b<=57){c=b-48;while(e=48&&b<=57){c=c*10+b-48;if(c<0)throw vbb(new mde(tvd((h0d(),bve))))}if(d>c)throw vbb(new mde(tvd((h0d(),ave))))}else{c=-1}}if(b!=125)throw vbb(new mde(tvd((h0d(),$ue))));if(a.sl(e)){f=(wfe(),wfe(),++vfe,new lge(9,f));a.d=e+1}else{f=(wfe(),wfe(),++vfe,new lge(3,f));a.d=e}f.dm(d);f.cm(c);nde(a)}}return f} +function $bc(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F;p=new Skb(b.b);u=new Skb(b.b);m=new Skb(b.b);B=new Skb(b.b);q=new Skb(b.b);for(A=Jsb(b,0);A.b!=A.d.c;){v=BD(Xsb(A),11);for(h=new olb(v.g);h.a0;r=v.g.c.length>0;j&&r?(m.c[m.c.length]=v,true):j?(p.c[p.c.length]=v,true):r&&(u.c[u.c.length]=v,true)}for(o=new olb(p);o.a1){o=new Oyd((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a));while(o.e!=o.i.gc()){Eyd(o)}}g=BD(qud((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a),0),202);q=H;H>v+u?(q=v+u):Hw+p?(r=w+p):Iv-u&&qw-p&&rH+G?(B=H+G):vI+A?(C=I+A):wH-G&&BI-A&&Cc&&(m=c-1);n=N+Cub(b,24)*lke*l-l/2;n<0?(n=1):n>d&&(n=d-1);e=(Fhd(),i=new xkd,i);vkd(e,m);wkd(e,n);wtd((!g.a&&(g.a=new xMd(y2,g,5)),g.a),e)}} +function Nyc(){Nyc=ccb;iyc=(Y9c(),I9c);jyc=J9c;kyc=K9c;lyc=L9c;nyc=M9c;oyc=N9c;ryc=P9c;tyc=R9c;uyc=S9c;syc=Q9c;vyc=T9c;xyc=U9c;zyc=X9c;qyc=O9c;hyc=(jwc(),Bvc);myc=Cvc;pyc=Dvc;wyc=Evc;byc=new Osd(D9c,meb(0));cyc=yvc;dyc=zvc;eyc=Avc;Kyc=awc;Cyc=Hvc;Dyc=Kvc;Gyc=Svc;Eyc=Nvc;Fyc=Pvc;Myc=fwc;Lyc=cwc;Iyc=Yvc;Hyc=Wvc;Jyc=$vc;Cxc=pvc;Dxc=qvc;Xwc=Auc;Ywc=Duc;Lxc=new q0b(12);Kxc=new Osd(f9c,Lxc);Twc=(Aad(),wad);Swc=new Osd(E8c,Twc);Uxc=new Osd(s9c,0);fyc=new Osd(E9c,meb(1));owc=new Osd(r8c,tme);Jxc=d9c;Vxc=t9c;$xc=A9c;Kwc=y8c;mwc=p8c;axc=J8c;gyc=new Osd(H9c,(Bcb(),true));fxc=M8c;gxc=N8c;Fxc=Y8c;Ixc=b9c;Gxc=$8c;Nwc=(ead(),cad);Lwc=new Osd(z8c,Nwc);xxc=W8c;wxc=U8c;Yxc=x9c;Xxc=w9c;Zxc=z9c;Oxc=(Tbd(),Sbd);new Osd(l9c,Oxc);Qxc=o9c;Rxc=p9c;Sxc=q9c;Pxc=n9c;Byc=Gvc;sxc=avc;rxc=$uc;Ayc=Fvc;mxc=Suc;Jwc=muc;Iwc=kuc;Awc=Xtc;Bwc=Ytc;Dwc=buc;Cwc=Ztc;Hwc=iuc;uxc=cvc;vxc=dvc;ixc=Luc;Exc=uvc;zxc=hvc;$wc=Guc;Bxc=nvc;Vwc=wuc;Wwc=yuc;zwc=w8c;yxc=evc;swc=Mtc;rwc=Ktc;qwc=Jtc;cxc=Juc;bxc=Iuc;dxc=Kuc;Hxc=_8c;jxc=Q8c;Zwc=G8c;Qwc=C8c;Pwc=B8c;Ewc=euc;Wxc=v9c;pwc=v8c;exc=L8c;Txc=r9c;Mxc=h9c;Nxc=j9c;oxc=Vuc;pxc=Xuc;ayc=C9c;nwc=Itc;qxc=Zuc;Rwc=suc;Owc=quc;txc=S8c;kxc=Puc;Axc=kvc;yyc=V9c;Mwc=ouc;_xc=wvc;Uwc=uuc;lxc=Ruc;Fwc=guc;hxc=P8c;nxc=Uuc;Gwc=huc;ywc=Vtc;wwc=Stc;uwc=Qtc;vwc=Rtc;xwc=Utc;twc=Otc;_wc=Huc} +function shb(a,b){phb();var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H;B=a.e;o=a.d;e=a.a;if(B==0){switch(b){case 0:return '0';case 1:return $je;case 2:return '0.00';case 3:return '0.000';case 4:return '0.0000';case 5:return '0.00000';case 6:return '0.000000';default:w=new Ufb;b<0?(w.a+='0E+',w):(w.a+='0E',w);w.a+=-b;return w.a;}}t=o*10+1+7;u=KC(TD,$ie,25,t+1,15,1);c=t;if(o==1){h=e[0];if(h<0){H=xbb(h,Yje);do{p=H;H=Abb(H,10);u[--c]=48+Tbb(Qbb(p,Ibb(H,10)))&aje}while(ybb(H,0)!=0)}else{H=h;do{p=H;H=H/10|0;u[--c]=48+(p-H*10)&aje}while(H!=0)}}else{D=KC(WD,oje,25,o,15,1);G=o;$fb(e,0,D,0,G);I:while(true){A=0;for(j=G-1;j>=0;j--){F=wbb(Nbb(A,32),xbb(D[j],Yje));r=qhb(F);D[j]=Tbb(r);A=Tbb(Obb(r,32))}s=Tbb(A);q=c;do{u[--c]=48+s%10&aje}while((s=s/10|0)!=0&&c!=0);d=9-q+c;for(i=0;i0;i++){u[--c]=48}l=G-1;for(;D[l]==0;l--){if(l==0){break I}}G=l+1}while(u[c]==48){++c}}n=B<0;g=t-c-b-1;if(b==0){n&&(u[--c]=45);return zfb(u,c,t-c)}if(b>0&&g>=-6){if(g>=0){k=c+g;for(m=t-1;m>=k;m--){u[m+1]=u[m]}u[++k]=46;n&&(u[--c]=45);return zfb(u,c,t-c+1)}for(l=2;l<-g+1;l++){u[--c]=48}u[--c]=46;u[--c]=48;n&&(u[--c]=45);return zfb(u,c,t-c)}C=c+1;f=t;v=new Vfb;n&&(v.a+='-',v);if(f-C>=1){Kfb(v,u[c]);v.a+='.';v.a+=zfb(u,c+1,t-c-1)}else{v.a+=zfb(u,c,t-c)}v.a+='E';g>0&&(v.a+='+',v);v.a+=''+g;return v.a} +function z$c(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w;a.c=b;a.g=new Lqb;c=(Pgd(),new bhd(a.c));d=new YGb(c);UGb(d);t=GD(hkd(a.c,(d0c(),Y_c)));i=BD(hkd(a.c,$_c),316);v=BD(hkd(a.c,__c),429);g=BD(hkd(a.c,T_c),482);u=BD(hkd(a.c,Z_c),430);a.j=Edb(ED(hkd(a.c,a0c)));h=a.a;switch(i.g){case 0:h=a.a;break;case 1:h=a.b;break;case 2:h=a.i;break;case 3:h=a.e;break;case 4:h=a.f;break;default:throw vbb(new Wdb(Mre+(i.f!=null?i.f:''+i.g)));}a.d=new g_c(h,v,g);yNb(a.d,(XNb(),VNb),DD(hkd(a.c,V_c)));a.d.c=Ccb(DD(hkd(a.c,U_c)));if(Vod(a.c).i==0){return a.d}for(l=new Fyd(Vod(a.c));l.e!=l.i.gc();){k=BD(Dyd(l),33);n=k.g/2;m=k.f/2;w=new f7c(k.i+n,k.j+m);while(Mhb(a.g,w)){O6c(w,($wnd.Math.random()-0.5)*qme,($wnd.Math.random()-0.5)*qme)}p=BD(hkd(k,(Y9c(),S8c)),142);q=new aOb(w,new J6c(w.a-n-a.j/2-p.b,w.b-m-a.j/2-p.d,k.g+a.j+(p.b+p.c),k.f+a.j+(p.d+p.a)));Ekb(a.d.i,q);Rhb(a.g,w,new vgd(q,k))}switch(u.g){case 0:if(t==null){a.d.d=BD(Ikb(a.d.i,0),65)}else{for(s=new olb(a.d.i);s.a1&&(Gsb(k,r,k.c.b,k.c),true);Zsb(e)}}}r=s}}return k} +function $Bc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K,L;Odd(c,'Greedy cycle removal',1);t=b.a;L=t.c.length;a.a=KC(WD,oje,25,L,15,1);a.c=KC(WD,oje,25,L,15,1);a.b=KC(WD,oje,25,L,15,1);j=0;for(r=new olb(t);r.a0?G+1:1}for(g=new olb(w.g);g.a0?G+1:1}}a.c[j]==0?Dsb(a.e,p):a.a[j]==0&&Dsb(a.f,p);++j}o=-1;n=1;l=new Rkb;a.d=BD(vNb(b,(wtc(),jtc)),230);while(L>0){while(a.e.b!=0){I=BD(Lsb(a.e),10);a.b[I.p]=o--;_Bc(a,I);--L}while(a.f.b!=0){J=BD(Lsb(a.f),10);a.b[J.p]=n++;_Bc(a,J);--L}if(L>0){m=Rie;for(s=new olb(t);s.a=m){if(u>m){l.c=KC(SI,Uhe,1,0,5,1);m=u}l.c[l.c.length]=p}}}k=a.Zf(l);a.b[k.p]=n++;_Bc(a,k);--L}}H=t.c.length+1;for(j=0;ja.b[K]){PZb(d,true);yNb(b,Asc,(Bcb(),true))}}}}a.a=null;a.c=null;a.b=null;Osb(a.f);Osb(a.e);Qdd(c)} +function sQb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;d=new Rkb;h=new Rkb;q=b/2;n=a.gc();e=BD(a.Xb(0),8);r=BD(a.Xb(1),8);o=tQb(e.a,e.b,r.a,r.b,q);Ekb(d,(tCb(0,o.c.length),BD(o.c[0],8)));Ekb(h,(tCb(1,o.c.length),BD(o.c[1],8)));for(j=2;j=0;i--){Dsb(c,(tCb(i,g.c.length),BD(g.c[i],8)))}return c} +function aFd(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;g=true;l=null;d=null;e=null;b=false;n=BEd;j=null;f=null;h=0;i=UEd(a,h,zEd,AEd);if(i=0&&dfb(a.substr(h,'//'.length),'//')){h+=2;i=UEd(a,h,CEd,DEd);d=a.substr(h,i-h);h=i}else if(l!=null&&(h==a.length||(BCb(h,a.length),a.charCodeAt(h)!=47))){g=false;i=ifb(a,wfb(35),h);i==-1&&(i=a.length);d=a.substr(h,i-h);h=i}if(!c&&h0&&bfb(k,k.length-1)==58){e=k;h=i}}if(h=a.j){a.a=-1;a.c=1;return}b=bfb(a.i,a.d++);a.a=b;if(a.b==1){switch(b){case 92:d=10;if(a.d>=a.j)throw vbb(new mde(tvd((h0d(),uue))));a.a=bfb(a.i,a.d++);break;case 45:if((a.e&512)==512&&a.d=a.j)break;if(bfb(a.i,a.d)!=63)break;if(++a.d>=a.j)throw vbb(new mde(tvd((h0d(),vue))));b=bfb(a.i,a.d++);switch(b){case 58:d=13;break;case 61:d=14;break;case 33:d=15;break;case 91:d=19;break;case 62:d=18;break;case 60:if(a.d>=a.j)throw vbb(new mde(tvd((h0d(),vue))));b=bfb(a.i,a.d++);if(b==61){d=16}else if(b==33){d=17}else throw vbb(new mde(tvd((h0d(),wue))));break;case 35:while(a.d=a.j)throw vbb(new mde(tvd((h0d(),uue))));a.a=bfb(a.i,a.d++);break;default:d=0;}a.c=d} +function P5b(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G;A=BD(vNb(a,(Nyc(),Vxc)),98);if(!(A!=(dcd(),bcd)&&A!=ccd)){return}o=a.b;n=o.c.length;k=new Skb((Xj(n+2,Mie),Oy(wbb(wbb(5,n+2),(n+2)/10|0))));p=new Skb((Xj(n+2,Mie),Oy(wbb(wbb(5,n+2),(n+2)/10|0))));Ekb(k,new Lqb);Ekb(k,new Lqb);Ekb(p,new Rkb);Ekb(p,new Rkb);w=new Rkb;for(b=0;b=v||!wCc(r,d))&&(d=yCc(b,k));$_b(r,d);for(f=new Sr(ur(R_b(r).a.Kc(),new Sq));Qr(f);){e=BD(Rr(f),17);if(a.a[e.p]){continue}p=e.c.i;--a.e[p.p];a.e[p.p]==0&&(zCb(cub(n,p)),true)}}for(j=k.c.length-1;j>=0;--j){Ekb(b.b,(tCb(j,k.c.length),BD(k.c[j],29)))}b.a.c=KC(SI,Uhe,1,0,5,1);Qdd(c)} +function gee(a){var b,c,d,e,f,g,h,i,j;a.b=1;nde(a);b=null;if(a.c==0&&a.a==94){nde(a);b=(wfe(),wfe(),++vfe,new $fe(4));Ufe(b,0,lxe);h=(null,++vfe,new $fe(4))}else{h=(wfe(),wfe(),++vfe,new $fe(4))}e=true;while((j=a.c)!=1){if(j==0&&a.a==93&&!e){if(b){Zfe(b,h);h=b}break}c=a.a;d=false;if(j==10){switch(c){case 100:case 68:case 119:case 87:case 115:case 83:Xfe(h,fee(c));d=true;break;case 105:case 73:case 99:case 67:c=(Xfe(h,fee(c)),-1);c<0&&(d=true);break;case 112:case 80:i=tde(a,c);if(!i)throw vbb(new mde(tvd((h0d(),Iue))));Xfe(h,i);d=true;break;default:c=eee(a);}}else if(j==24&&!e){if(b){Zfe(b,h);h=b}f=gee(a);Zfe(h,f);if(a.c!=0||a.a!=93)throw vbb(new mde(tvd((h0d(),Mue))));break}nde(a);if(!d){if(j==0){if(c==91)throw vbb(new mde(tvd((h0d(),Nue))));if(c==93)throw vbb(new mde(tvd((h0d(),Oue))));if(c==45&&!e&&a.a!=93)throw vbb(new mde(tvd((h0d(),Pue))))}if(a.c!=0||a.a!=45||c==45&&e){Ufe(h,c,c)}else{nde(a);if((j=a.c)==1)throw vbb(new mde(tvd((h0d(),Kue))));if(j==0&&a.a==93){Ufe(h,c,c);Ufe(h,45,45)}else if(j==0&&a.a==93||j==24){throw vbb(new mde(tvd((h0d(),Pue))))}else{g=a.a;if(j==0){if(g==91)throw vbb(new mde(tvd((h0d(),Nue))));if(g==93)throw vbb(new mde(tvd((h0d(),Oue))));if(g==45)throw vbb(new mde(tvd((h0d(),Pue))))}else j==10&&(g=eee(a));nde(a);if(c>g)throw vbb(new mde(tvd((h0d(),Sue))));Ufe(h,c,g)}}}e=false}if(a.c==1)throw vbb(new mde(tvd((h0d(),Kue))));Yfe(h);Vfe(h);a.b=0;nde(a);return h} +function xZd(a){Bnd(a.c,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#decimal']));Bnd(a.d,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#integer']));Bnd(a.e,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#boolean']));Bnd(a.f,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EBoolean',fue,'EBoolean:Object']));Bnd(a.i,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#byte']));Bnd(a.g,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#hexBinary']));Bnd(a.j,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EByte',fue,'EByte:Object']));Bnd(a.n,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EChar',fue,'EChar:Object']));Bnd(a.t,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#double']));Bnd(a.u,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EDouble',fue,'EDouble:Object']));Bnd(a.F,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#float']));Bnd(a.G,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EFloat',fue,'EFloat:Object']));Bnd(a.I,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#int']));Bnd(a.J,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EInt',fue,'EInt:Object']));Bnd(a.N,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#long']));Bnd(a.O,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'ELong',fue,'ELong:Object']));Bnd(a.Z,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#short']));Bnd(a.$,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EShort',fue,'EShort:Object']));Bnd(a._,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#string']))} +function fRc(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G;if(a.c.length==1){return tCb(0,a.c.length),BD(a.c[0],135)}else if(a.c.length<=0){return new SRc}for(i=new olb(a);i.al){F=0;G+=k+A;k=0}eRc(v,g,F,G);b=$wnd.Math.max(b,F+w.a);k=$wnd.Math.max(k,w.b);F+=w.a+A}u=new Lqb;c=new Lqb;for(C=new olb(a);C.aSLc(f))&&(l=f)}}!l&&(l=(tCb(0,q.c.length),BD(q.c[0],180)));for(p=new olb(b.b);p.a=-1900?1:0;c>=4?Qfb(a,OC(GC(ZI,1),nie,2,6,[pje,qje])[h]):Qfb(a,OC(GC(ZI,1),nie,2,6,['BC','AD'])[h]);break;case 121:kA(a,c,d);break;case 77:jA(a,c,d);break;case 107:i=e.q.getHours();i==0?EA(a,24,c):EA(a,i,c);break;case 83:iA(a,c,e);break;case 69:k=d.q.getDay();c==5?Qfb(a,OC(GC(ZI,1),nie,2,6,['S','M','T','W','T','F','S'])[k]):c==4?Qfb(a,OC(GC(ZI,1),nie,2,6,[rje,sje,tje,uje,vje,wje,xje])[k]):Qfb(a,OC(GC(ZI,1),nie,2,6,['Sun','Mon','Tue','Wed','Thu','Fri','Sat'])[k]);break;case 97:e.q.getHours()>=12&&e.q.getHours()<24?Qfb(a,OC(GC(ZI,1),nie,2,6,['AM','PM'])[1]):Qfb(a,OC(GC(ZI,1),nie,2,6,['AM','PM'])[0]);break;case 104:l=e.q.getHours()%12;l==0?EA(a,12,c):EA(a,l,c);break;case 75:m=e.q.getHours()%12;EA(a,m,c);break;case 72:n=e.q.getHours();EA(a,n,c);break;case 99:o=d.q.getDay();c==5?Qfb(a,OC(GC(ZI,1),nie,2,6,['S','M','T','W','T','F','S'])[o]):c==4?Qfb(a,OC(GC(ZI,1),nie,2,6,[rje,sje,tje,uje,vje,wje,xje])[o]):c==3?Qfb(a,OC(GC(ZI,1),nie,2,6,['Sun','Mon','Tue','Wed','Thu','Fri','Sat'])[o]):EA(a,o,1);break;case 76:p=d.q.getMonth();c==5?Qfb(a,OC(GC(ZI,1),nie,2,6,['J','F','M','A','M','J','J','A','S','O','N','D'])[p]):c==4?Qfb(a,OC(GC(ZI,1),nie,2,6,[bje,cje,dje,eje,fje,gje,hje,ije,jje,kje,lje,mje])[p]):c==3?Qfb(a,OC(GC(ZI,1),nie,2,6,['Jan','Feb','Mar','Apr',fje,'Jun','Jul','Aug','Sep','Oct','Nov','Dec'])[p]):EA(a,p+1,c);break;case 81:q=d.q.getMonth()/3|0;c<4?Qfb(a,OC(GC(ZI,1),nie,2,6,['Q1','Q2','Q3','Q4'])[q]):Qfb(a,OC(GC(ZI,1),nie,2,6,['1st quarter','2nd quarter','3rd quarter','4th quarter'])[q]);break;case 100:r=d.q.getDate();EA(a,r,c);break;case 109:j=e.q.getMinutes();EA(a,j,c);break;case 115:g=e.q.getSeconds();EA(a,g,c);break;case 122:c<4?Qfb(a,f.c[0]):Qfb(a,f.c[1]);break;case 118:Qfb(a,f.b);break;case 90:c<3?Qfb(a,OA(f)):c==3?Qfb(a,NA(f)):Qfb(a,QA(f.a));break;default:return false;}return true} +function X1b(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H;N1b(b);i=BD(qud((!b.b&&(b.b=new y5d(z2,b,4,7)),b.b),0),82);k=BD(qud((!b.c&&(b.c=new y5d(z2,b,5,8)),b.c),0),82);h=atd(i);j=atd(k);g=(!b.a&&(b.a=new cUd(A2,b,6,6)),b.a).i==0?null:BD(qud((!b.a&&(b.a=new cUd(A2,b,6,6)),b.a),0),202);A=BD(Ohb(a.a,h),10);F=BD(Ohb(a.a,j),10);B=null;G=null;if(JD(i,186)){w=BD(Ohb(a.a,i),299);if(JD(w,11)){B=BD(w,11)}else if(JD(w,10)){A=BD(w,10);B=BD(Ikb(A.j,0),11)}}if(JD(k,186)){D=BD(Ohb(a.a,k),299);if(JD(D,11)){G=BD(D,11)}else if(JD(D,10)){F=BD(D,10);G=BD(Ikb(F.j,0),11)}}if(!A||!F){throw vbb(new z2c('The source or the target of edge '+b+' could not be found. '+'This usually happens when an edge connects a node laid out by ELK Layered to a node in '+'another level of hierarchy laid out by either another instance of ELK Layered or another '+'layout algorithm alltogether. The former can be solved by setting the hierarchyHandling '+'option to INCLUDE_CHILDREN.'))}p=new UZb;tNb(p,b);yNb(p,(wtc(),$sc),b);yNb(p,(Nyc(),jxc),null);n=BD(vNb(d,Ksc),21);A==F&&n.Fc((Orc(),Nrc));if(!B){v=(KAc(),IAc);C=null;if(!!g&&fcd(BD(vNb(A,Vxc),98))){C=new f7c(g.j,g.k);Bfd(C,Mld(b));Cfd(C,c);if(ntd(j,h)){v=HAc;P6c(C,A.n)}}B=$$b(A,C,v,d)}if(!G){v=(KAc(),HAc);H=null;if(!!g&&fcd(BD(vNb(F,Vxc),98))){H=new f7c(g.b,g.c);Bfd(H,Mld(b));Cfd(H,c)}G=$$b(F,H,v,Q_b(F))}QZb(p,B);RZb(p,G);(B.e.c.length>1||B.g.c.length>1||G.e.c.length>1||G.g.c.length>1)&&n.Fc((Orc(),Irc));for(m=new Fyd((!b.n&&(b.n=new cUd(D2,b,1,7)),b.n));m.e!=m.i.gc();){l=BD(Dyd(m),137);if(!Ccb(DD(hkd(l,Jxc)))&&!!l.a){q=Z1b(l);Ekb(p.b,q);switch(BD(vNb(q,Qwc),272).g){case 1:case 2:n.Fc((Orc(),Grc));break;case 0:n.Fc((Orc(),Erc));yNb(q,Qwc,(qad(),nad));}}}f=BD(vNb(d,Iwc),314);r=BD(vNb(d,Exc),315);e=f==(Rpc(),Opc)||r==(Vzc(),Rzc);if(!!g&&(!g.a&&(g.a=new xMd(y2,g,5)),g.a).i!=0&&e){s=ofd(g);o=new s7c;for(u=Jsb(s,0);u.b!=u.d.c;){t=BD(Xsb(u),8);Dsb(o,new g7c(t))}yNb(p,_sc,o)}return p} +function yZd(a){if(a.gb)return;a.gb=true;a.b=Lnd(a,0);Knd(a.b,18);Qnd(a.b,19);a.a=Lnd(a,1);Knd(a.a,1);Qnd(a.a,2);Qnd(a.a,3);Qnd(a.a,4);Qnd(a.a,5);a.o=Lnd(a,2);Knd(a.o,8);Knd(a.o,9);Qnd(a.o,10);Qnd(a.o,11);Qnd(a.o,12);Qnd(a.o,13);Qnd(a.o,14);Qnd(a.o,15);Qnd(a.o,16);Qnd(a.o,17);Qnd(a.o,18);Qnd(a.o,19);Qnd(a.o,20);Qnd(a.o,21);Qnd(a.o,22);Qnd(a.o,23);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);a.p=Lnd(a,3);Knd(a.p,2);Knd(a.p,3);Knd(a.p,4);Knd(a.p,5);Qnd(a.p,6);Qnd(a.p,7);Pnd(a.p);Pnd(a.p);a.q=Lnd(a,4);Knd(a.q,8);a.v=Lnd(a,5);Qnd(a.v,9);Pnd(a.v);Pnd(a.v);Pnd(a.v);a.w=Lnd(a,6);Knd(a.w,2);Knd(a.w,3);Knd(a.w,4);Qnd(a.w,5);a.B=Lnd(a,7);Qnd(a.B,1);Pnd(a.B);Pnd(a.B);Pnd(a.B);a.Q=Lnd(a,8);Qnd(a.Q,0);Pnd(a.Q);a.R=Lnd(a,9);Knd(a.R,1);a.S=Lnd(a,10);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);a.T=Lnd(a,11);Qnd(a.T,10);Qnd(a.T,11);Qnd(a.T,12);Qnd(a.T,13);Qnd(a.T,14);Pnd(a.T);Pnd(a.T);a.U=Lnd(a,12);Knd(a.U,2);Knd(a.U,3);Qnd(a.U,4);Qnd(a.U,5);Qnd(a.U,6);Qnd(a.U,7);Pnd(a.U);a.V=Lnd(a,13);Qnd(a.V,10);a.W=Lnd(a,14);Knd(a.W,18);Knd(a.W,19);Knd(a.W,20);Qnd(a.W,21);Qnd(a.W,22);Qnd(a.W,23);a.bb=Lnd(a,15);Knd(a.bb,10);Knd(a.bb,11);Knd(a.bb,12);Knd(a.bb,13);Knd(a.bb,14);Knd(a.bb,15);Knd(a.bb,16);Qnd(a.bb,17);Pnd(a.bb);Pnd(a.bb);a.eb=Lnd(a,16);Knd(a.eb,2);Knd(a.eb,3);Knd(a.eb,4);Knd(a.eb,5);Knd(a.eb,6);Knd(a.eb,7);Qnd(a.eb,8);Qnd(a.eb,9);a.ab=Lnd(a,17);Knd(a.ab,0);Knd(a.ab,1);a.H=Lnd(a,18);Qnd(a.H,0);Qnd(a.H,1);Qnd(a.H,2);Qnd(a.H,3);Qnd(a.H,4);Qnd(a.H,5);Pnd(a.H);a.db=Lnd(a,19);Qnd(a.db,2);a.c=Mnd(a,20);a.d=Mnd(a,21);a.e=Mnd(a,22);a.f=Mnd(a,23);a.i=Mnd(a,24);a.g=Mnd(a,25);a.j=Mnd(a,26);a.k=Mnd(a,27);a.n=Mnd(a,28);a.r=Mnd(a,29);a.s=Mnd(a,30);a.t=Mnd(a,31);a.u=Mnd(a,32);a.fb=Mnd(a,33);a.A=Mnd(a,34);a.C=Mnd(a,35);a.D=Mnd(a,36);a.F=Mnd(a,37);a.G=Mnd(a,38);a.I=Mnd(a,39);a.J=Mnd(a,40);a.L=Mnd(a,41);a.M=Mnd(a,42);a.N=Mnd(a,43);a.O=Mnd(a,44);a.P=Mnd(a,45);a.X=Mnd(a,46);a.Y=Mnd(a,47);a.Z=Mnd(a,48);a.$=Mnd(a,49);a._=Mnd(a,50);a.cb=Mnd(a,51);a.K=Mnd(a,52)} +function Y9c(){Y9c=ccb;var a,b;o8c=new Lsd(sse);F9c=new Lsd(tse);q8c=(F7c(),z7c);p8c=new Nsd($pe,q8c);new Tfd;r8c=new Nsd(_le,null);s8c=new Lsd(use);x8c=(i8c(),qqb(h8c,OC(GC(r1,1),Kie,291,0,[d8c])));w8c=new Nsd(lqe,x8c);y8c=new Nsd(Zpe,(Bcb(),false));A8c=(ead(),cad);z8c=new Nsd(cqe,A8c);F8c=(Aad(),zad);E8c=new Nsd(ype,F8c);I8c=new Nsd(Jre,false);K8c=(hbd(),fbd);J8c=new Nsd(tpe,K8c);g9c=new q0b(12);f9c=new Nsd(ame,g9c);O8c=new Nsd(Ame,false);P8c=new Nsd(xqe,false);e9c=new Nsd(Dme,false);u9c=(dcd(),ccd);t9c=new Nsd(Bme,u9c);C9c=new Lsd(uqe);D9c=new Lsd(vme);E9c=new Lsd(yme);H9c=new Lsd(zme);R8c=new s7c;Q8c=new Nsd(mqe,R8c);v8c=new Nsd(pqe,false);L8c=new Nsd(qqe,false);new Lsd(vse);T8c=new H_b;S8c=new Nsd(vqe,T8c);d9c=new Nsd(Xpe,false);new Tfd;G9c=new Nsd(wse,1);new Nsd(xse,true);meb(0);new Nsd(yse,meb(100));new Nsd(zse,false);meb(0);new Nsd(Ase,meb(4000));meb(0);new Nsd(Bse,meb(400));new Nsd(Cse,false);new Nsd(Dse,false);new Nsd(Ese,true);new Nsd(Fse,false);u8c=(Ded(),Ced);t8c=new Nsd(rse,u8c);I9c=new Nsd(Lpe,10);J9c=new Nsd(Mpe,10);K9c=new Nsd(Zle,20);L9c=new Nsd(Npe,10);M9c=new Nsd(xme,2);N9c=new Nsd(Ope,10);P9c=new Nsd(Ppe,0);Q9c=new Nsd(Spe,5);R9c=new Nsd(Qpe,1);S9c=new Nsd(Rpe,1);T9c=new Nsd(wme,20);U9c=new Nsd(Tpe,10);X9c=new Nsd(Upe,10);O9c=new Lsd(Vpe);W9c=new I_b;V9c=new Nsd(wqe,W9c);j9c=new Lsd(tqe);i9c=false;h9c=new Nsd(sqe,i9c);V8c=new q0b(5);U8c=new Nsd(dqe,V8c);X8c=(Hbd(),b=BD(gdb(B1),9),new xqb(b,BD(_Bb(b,b.length),9),0));W8c=new Nsd(Gme,X8c);m9c=(Tbd(),Qbd);l9c=new Nsd(gqe,m9c);o9c=new Lsd(hqe);p9c=new Lsd(iqe);q9c=new Lsd(jqe);n9c=new Lsd(kqe);Z8c=(a=BD(gdb(I1),9),new xqb(a,BD(_Bb(a,a.length),9),0));Y8c=new Nsd(Fme,Z8c);c9c=pqb((Idd(),Bdd));b9c=new Nsd(Eme,c9c);a9c=new f7c(0,0);_8c=new Nsd(Tme,a9c);$8c=new Nsd(bqe,false);D8c=(qad(),nad);C8c=new Nsd(nqe,D8c);B8c=new Nsd(Cme,false);new Lsd(Gse);meb(1);new Nsd(Hse,null);r9c=new Lsd(rqe);v9c=new Lsd(oqe);B9c=(Ucd(),Scd);A9c=new Nsd(Ype,B9c);s9c=new Lsd(Wpe);y9c=(rcd(),pqb(pcd));x9c=new Nsd(Hme,y9c);w9c=new Nsd(eqe,false);z9c=new Nsd(fqe,true);M8c=new Nsd(_pe,false);N8c=new Nsd(aqe,false);G8c=new Nsd($le,1);H8c=(Mad(),Kad);new Nsd(Ise,H8c);k9c=true} +function wtc(){wtc=ccb;var a,b;$sc=new Lsd(Ime);xsc=new Lsd('coordinateOrigin');itc=new Lsd('processors');wsc=new Msd('compoundNode',(Bcb(),false));Nsc=new Msd('insideConnections',false);_sc=new Lsd('originalBendpoints');atc=new Lsd('originalDummyNodePosition');btc=new Lsd('originalLabelEdge');ktc=new Lsd('representedLabels');Csc=new Lsd('endLabels');Dsc=new Lsd('endLabel.origin');Ssc=new Msd('labelSide',(rbd(),qbd));Ysc=new Msd('maxEdgeThickness',0);ltc=new Msd('reversed',false);jtc=new Lsd(Jme);Vsc=new Msd('longEdgeSource',null);Wsc=new Msd('longEdgeTarget',null);Usc=new Msd('longEdgeHasLabelDummies',false);Tsc=new Msd('longEdgeBeforeLabelDummy',false);Bsc=new Msd('edgeConstraint',(Gqc(),Eqc));Psc=new Lsd('inLayerLayoutUnit');Osc=new Msd('inLayerConstraint',(esc(),csc));Qsc=new Msd('inLayerSuccessorConstraint',new Rkb);Rsc=new Msd('inLayerSuccessorConstraintBetweenNonDummies',false);gtc=new Lsd('portDummy');ysc=new Msd('crossingHint',meb(0));Ksc=new Msd('graphProperties',(b=BD(gdb(PW),9),new xqb(b,BD(_Bb(b,b.length),9),0)));Hsc=new Msd('externalPortSide',(Ucd(),Scd));Isc=new Msd('externalPortSize',new d7c);Fsc=new Lsd('externalPortReplacedDummies');Gsc=new Lsd('externalPortReplacedDummy');Esc=new Msd('externalPortConnections',(a=BD(gdb(F1),9),new xqb(a,BD(_Bb(a,a.length),9),0)));htc=new Msd(tle,0);ssc=new Lsd('barycenterAssociates');vtc=new Lsd('TopSideComments');tsc=new Lsd('BottomSideComments');vsc=new Lsd('CommentConnectionPort');Msc=new Msd('inputCollect',false);etc=new Msd('outputCollect',false);Asc=new Msd('cyclic',false);zsc=new Lsd('crossHierarchyMap');utc=new Lsd('targetOffset');new Msd('splineLabelSize',new d7c);otc=new Lsd('spacings');ftc=new Msd('partitionConstraint',false);usc=new Lsd('breakingPoint.info');stc=new Lsd('splines.survivingEdge');rtc=new Lsd('splines.route.start');ptc=new Lsd('splines.edgeChain');dtc=new Lsd('originalPortConstraints');ntc=new Lsd('selfLoopHolder');qtc=new Lsd('splines.nsPortY');Zsc=new Lsd('modelOrder');Xsc=new Lsd('longEdgeTargetNode');Jsc=new Msd(Xne,false);mtc=new Msd(Xne,false);Lsc=new Lsd('layerConstraints.hiddenNodes');ctc=new Lsd('layerConstraints.opposidePort');ttc=new Lsd('targetNode.modelOrder')} +function jwc(){jwc=ccb;puc=(xqc(),vqc);ouc=new Nsd(Yne,puc);Guc=new Nsd(Zne,(Bcb(),false));Muc=(msc(),ksc);Luc=new Nsd($ne,Muc);cvc=new Nsd(_ne,false);dvc=new Nsd(aoe,true);Itc=new Nsd(boe,false);xvc=(BAc(),zAc);wvc=new Nsd(coe,xvc);meb(1);Fvc=new Nsd(doe,meb(7));Gvc=new Nsd(eoe,false);Huc=new Nsd(foe,false);nuc=(mqc(),iqc);muc=new Nsd(goe,nuc);bvc=(lzc(),jzc);avc=new Nsd(hoe,bvc);Tuc=(Ctc(),Btc);Suc=new Nsd(ioe,Tuc);meb(-1);Ruc=new Nsd(joe,meb(-1));meb(-1);Uuc=new Nsd(koe,meb(-1));meb(-1);Vuc=new Nsd(loe,meb(4));meb(-1);Xuc=new Nsd(moe,meb(2));_uc=(kAc(),iAc);$uc=new Nsd(noe,_uc);meb(0);Zuc=new Nsd(ooe,meb(0));Puc=new Nsd(poe,meb(Ohe));luc=(Rpc(),Ppc);kuc=new Nsd(qoe,luc);Xtc=new Nsd(roe,false);euc=new Nsd(soe,0.1);iuc=new Nsd(toe,false);meb(-1);guc=new Nsd(uoe,meb(-1));meb(-1);huc=new Nsd(voe,meb(-1));meb(0);Ytc=new Nsd(woe,meb(40));cuc=(Xrc(),Wrc);buc=new Nsd(xoe,cuc);$tc=Urc;Ztc=new Nsd(yoe,$tc);vvc=(Vzc(),Qzc);uvc=new Nsd(zoe,vvc);kvc=new Lsd(Aoe);fvc=(_qc(),Zqc);evc=new Nsd(Boe,fvc);ivc=(lrc(),irc);hvc=new Nsd(Coe,ivc);new Tfd;nvc=new Nsd(Doe,0.3);pvc=new Lsd(Eoe);rvc=(Izc(),Gzc);qvc=new Nsd(Foe,rvc);xuc=(TAc(),RAc);wuc=new Nsd(Goe,xuc);zuc=(_Ac(),$Ac);yuc=new Nsd(Hoe,zuc);Buc=(tBc(),sBc);Auc=new Nsd(Ioe,Buc);Duc=new Nsd(Joe,0.2);uuc=new Nsd(Koe,2);Bvc=new Nsd(Loe,null);Dvc=new Nsd(Moe,10);Cvc=new Nsd(Noe,10);Evc=new Nsd(Ooe,20);meb(0);yvc=new Nsd(Poe,meb(0));meb(0);zvc=new Nsd(Qoe,meb(0));meb(0);Avc=new Nsd(Roe,meb(0));Jtc=new Nsd(Soe,false);Ntc=(yrc(),wrc);Mtc=new Nsd(Toe,Ntc);Ltc=(Ipc(),Hpc);Ktc=new Nsd(Uoe,Ltc);Juc=new Nsd(Voe,false);meb(0);Iuc=new Nsd(Woe,meb(16));meb(0);Kuc=new Nsd(Xoe,meb(5));bwc=(LBc(),JBc);awc=new Nsd(Yoe,bwc);Hvc=new Nsd(Zoe,10);Kvc=new Nsd($oe,1);Tvc=(bqc(),aqc);Svc=new Nsd(_oe,Tvc);Nvc=new Lsd(ape);Qvc=meb(1);meb(0);Pvc=new Nsd(bpe,Qvc);gwc=(CBc(),zBc);fwc=new Nsd(cpe,gwc);cwc=new Lsd(dpe);Yvc=new Nsd(epe,true);Wvc=new Nsd(fpe,2);$vc=new Nsd(gpe,true);tuc=(Sqc(),Qqc);suc=new Nsd(hpe,tuc);ruc=(Apc(),wpc);quc=new Nsd(ipe,ruc);Wtc=(tAc(),rAc);Vtc=new Nsd(jpe,Wtc);Utc=new Nsd(kpe,false);Ptc=(RXb(),QXb);Otc=new Nsd(lpe,Ptc);Ttc=(xzc(),uzc);Stc=new Nsd(mpe,Ttc);Qtc=new Nsd(npe,0);Rtc=new Nsd(ope,0);Ouc=kqc;Nuc=Opc;Wuc=izc;Yuc=izc;Quc=fzc;fuc=(hbd(),ebd);juc=Ppc;duc=Ppc;_tc=Ppc;auc=ebd;lvc=Tzc;mvc=Qzc;gvc=Qzc;jvc=Qzc;ovc=Szc;tvc=Tzc;svc=Tzc;Cuc=(Aad(),yad);Euc=yad;Fuc=sBc;vuc=xad;Ivc=KBc;Jvc=IBc;Lvc=KBc;Mvc=IBc;Uvc=KBc;Vvc=IBc;Ovc=_pc;Rvc=aqc;hwc=KBc;iwc=IBc;dwc=KBc;ewc=IBc;Zvc=IBc;Xvc=IBc;_vc=IBc} +function S8b(){S8b=ccb;Y7b=new T8b('DIRECTION_PREPROCESSOR',0);V7b=new T8b('COMMENT_PREPROCESSOR',1);Z7b=new T8b('EDGE_AND_LAYER_CONSTRAINT_EDGE_REVERSER',2);n8b=new T8b('INTERACTIVE_EXTERNAL_PORT_POSITIONER',3);G8b=new T8b('PARTITION_PREPROCESSOR',4);r8b=new T8b('LABEL_DUMMY_INSERTER',5);M8b=new T8b('SELF_LOOP_PREPROCESSOR',6);w8b=new T8b('LAYER_CONSTRAINT_PREPROCESSOR',7);E8b=new T8b('PARTITION_MIDPROCESSOR',8);i8b=new T8b('HIGH_DEGREE_NODE_LAYER_PROCESSOR',9);A8b=new T8b('NODE_PROMOTION',10);v8b=new T8b('LAYER_CONSTRAINT_POSTPROCESSOR',11);F8b=new T8b('PARTITION_POSTPROCESSOR',12);e8b=new T8b('HIERARCHICAL_PORT_CONSTRAINT_PROCESSOR',13);O8b=new T8b('SEMI_INTERACTIVE_CROSSMIN_PROCESSOR',14);P7b=new T8b('BREAKING_POINT_INSERTER',15);z8b=new T8b('LONG_EDGE_SPLITTER',16);I8b=new T8b('PORT_SIDE_PROCESSOR',17);o8b=new T8b('INVERTED_PORT_PROCESSOR',18);H8b=new T8b('PORT_LIST_SORTER',19);Q8b=new T8b('SORT_BY_INPUT_ORDER_OF_MODEL',20);C8b=new T8b('NORTH_SOUTH_PORT_PREPROCESSOR',21);Q7b=new T8b('BREAKING_POINT_PROCESSOR',22);D8b=new T8b(Bne,23);R8b=new T8b(Cne,24);K8b=new T8b('SELF_LOOP_PORT_RESTORER',25);P8b=new T8b('SINGLE_EDGE_GRAPH_WRAPPER',26);p8b=new T8b('IN_LAYER_CONSTRAINT_PROCESSOR',27);b8b=new T8b('END_NODE_PORT_LABEL_MANAGEMENT_PROCESSOR',28);q8b=new T8b('LABEL_AND_NODE_SIZE_PROCESSOR',29);m8b=new T8b('INNERMOST_NODE_MARGIN_CALCULATOR',30);N8b=new T8b('SELF_LOOP_ROUTER',31);T7b=new T8b('COMMENT_NODE_MARGIN_CALCULATOR',32);_7b=new T8b('END_LABEL_PREPROCESSOR',33);t8b=new T8b('LABEL_DUMMY_SWITCHER',34);S7b=new T8b('CENTER_LABEL_MANAGEMENT_PROCESSOR',35);u8b=new T8b('LABEL_SIDE_SELECTOR',36);k8b=new T8b('HYPEREDGE_DUMMY_MERGER',37);f8b=new T8b('HIERARCHICAL_PORT_DUMMY_SIZE_PROCESSOR',38);x8b=new T8b('LAYER_SIZE_AND_GRAPH_HEIGHT_CALCULATOR',39);h8b=new T8b('HIERARCHICAL_PORT_POSITION_PROCESSOR',40);W7b=new T8b('CONSTRAINTS_POSTPROCESSOR',41);U7b=new T8b('COMMENT_POSTPROCESSOR',42);l8b=new T8b('HYPERNODE_PROCESSOR',43);g8b=new T8b('HIERARCHICAL_PORT_ORTHOGONAL_EDGE_ROUTER',44);y8b=new T8b('LONG_EDGE_JOINER',45);L8b=new T8b('SELF_LOOP_POSTPROCESSOR',46);R7b=new T8b('BREAKING_POINT_REMOVER',47);B8b=new T8b('NORTH_SOUTH_PORT_POSTPROCESSOR',48);j8b=new T8b('HORIZONTAL_COMPACTOR',49);s8b=new T8b('LABEL_DUMMY_REMOVER',50);c8b=new T8b('FINAL_SPLINE_BENDPOINTS_CALCULATOR',51);a8b=new T8b('END_LABEL_SORTER',52);J8b=new T8b('REVERSED_EDGE_RESTORER',53);$7b=new T8b('END_LABEL_POSTPROCESSOR',54);d8b=new T8b('HIERARCHICAL_NODE_RESIZER',55);X7b=new T8b('DIRECTION_POSTPROCESSOR',56)} +function KIc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,ab,bb,cb,db,eb,fb,gb,hb,ib,jb,kb,lb;cb=0;for(H=b,K=0,N=H.length;K0&&(a.a[U.p]=cb++)}}hb=0;for(I=c,L=0,O=I.length;L0){U=(sCb(Y.b>0),BD(Y.a.Xb(Y.c=--Y.b),11));X=0;for(h=new olb(U.e);h.a0){if(U.j==(Ucd(),Acd)){a.a[U.p]=hb;++hb}else{a.a[U.p]=hb+P+R;++R}}}hb+=R}W=new Lqb;o=new zsb;for(G=b,J=0,M=G.length;Jj.b&&(j.b=Z)}else if(U.i.c==bb){Zj.c&&(j.c=Z)}}}Klb(p,0,p.length,null);gb=KC(WD,oje,25,p.length,15,1);d=KC(WD,oje,25,hb+1,15,1);for(r=0;r0){A%2>0&&(e+=kb[A+1]);A=(A-1)/2|0;++kb[A]}}C=KC(nY,Uhe,362,p.length*2,0,1);for(u=0;u'?":dfb(wue,a)?"'(?<' or '(? toIndex: ',zke=', toIndex: ',Ake='Index: ',Bke=', Size: ',Cke='org.eclipse.elk.alg.common',Dke={62:1},Eke='org.eclipse.elk.alg.common.compaction',Fke='Scanline/EventHandler',Gke='org.eclipse.elk.alg.common.compaction.oned',Hke='CNode belongs to another CGroup.',Ike='ISpacingsHandler/1',Jke='The ',Kke=' instance has been finished already.',Lke='The direction ',Mke=' is not supported by the CGraph instance.',Nke='OneDimensionalCompactor',Oke='OneDimensionalCompactor/lambda$0$Type',Pke='Quadruplet',Qke='ScanlineConstraintCalculator',Rke='ScanlineConstraintCalculator/ConstraintsScanlineHandler',Ske='ScanlineConstraintCalculator/ConstraintsScanlineHandler/lambda$0$Type',Tke='ScanlineConstraintCalculator/Timestamp',Uke='ScanlineConstraintCalculator/lambda$0$Type',Vke={169:1,45:1},Wke='org.eclipse.elk.alg.common.compaction.options',Xke='org.eclipse.elk.core.data',Yke='org.eclipse.elk.polyomino.traversalStrategy',Zke='org.eclipse.elk.polyomino.lowLevelSort',$ke='org.eclipse.elk.polyomino.highLevelSort',_ke='org.eclipse.elk.polyomino.fill',ale={130:1},ble='polyomino',cle='org.eclipse.elk.alg.common.networksimplex',dle={177:1,3:1,4:1},ele='org.eclipse.elk.alg.common.nodespacing',fle='org.eclipse.elk.alg.common.nodespacing.cellsystem',gle='CENTER',hle={212:1,326:1},ile={3:1,4:1,5:1,595:1},jle='LEFT',kle='RIGHT',lle='Vertical alignment cannot be null',mle='BOTTOM',nle='org.eclipse.elk.alg.common.nodespacing.internal',ole='UNDEFINED',ple=0.01,qle='org.eclipse.elk.alg.common.nodespacing.internal.algorithm',rle='LabelPlacer/lambda$0$Type',sle='LabelPlacer/lambda$1$Type',tle='portRatioOrPosition',ule='org.eclipse.elk.alg.common.overlaps',vle='DOWN',wle='org.eclipse.elk.alg.common.polyomino',xle='NORTH',yle='EAST',zle='SOUTH',Ale='WEST',Ble='org.eclipse.elk.alg.common.polyomino.structures',Cle='Direction',Dle='Grid is only of size ',Ele='. Requested point (',Fle=') is out of bounds.',Gle=' Given center based coordinates were (',Hle='org.eclipse.elk.graph.properties',Ile='IPropertyHolder',Jle={3:1,94:1,134:1},Kle='org.eclipse.elk.alg.common.spore',Lle='org.eclipse.elk.alg.common.utils',Mle={209:1},Nle='org.eclipse.elk.core',Ole='Connected Components Compaction',Ple='org.eclipse.elk.alg.disco',Qle='org.eclipse.elk.alg.disco.graph',Rle='org.eclipse.elk.alg.disco.options',Sle='CompactionStrategy',Tle='org.eclipse.elk.disco.componentCompaction.strategy',Ule='org.eclipse.elk.disco.componentCompaction.componentLayoutAlgorithm',Vle='org.eclipse.elk.disco.debug.discoGraph',Wle='org.eclipse.elk.disco.debug.discoPolys',Xle='componentCompaction',Yle='org.eclipse.elk.disco',Zle='org.eclipse.elk.spacing.componentComponent',$le='org.eclipse.elk.edge.thickness',_le='org.eclipse.elk.aspectRatio',ame='org.eclipse.elk.padding',bme='org.eclipse.elk.alg.disco.transform',cme=1.5707963267948966,dme=1.7976931348623157E308,eme={3:1,4:1,5:1,192:1},fme={3:1,6:1,4:1,5:1,106:1,120:1},gme='org.eclipse.elk.alg.force',hme='ComponentsProcessor',ime='ComponentsProcessor/1',jme='org.eclipse.elk.alg.force.graph',kme='Component Layout',lme='org.eclipse.elk.alg.force.model',mme='org.eclipse.elk.force.model',nme='org.eclipse.elk.force.iterations',ome='org.eclipse.elk.force.repulsivePower',pme='org.eclipse.elk.force.temperature',qme=0.001,rme='org.eclipse.elk.force.repulsion',sme='org.eclipse.elk.alg.force.options',tme=1.600000023841858,ume='org.eclipse.elk.force',vme='org.eclipse.elk.priority',wme='org.eclipse.elk.spacing.nodeNode',xme='org.eclipse.elk.spacing.edgeLabel',yme='org.eclipse.elk.randomSeed',zme='org.eclipse.elk.separateConnectedComponents',Ame='org.eclipse.elk.interactive',Bme='org.eclipse.elk.portConstraints',Cme='org.eclipse.elk.edgeLabels.inline',Dme='org.eclipse.elk.omitNodeMicroLayout',Eme='org.eclipse.elk.nodeSize.options',Fme='org.eclipse.elk.nodeSize.constraints',Gme='org.eclipse.elk.nodeLabels.placement',Hme='org.eclipse.elk.portLabels.placement',Ime='origin',Jme='random',Kme='boundingBox.upLeft',Lme='boundingBox.lowRight',Mme='org.eclipse.elk.stress.fixed',Nme='org.eclipse.elk.stress.desiredEdgeLength',Ome='org.eclipse.elk.stress.dimension',Pme='org.eclipse.elk.stress.epsilon',Qme='org.eclipse.elk.stress.iterationLimit',Rme='org.eclipse.elk.stress',Sme='ELK Stress',Tme='org.eclipse.elk.nodeSize.minimum',Ume='org.eclipse.elk.alg.force.stress',Vme='Layered layout',Wme='org.eclipse.elk.alg.layered',Xme='org.eclipse.elk.alg.layered.compaction.components',Yme='org.eclipse.elk.alg.layered.compaction.oned',Zme='org.eclipse.elk.alg.layered.compaction.oned.algs',$me='org.eclipse.elk.alg.layered.compaction.recthull',_me='org.eclipse.elk.alg.layered.components',ane='NONE',bne={3:1,6:1,4:1,9:1,5:1,122:1},cne={3:1,6:1,4:1,5:1,141:1,106:1,120:1},dne='org.eclipse.elk.alg.layered.compound',ene={51:1},fne='org.eclipse.elk.alg.layered.graph',gne=' -> ',hne='Not supported by LGraph',ine='Port side is undefined',jne={3:1,6:1,4:1,5:1,474:1,141:1,106:1,120:1},kne={3:1,6:1,4:1,5:1,141:1,193:1,203:1,106:1,120:1},lne={3:1,6:1,4:1,5:1,141:1,1943:1,203:1,106:1,120:1},mne='([{"\' \t\r\n',nne=')]}"\' \t\r\n',one='The given string contains parts that cannot be parsed as numbers.',pne='org.eclipse.elk.core.math',qne={3:1,4:1,142:1,207:1,414:1},rne={3:1,4:1,116:1,207:1,414:1},sne='org.eclipse.elk.layered',tne='org.eclipse.elk.alg.layered.graph.transform',une='ElkGraphImporter',vne='ElkGraphImporter/lambda$0$Type',wne='ElkGraphImporter/lambda$1$Type',xne='ElkGraphImporter/lambda$2$Type',yne='ElkGraphImporter/lambda$4$Type',zne='Node margin calculation',Ane='org.eclipse.elk.alg.layered.intermediate',Bne='ONE_SIDED_GREEDY_SWITCH',Cne='TWO_SIDED_GREEDY_SWITCH',Dne='No implementation is available for the layout processor ',Ene='IntermediateProcessorStrategy',Fne="Node '",Gne='FIRST_SEPARATE',Hne='LAST_SEPARATE',Ine='Odd port side processing',Jne='org.eclipse.elk.alg.layered.intermediate.compaction',Kne='org.eclipse.elk.alg.layered.intermediate.greedyswitch',Lne='org.eclipse.elk.alg.layered.p3order.counting',Mne={225:1},Nne='org.eclipse.elk.alg.layered.intermediate.loops',One='org.eclipse.elk.alg.layered.intermediate.loops.ordering',Pne='org.eclipse.elk.alg.layered.intermediate.loops.routing',Qne='org.eclipse.elk.alg.layered.intermediate.preserveorder',Rne='org.eclipse.elk.alg.layered.intermediate.wrapping',Sne='org.eclipse.elk.alg.layered.options',Tne='INTERACTIVE',Une='DEPTH_FIRST',Vne='EDGE_LENGTH',Wne='SELF_LOOPS',Xne='firstTryWithInitialOrder',Yne='org.eclipse.elk.layered.directionCongruency',Zne='org.eclipse.elk.layered.feedbackEdges',$ne='org.eclipse.elk.layered.interactiveReferencePoint',_ne='org.eclipse.elk.layered.mergeEdges',aoe='org.eclipse.elk.layered.mergeHierarchyEdges',boe='org.eclipse.elk.layered.allowNonFlowPortsToSwitchSides',coe='org.eclipse.elk.layered.portSortingStrategy',doe='org.eclipse.elk.layered.thoroughness',eoe='org.eclipse.elk.layered.unnecessaryBendpoints',foe='org.eclipse.elk.layered.generatePositionAndLayerIds',goe='org.eclipse.elk.layered.cycleBreaking.strategy',hoe='org.eclipse.elk.layered.layering.strategy',ioe='org.eclipse.elk.layered.layering.layerConstraint',joe='org.eclipse.elk.layered.layering.layerChoiceConstraint',koe='org.eclipse.elk.layered.layering.layerId',loe='org.eclipse.elk.layered.layering.minWidth.upperBoundOnWidth',moe='org.eclipse.elk.layered.layering.minWidth.upperLayerEstimationScalingFactor',noe='org.eclipse.elk.layered.layering.nodePromotion.strategy',ooe='org.eclipse.elk.layered.layering.nodePromotion.maxIterations',poe='org.eclipse.elk.layered.layering.coffmanGraham.layerBound',qoe='org.eclipse.elk.layered.crossingMinimization.strategy',roe='org.eclipse.elk.layered.crossingMinimization.forceNodeModelOrder',soe='org.eclipse.elk.layered.crossingMinimization.hierarchicalSweepiness',toe='org.eclipse.elk.layered.crossingMinimization.semiInteractive',uoe='org.eclipse.elk.layered.crossingMinimization.positionChoiceConstraint',voe='org.eclipse.elk.layered.crossingMinimization.positionId',woe='org.eclipse.elk.layered.crossingMinimization.greedySwitch.activationThreshold',xoe='org.eclipse.elk.layered.crossingMinimization.greedySwitch.type',yoe='org.eclipse.elk.layered.crossingMinimization.greedySwitchHierarchical.type',zoe='org.eclipse.elk.layered.nodePlacement.strategy',Aoe='org.eclipse.elk.layered.nodePlacement.favorStraightEdges',Boe='org.eclipse.elk.layered.nodePlacement.bk.edgeStraightening',Coe='org.eclipse.elk.layered.nodePlacement.bk.fixedAlignment',Doe='org.eclipse.elk.layered.nodePlacement.linearSegments.deflectionDampening',Eoe='org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility',Foe='org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility.default',Goe='org.eclipse.elk.layered.edgeRouting.selfLoopDistribution',Hoe='org.eclipse.elk.layered.edgeRouting.selfLoopOrdering',Ioe='org.eclipse.elk.layered.edgeRouting.splines.mode',Joe='org.eclipse.elk.layered.edgeRouting.splines.sloppy.layerSpacingFactor',Koe='org.eclipse.elk.layered.edgeRouting.polyline.slopedEdgeZoneWidth',Loe='org.eclipse.elk.layered.spacing.baseValue',Moe='org.eclipse.elk.layered.spacing.edgeNodeBetweenLayers',Noe='org.eclipse.elk.layered.spacing.edgeEdgeBetweenLayers',Ooe='org.eclipse.elk.layered.spacing.nodeNodeBetweenLayers',Poe='org.eclipse.elk.layered.priority.direction',Qoe='org.eclipse.elk.layered.priority.shortness',Roe='org.eclipse.elk.layered.priority.straightness',Soe='org.eclipse.elk.layered.compaction.connectedComponents',Toe='org.eclipse.elk.layered.compaction.postCompaction.strategy',Uoe='org.eclipse.elk.layered.compaction.postCompaction.constraints',Voe='org.eclipse.elk.layered.highDegreeNodes.treatment',Woe='org.eclipse.elk.layered.highDegreeNodes.threshold',Xoe='org.eclipse.elk.layered.highDegreeNodes.treeHeight',Yoe='org.eclipse.elk.layered.wrapping.strategy',Zoe='org.eclipse.elk.layered.wrapping.additionalEdgeSpacing',$oe='org.eclipse.elk.layered.wrapping.correctionFactor',_oe='org.eclipse.elk.layered.wrapping.cutting.strategy',ape='org.eclipse.elk.layered.wrapping.cutting.cuts',bpe='org.eclipse.elk.layered.wrapping.cutting.msd.freedom',cpe='org.eclipse.elk.layered.wrapping.validify.strategy',dpe='org.eclipse.elk.layered.wrapping.validify.forbiddenIndices',epe='org.eclipse.elk.layered.wrapping.multiEdge.improveCuts',fpe='org.eclipse.elk.layered.wrapping.multiEdge.distancePenalty',gpe='org.eclipse.elk.layered.wrapping.multiEdge.improveWrappedEdges',hpe='org.eclipse.elk.layered.edgeLabels.sideSelection',ipe='org.eclipse.elk.layered.edgeLabels.centerLabelPlacementStrategy',jpe='org.eclipse.elk.layered.considerModelOrder.strategy',kpe='org.eclipse.elk.layered.considerModelOrder.noModelOrder',lpe='org.eclipse.elk.layered.considerModelOrder.components',mpe='org.eclipse.elk.layered.considerModelOrder.longEdgeStrategy',npe='org.eclipse.elk.layered.considerModelOrder.crossingCounterNodeInfluence',ope='org.eclipse.elk.layered.considerModelOrder.crossingCounterPortInfluence',ppe='layering',qpe='layering.minWidth',rpe='layering.nodePromotion',spe='crossingMinimization',tpe='org.eclipse.elk.hierarchyHandling',upe='crossingMinimization.greedySwitch',vpe='nodePlacement',wpe='nodePlacement.bk',xpe='edgeRouting',ype='org.eclipse.elk.edgeRouting',zpe='spacing',Ape='priority',Bpe='compaction',Cpe='compaction.postCompaction',Dpe='Specifies whether and how post-process compaction is applied.',Epe='highDegreeNodes',Fpe='wrapping',Gpe='wrapping.cutting',Hpe='wrapping.validify',Ipe='wrapping.multiEdge',Jpe='edgeLabels',Kpe='considerModelOrder',Lpe='org.eclipse.elk.spacing.commentComment',Mpe='org.eclipse.elk.spacing.commentNode',Npe='org.eclipse.elk.spacing.edgeEdge',Ope='org.eclipse.elk.spacing.edgeNode',Ppe='org.eclipse.elk.spacing.labelLabel',Qpe='org.eclipse.elk.spacing.labelPortHorizontal',Rpe='org.eclipse.elk.spacing.labelPortVertical',Spe='org.eclipse.elk.spacing.labelNode',Tpe='org.eclipse.elk.spacing.nodeSelfLoop',Upe='org.eclipse.elk.spacing.portPort',Vpe='org.eclipse.elk.spacing.individual',Wpe='org.eclipse.elk.port.borderOffset',Xpe='org.eclipse.elk.noLayout',Ype='org.eclipse.elk.port.side',Zpe='org.eclipse.elk.debugMode',$pe='org.eclipse.elk.alignment',_pe='org.eclipse.elk.insideSelfLoops.activate',aqe='org.eclipse.elk.insideSelfLoops.yo',bqe='org.eclipse.elk.nodeSize.fixedGraphSize',cqe='org.eclipse.elk.direction',dqe='org.eclipse.elk.nodeLabels.padding',eqe='org.eclipse.elk.portLabels.nextToPortIfPossible',fqe='org.eclipse.elk.portLabels.treatAsGroup',gqe='org.eclipse.elk.portAlignment.default',hqe='org.eclipse.elk.portAlignment.north',iqe='org.eclipse.elk.portAlignment.south',jqe='org.eclipse.elk.portAlignment.west',kqe='org.eclipse.elk.portAlignment.east',lqe='org.eclipse.elk.contentAlignment',mqe='org.eclipse.elk.junctionPoints',nqe='org.eclipse.elk.edgeLabels.placement',oqe='org.eclipse.elk.port.index',pqe='org.eclipse.elk.commentBox',qqe='org.eclipse.elk.hypernode',rqe='org.eclipse.elk.port.anchor',sqe='org.eclipse.elk.partitioning.activate',tqe='org.eclipse.elk.partitioning.partition',uqe='org.eclipse.elk.position',vqe='org.eclipse.elk.margins',wqe='org.eclipse.elk.spacing.portsSurrounding',xqe='org.eclipse.elk.interactiveLayout',yqe='org.eclipse.elk.core.util',zqe={3:1,4:1,5:1,593:1},Aqe='NETWORK_SIMPLEX',Bqe={123:1,51:1},Cqe='org.eclipse.elk.alg.layered.p1cycles',Dqe='org.eclipse.elk.alg.layered.p2layers',Eqe={402:1,225:1},Fqe={832:1,3:1,4:1},Gqe='org.eclipse.elk.alg.layered.p3order',Hqe='org.eclipse.elk.alg.layered.p4nodes',Iqe={3:1,4:1,5:1,840:1},Jqe=1.0E-5,Kqe='org.eclipse.elk.alg.layered.p4nodes.bk',Lqe='org.eclipse.elk.alg.layered.p5edges',Mqe='org.eclipse.elk.alg.layered.p5edges.orthogonal',Nqe='org.eclipse.elk.alg.layered.p5edges.orthogonal.direction',Oqe=1.0E-6,Pqe='org.eclipse.elk.alg.layered.p5edges.splines',Qqe=0.09999999999999998,Rqe=1.0E-8,Sqe=4.71238898038469,Tqe=3.141592653589793,Uqe='org.eclipse.elk.alg.mrtree',Vqe='org.eclipse.elk.alg.mrtree.graph',Wqe='org.eclipse.elk.alg.mrtree.intermediate',Xqe='Set neighbors in level',Yqe='DESCENDANTS',Zqe='org.eclipse.elk.mrtree.weighting',$qe='org.eclipse.elk.mrtree.searchOrder',_qe='org.eclipse.elk.alg.mrtree.options',are='org.eclipse.elk.mrtree',bre='org.eclipse.elk.tree',cre='org.eclipse.elk.alg.radial',dre=6.283185307179586,ere=4.9E-324,fre='org.eclipse.elk.alg.radial.intermediate',gre='org.eclipse.elk.alg.radial.intermediate.compaction',hre={3:1,4:1,5:1,106:1},ire='org.eclipse.elk.alg.radial.intermediate.optimization',jre='No implementation is available for the layout option ',kre='org.eclipse.elk.alg.radial.options',lre='org.eclipse.elk.radial.orderId',mre='org.eclipse.elk.radial.radius',nre='org.eclipse.elk.radial.compactor',ore='org.eclipse.elk.radial.compactionStepSize',pre='org.eclipse.elk.radial.sorter',qre='org.eclipse.elk.radial.wedgeCriteria',rre='org.eclipse.elk.radial.optimizationCriteria',sre='org.eclipse.elk.radial',tre='org.eclipse.elk.alg.radial.p1position.wedge',ure='org.eclipse.elk.alg.radial.sorting',vre=5.497787143782138,wre=3.9269908169872414,xre=2.356194490192345,yre='org.eclipse.elk.alg.rectpacking',zre='org.eclipse.elk.alg.rectpacking.firstiteration',Are='org.eclipse.elk.alg.rectpacking.options',Bre='org.eclipse.elk.rectpacking.optimizationGoal',Cre='org.eclipse.elk.rectpacking.lastPlaceShift',Dre='org.eclipse.elk.rectpacking.currentPosition',Ere='org.eclipse.elk.rectpacking.desiredPosition',Fre='org.eclipse.elk.rectpacking.onlyFirstIteration',Gre='org.eclipse.elk.rectpacking.rowCompaction',Hre='org.eclipse.elk.rectpacking.expandToAspectRatio',Ire='org.eclipse.elk.rectpacking.targetWidth',Jre='org.eclipse.elk.expandNodes',Kre='org.eclipse.elk.rectpacking',Lre='org.eclipse.elk.alg.rectpacking.util',Mre='No implementation available for ',Nre='org.eclipse.elk.alg.spore',Ore='org.eclipse.elk.alg.spore.options',Pre='org.eclipse.elk.sporeCompaction',Qre='org.eclipse.elk.underlyingLayoutAlgorithm',Rre='org.eclipse.elk.processingOrder.treeConstruction',Sre='org.eclipse.elk.processingOrder.spanningTreeCostFunction',Tre='org.eclipse.elk.processingOrder.preferredRoot',Ure='org.eclipse.elk.processingOrder.rootSelection',Vre='org.eclipse.elk.structure.structureExtractionStrategy',Wre='org.eclipse.elk.compaction.compactionStrategy',Xre='org.eclipse.elk.compaction.orthogonal',Yre='org.eclipse.elk.overlapRemoval.maxIterations',Zre='org.eclipse.elk.overlapRemoval.runScanline',$re='processingOrder',_re='overlapRemoval',ase='org.eclipse.elk.sporeOverlap',bse='org.eclipse.elk.alg.spore.p1structure',cse='org.eclipse.elk.alg.spore.p2processingorder',dse='org.eclipse.elk.alg.spore.p3execution',ese='Invalid index: ',fse='org.eclipse.elk.core.alg',gse={331:1},hse={288:1},ise='Make sure its type is registered with the ',jse=' utility class.',kse='true',lse='false',mse="Couldn't clone property '",nse=0.05,ose='org.eclipse.elk.core.options',pse=1.2999999523162842,qse='org.eclipse.elk.box',rse='org.eclipse.elk.box.packingMode',sse='org.eclipse.elk.algorithm',tse='org.eclipse.elk.resolvedAlgorithm',use='org.eclipse.elk.bendPoints',vse='org.eclipse.elk.labelManager',wse='org.eclipse.elk.scaleFactor',xse='org.eclipse.elk.animate',yse='org.eclipse.elk.animTimeFactor',zse='org.eclipse.elk.layoutAncestors',Ase='org.eclipse.elk.maxAnimTime',Bse='org.eclipse.elk.minAnimTime',Cse='org.eclipse.elk.progressBar',Dse='org.eclipse.elk.validateGraph',Ese='org.eclipse.elk.validateOptions',Fse='org.eclipse.elk.zoomToFit',Gse='org.eclipse.elk.font.name',Hse='org.eclipse.elk.font.size',Ise='org.eclipse.elk.edge.type',Jse='partitioning',Kse='nodeLabels',Lse='portAlignment',Mse='nodeSize',Nse='port',Ose='portLabels',Pse='insideSelfLoops',Qse='org.eclipse.elk.fixed',Rse='org.eclipse.elk.random',Sse='port must have a parent node to calculate the port side',Tse='The edge needs to have exactly one edge section. Found: ',Use='org.eclipse.elk.core.util.adapters',Vse='org.eclipse.emf.ecore',Wse='org.eclipse.elk.graph',Xse='EMapPropertyHolder',Yse='ElkBendPoint',Zse='ElkGraphElement',$se='ElkConnectableShape',_se='ElkEdge',ate='ElkEdgeSection',bte='EModelElement',cte='ENamedElement',dte='ElkLabel',ete='ElkNode',fte='ElkPort',gte={92:1,90:1},hte='org.eclipse.emf.common.notify.impl',ite="The feature '",jte="' is not a valid changeable feature",kte='Expecting null',lte="' is not a valid feature",mte='The feature ID',nte=' is not a valid feature ID',ote=32768,pte={105:1,92:1,90:1,56:1,49:1,97:1},qte='org.eclipse.emf.ecore.impl',rte='org.eclipse.elk.graph.impl',ste='Recursive containment not allowed for ',tte="The datatype '",ute="' is not a valid classifier",vte="The value '",wte={190:1,3:1,4:1},xte="The class '",yte='http://www.eclipse.org/elk/ElkGraph',zte=1024,Ate='property',Bte='value',Cte='source',Dte='properties',Ete='identifier',Fte='height',Gte='width',Hte='parent',Ite='text',Jte='children',Kte='hierarchical',Lte='sources',Mte='targets',Nte='sections',Ote='bendPoints',Pte='outgoingShape',Qte='incomingShape',Rte='outgoingSections',Ste='incomingSections',Tte='org.eclipse.emf.common.util',Ute='Severe implementation error in the Json to ElkGraph importer.',Vte='id',Wte='org.eclipse.elk.graph.json',Xte='Unhandled parameter types: ',Yte='startPoint',Zte="An edge must have at least one source and one target (edge id: '",$te="').",_te='Referenced edge section does not exist: ',aue=" (edge id: '",bue='target',cue='sourcePoint',due='targetPoint',eue='group',fue='name',gue='connectableShape cannot be null',hue='edge cannot be null',iue="Passed edge is not 'simple'.",jue='org.eclipse.elk.graph.util',kue="The 'no duplicates' constraint is violated",lue='targetIndex=',mue=', size=',nue='sourceIndex=',oue={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1},pue={3:1,4:1,20:1,28:1,52:1,14:1,47:1,15:1,54:1,67:1,63:1,58:1,588:1},que='logging',rue='measureExecutionTime',sue='parser.parse.1',tue='parser.parse.2',uue='parser.next.1',vue='parser.next.2',wue='parser.next.3',xue='parser.next.4',yue='parser.factor.1',zue='parser.factor.2',Aue='parser.factor.3',Bue='parser.factor.4',Cue='parser.factor.5',Due='parser.factor.6',Eue='parser.atom.1',Fue='parser.atom.2',Gue='parser.atom.3',Hue='parser.atom.4',Iue='parser.atom.5',Jue='parser.cc.1',Kue='parser.cc.2',Lue='parser.cc.3',Mue='parser.cc.5',Nue='parser.cc.6',Oue='parser.cc.7',Pue='parser.cc.8',Que='parser.ope.1',Rue='parser.ope.2',Sue='parser.ope.3',Tue='parser.descape.1',Uue='parser.descape.2',Vue='parser.descape.3',Wue='parser.descape.4',Xue='parser.descape.5',Yue='parser.process.1',Zue='parser.quantifier.1',$ue='parser.quantifier.2',_ue='parser.quantifier.3',ave='parser.quantifier.4',bve='parser.quantifier.5',cve='org.eclipse.emf.common.notify',dve={415:1,672:1},eve={3:1,4:1,20:1,28:1,52:1,14:1,15:1,67:1,58:1},fve={366:1,143:1},gve='index=',hve={3:1,4:1,5:1,126:1},ive={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,58:1},jve={3:1,6:1,4:1,5:1,192:1},kve={3:1,4:1,5:1,165:1,367:1},lve=';/?:@&=+$,',mve='invalid authority: ',nve='EAnnotation',ove='ETypedElement',pve='EStructuralFeature',qve='EAttribute',rve='EClassifier',sve='EEnumLiteral',tve='EGenericType',uve='EOperation',vve='EParameter',wve='EReference',xve='ETypeParameter',yve='org.eclipse.emf.ecore.util',zve={76:1},Ave={3:1,20:1,14:1,15:1,58:1,589:1,76:1,69:1,95:1},Bve='org.eclipse.emf.ecore.util.FeatureMap$Entry',Cve=8192,Dve=2048,Eve='byte',Fve='char',Gve='double',Hve='float',Ive='int',Jve='long',Kve='short',Lve='java.lang.Object',Mve={3:1,4:1,5:1,247:1},Nve={3:1,4:1,5:1,673:1},Ove={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,69:1},Pve={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,76:1,69:1,95:1},Qve='mixed',Rve='http:///org/eclipse/emf/ecore/util/ExtendedMetaData',Sve='kind',Tve={3:1,4:1,5:1,674:1},Uve={3:1,4:1,20:1,28:1,52:1,14:1,15:1,67:1,58:1,76:1,69:1,95:1},Vve={20:1,28:1,52:1,14:1,15:1,58:1,69:1},Wve={47:1,125:1,279:1},Xve={72:1,332:1},Yve="The value of type '",Zve="' must be of type '",$ve=1316,_ve='http://www.eclipse.org/emf/2002/Ecore',awe=-32768,bwe='constraints',cwe='baseType',dwe='getEStructuralFeature',ewe='getFeatureID',fwe='feature',gwe='getOperationID',hwe='operation',iwe='defaultValue',jwe='eTypeParameters',kwe='isInstance',lwe='getEEnumLiteral',mwe='eContainingClass',nwe={55:1},owe={3:1,4:1,5:1,119:1},pwe='org.eclipse.emf.ecore.resource',qwe={92:1,90:1,591:1,1935:1},rwe='org.eclipse.emf.ecore.resource.impl',swe='unspecified',twe='simple',uwe='attribute',vwe='attributeWildcard',wwe='element',xwe='elementWildcard',ywe='collapse',zwe='itemType',Awe='namespace',Bwe='##targetNamespace',Cwe='whiteSpace',Dwe='wildcards',Ewe='http://www.eclipse.org/emf/2003/XMLType',Fwe='##any',Gwe='uninitialized',Hwe='The multiplicity constraint is violated',Iwe='org.eclipse.emf.ecore.xml.type',Jwe='ProcessingInstruction',Kwe='SimpleAnyType',Lwe='XMLTypeDocumentRoot',Mwe='org.eclipse.emf.ecore.xml.type.impl',Nwe='INF',Owe='processing',Pwe='ENTITIES_._base',Qwe='minLength',Rwe='ENTITY',Swe='NCName',Twe='IDREFS_._base',Uwe='integer',Vwe='token',Wwe='pattern',Xwe='[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*',Ywe='\\i\\c*',Zwe='[\\i-[:]][\\c-[:]]*',$we='nonPositiveInteger',_we='maxInclusive',axe='NMTOKEN',bxe='NMTOKENS_._base',cxe='nonNegativeInteger',dxe='minInclusive',exe='normalizedString',fxe='unsignedByte',gxe='unsignedInt',hxe='18446744073709551615',ixe='unsignedShort',jxe='processingInstruction',kxe='org.eclipse.emf.ecore.xml.type.internal',lxe=1114111,mxe='Internal Error: shorthands: \\u',nxe='xml:isDigit',oxe='xml:isWord',pxe='xml:isSpace',qxe='xml:isNameChar',rxe='xml:isInitialNameChar',sxe='09\u0660\u0669\u06F0\u06F9\u0966\u096F\u09E6\u09EF\u0A66\u0A6F\u0AE6\u0AEF\u0B66\u0B6F\u0BE7\u0BEF\u0C66\u0C6F\u0CE6\u0CEF\u0D66\u0D6F\u0E50\u0E59\u0ED0\u0ED9\u0F20\u0F29',txe='AZaz\xC0\xD6\xD8\xF6\xF8\u0131\u0134\u013E\u0141\u0148\u014A\u017E\u0180\u01C3\u01CD\u01F0\u01F4\u01F5\u01FA\u0217\u0250\u02A8\u02BB\u02C1\u0386\u0386\u0388\u038A\u038C\u038C\u038E\u03A1\u03A3\u03CE\u03D0\u03D6\u03DA\u03DA\u03DC\u03DC\u03DE\u03DE\u03E0\u03E0\u03E2\u03F3\u0401\u040C\u040E\u044F\u0451\u045C\u045E\u0481\u0490\u04C4\u04C7\u04C8\u04CB\u04CC\u04D0\u04EB\u04EE\u04F5\u04F8\u04F9\u0531\u0556\u0559\u0559\u0561\u0586\u05D0\u05EA\u05F0\u05F2\u0621\u063A\u0641\u064A\u0671\u06B7\u06BA\u06BE\u06C0\u06CE\u06D0\u06D3\u06D5\u06D5\u06E5\u06E6\u0905\u0939\u093D\u093D\u0958\u0961\u0985\u098C\u098F\u0990\u0993\u09A8\u09AA\u09B0\u09B2\u09B2\u09B6\u09B9\u09DC\u09DD\u09DF\u09E1\u09F0\u09F1\u0A05\u0A0A\u0A0F\u0A10\u0A13\u0A28\u0A2A\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59\u0A5C\u0A5E\u0A5E\u0A72\u0A74\u0A85\u0A8B\u0A8D\u0A8D\u0A8F\u0A91\u0A93\u0AA8\u0AAA\u0AB0\u0AB2\u0AB3\u0AB5\u0AB9\u0ABD\u0ABD\u0AE0\u0AE0\u0B05\u0B0C\u0B0F\u0B10\u0B13\u0B28\u0B2A\u0B30\u0B32\u0B33\u0B36\u0B39\u0B3D\u0B3D\u0B5C\u0B5D\u0B5F\u0B61\u0B85\u0B8A\u0B8E\u0B90\u0B92\u0B95\u0B99\u0B9A\u0B9C\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8\u0BAA\u0BAE\u0BB5\u0BB7\u0BB9\u0C05\u0C0C\u0C0E\u0C10\u0C12\u0C28\u0C2A\u0C33\u0C35\u0C39\u0C60\u0C61\u0C85\u0C8C\u0C8E\u0C90\u0C92\u0CA8\u0CAA\u0CB3\u0CB5\u0CB9\u0CDE\u0CDE\u0CE0\u0CE1\u0D05\u0D0C\u0D0E\u0D10\u0D12\u0D28\u0D2A\u0D39\u0D60\u0D61\u0E01\u0E2E\u0E30\u0E30\u0E32\u0E33\u0E40\u0E45\u0E81\u0E82\u0E84\u0E84\u0E87\u0E88\u0E8A\u0E8A\u0E8D\u0E8D\u0E94\u0E97\u0E99\u0E9F\u0EA1\u0EA3\u0EA5\u0EA5\u0EA7\u0EA7\u0EAA\u0EAB\u0EAD\u0EAE\u0EB0\u0EB0\u0EB2\u0EB3\u0EBD\u0EBD\u0EC0\u0EC4\u0F40\u0F47\u0F49\u0F69\u10A0\u10C5\u10D0\u10F6\u1100\u1100\u1102\u1103\u1105\u1107\u1109\u1109\u110B\u110C\u110E\u1112\u113C\u113C\u113E\u113E\u1140\u1140\u114C\u114C\u114E\u114E\u1150\u1150\u1154\u1155\u1159\u1159\u115F\u1161\u1163\u1163\u1165\u1165\u1167\u1167\u1169\u1169\u116D\u116E\u1172\u1173\u1175\u1175\u119E\u119E\u11A8\u11A8\u11AB\u11AB\u11AE\u11AF\u11B7\u11B8\u11BA\u11BA\u11BC\u11C2\u11EB\u11EB\u11F0\u11F0\u11F9\u11F9\u1E00\u1E9B\u1EA0\u1EF9\u1F00\u1F15\u1F18\u1F1D\u1F20\u1F45\u1F48\u1F4D\u1F50\u1F57\u1F59\u1F59\u1F5B\u1F5B\u1F5D\u1F5D\u1F5F\u1F7D\u1F80\u1FB4\u1FB6\u1FBC\u1FBE\u1FBE\u1FC2\u1FC4\u1FC6\u1FCC\u1FD0\u1FD3\u1FD6\u1FDB\u1FE0\u1FEC\u1FF2\u1FF4\u1FF6\u1FFC\u2126\u2126\u212A\u212B\u212E\u212E\u2180\u2182\u3007\u3007\u3021\u3029\u3041\u3094\u30A1\u30FA\u3105\u312C\u4E00\u9FA5\uAC00\uD7A3',uxe='Private Use',vxe='ASSIGNED',wxe='\x00\x7F\x80\xFF\u0100\u017F\u0180\u024F\u0250\u02AF\u02B0\u02FF\u0300\u036F\u0370\u03FF\u0400\u04FF\u0530\u058F\u0590\u05FF\u0600\u06FF\u0700\u074F\u0780\u07BF\u0900\u097F\u0980\u09FF\u0A00\u0A7F\u0A80\u0AFF\u0B00\u0B7F\u0B80\u0BFF\u0C00\u0C7F\u0C80\u0CFF\u0D00\u0D7F\u0D80\u0DFF\u0E00\u0E7F\u0E80\u0EFF\u0F00\u0FFF\u1000\u109F\u10A0\u10FF\u1100\u11FF\u1200\u137F\u13A0\u13FF\u1400\u167F\u1680\u169F\u16A0\u16FF\u1780\u17FF\u1800\u18AF\u1E00\u1EFF\u1F00\u1FFF\u2000\u206F\u2070\u209F\u20A0\u20CF\u20D0\u20FF\u2100\u214F\u2150\u218F\u2190\u21FF\u2200\u22FF\u2300\u23FF\u2400\u243F\u2440\u245F\u2460\u24FF\u2500\u257F\u2580\u259F\u25A0\u25FF\u2600\u26FF\u2700\u27BF\u2800\u28FF\u2E80\u2EFF\u2F00\u2FDF\u2FF0\u2FFF\u3000\u303F\u3040\u309F\u30A0\u30FF\u3100\u312F\u3130\u318F\u3190\u319F\u31A0\u31BF\u3200\u32FF\u3300\u33FF\u3400\u4DB5\u4E00\u9FFF\uA000\uA48F\uA490\uA4CF\uAC00\uD7A3\uE000\uF8FF\uF900\uFAFF\uFB00\uFB4F\uFB50\uFDFF\uFE20\uFE2F\uFE30\uFE4F\uFE50\uFE6F\uFE70\uFEFE\uFEFF\uFEFF\uFF00\uFFEF',xxe='UNASSIGNED',yxe={3:1,117:1},zxe='org.eclipse.emf.ecore.xml.type.util',Axe={3:1,4:1,5:1,368:1},Bxe='org.eclipse.xtext.xbase.lib',Cxe='Cannot add elements to a Range',Dxe='Cannot set elements in a Range',Exe='Cannot remove elements from a Range',Fxe='locale',Gxe='default',Hxe='user.agent';var _,_bb,Wbb,tbb=-1;$wnd.goog=$wnd.goog||{};$wnd.goog.global=$wnd.goog.global||$wnd;acb();bcb(1,null,{},nb);_.Fb=function ob(a){return mb(this,a)};_.Gb=function qb(){return this.gm};_.Hb=function sb(){return FCb(this)};_.Ib=function ub(){var a;return hdb(rb(this))+'@'+(a=tb(this)>>>0,a.toString(16))};_.equals=function(a){return this.Fb(a)};_.hashCode=function(){return this.Hb()};_.toString=function(){return this.Ib()};var xD,yD,zD;bcb(290,1,{290:1,2026:1},jdb);_.le=function kdb(a){var b;b=new jdb;b.i=4;a>1?(b.c=rdb(this,a-1)):(b.c=this);return b};_.me=function qdb(){fdb(this);return this.b};_.ne=function sdb(){return hdb(this)};_.oe=function udb(){return fdb(this),this.k};_.pe=function wdb(){return (this.i&4)!=0};_.qe=function xdb(){return (this.i&1)!=0};_.Ib=function Adb(){return idb(this)};_.i=0;var edb=1;var SI=mdb(Phe,'Object',1);var AI=mdb(Phe,'Class',290);bcb(1998,1,Qhe);var $D=mdb(Rhe,'Optional',1998);bcb(1170,1998,Qhe,xb);_.Fb=function yb(a){return a===this};_.Hb=function zb(){return 2040732332};_.Ib=function Ab(){return 'Optional.absent()'};_.Jb=function Bb(a){Qb(a);return wb(),vb};var vb;var YD=mdb(Rhe,'Absent',1170);bcb(628,1,{},Gb);var ZD=mdb(Rhe,'Joiner',628);var _D=odb(Rhe,'Predicate');bcb(582,1,{169:1,582:1,3:1,45:1},Yb);_.Mb=function ac(a){return Xb(this,a)};_.Lb=function Zb(a){return Xb(this,a)};_.Fb=function $b(a){var b;if(JD(a,582)){b=BD(a,582);return At(this.a,b.a)}return false};_.Hb=function _b(){return qmb(this.a)+306654252};_.Ib=function bc(){return Wb(this.a)};var aE=mdb(Rhe,'Predicates/AndPredicate',582);bcb(408,1998,{408:1,3:1},cc);_.Fb=function dc(a){var b;if(JD(a,408)){b=BD(a,408);return pb(this.a,b.a)}return false};_.Hb=function ec(){return 1502476572+tb(this.a)};_.Ib=function fc(){return Whe+this.a+')'};_.Jb=function gc(a){return new cc(Rb(a.Kb(this.a),'the Function passed to Optional.transform() must not return null.'))};var bE=mdb(Rhe,'Present',408);bcb(198,1,Yhe);_.Nb=function kc(a){Rrb(this,a)};_.Qb=function lc(){jc()};var MH=mdb(Zhe,'UnmodifiableIterator',198);bcb(1978,198,$he);_.Qb=function nc(){jc()};_.Rb=function mc(a){throw vbb(new bgb)};_.Wb=function oc(a){throw vbb(new bgb)};var NH=mdb(Zhe,'UnmodifiableListIterator',1978);bcb(386,1978,$he);_.Ob=function rc(){return this.c0};_.Pb=function tc(){if(this.c>=this.d){throw vbb(new utb)}return this.Xb(this.c++)};_.Tb=function uc(){return this.c};_.Ub=function vc(){if(this.c<=0){throw vbb(new utb)}return this.Xb(--this.c)};_.Vb=function wc(){return this.c-1};_.c=0;_.d=0;var cE=mdb(Zhe,'AbstractIndexedListIterator',386);bcb(699,198,Yhe);_.Ob=function Ac(){return xc(this)};_.Pb=function Bc(){return yc(this)};_.e=1;var dE=mdb(Zhe,'AbstractIterator',699);bcb(1986,1,{224:1});_.Zb=function Hc(){var a;return a=this.f,!a?(this.f=this.ac()):a};_.Fb=function Ic(a){return hw(this,a)};_.Hb=function Jc(){return tb(this.Zb())};_.dc=function Kc(){return this.gc()==0};_.ec=function Lc(){return Ec(this)};_.Ib=function Mc(){return fcb(this.Zb())};var IE=mdb(Zhe,'AbstractMultimap',1986);bcb(726,1986,_he);_.$b=function Xc(){Nc(this)};_._b=function Yc(a){return Oc(this,a)};_.ac=function Zc(){return new ne(this,this.c)};_.ic=function $c(a){return this.hc()};_.bc=function _c(){return new zf(this,this.c)};_.jc=function ad(){return this.mc(this.hc())};_.kc=function bd(){return new Hd(this)};_.lc=function cd(){return Yj(this.c.vc().Nc(),new $g,64,this.d)};_.cc=function dd(a){return Qc(this,a)};_.fc=function gd(a){return Sc(this,a)};_.gc=function hd(){return this.d};_.mc=function jd(a){return mmb(),new lnb(a)};_.nc=function kd(){return new Dd(this)};_.oc=function ld(){return Yj(this.c.Cc().Nc(),new Fd,64,this.d)};_.pc=function md(a,b){return new dg(this,a,b,null)};_.d=0;var DE=mdb(Zhe,'AbstractMapBasedMultimap',726);bcb(1631,726,_he);_.hc=function pd(){return new Skb(this.a)};_.jc=function qd(){return mmb(),mmb(),jmb};_.cc=function sd(a){return BD(Qc(this,a),15)};_.fc=function ud(a){return BD(Sc(this,a),15)};_.Zb=function od(){return nd(this)};_.Fb=function rd(a){return hw(this,a)};_.qc=function td(a){return BD(Qc(this,a),15)};_.rc=function vd(a){return BD(Sc(this,a),15)};_.mc=function wd(a){return vmb(BD(a,15))};_.pc=function xd(a,b){return Vc(this,a,BD(b,15),null)};var eE=mdb(Zhe,'AbstractListMultimap',1631);bcb(732,1,aie);_.Nb=function zd(a){Rrb(this,a)};_.Ob=function Ad(){return this.c.Ob()||this.e.Ob()};_.Pb=function Bd(){var a;if(!this.e.Ob()){a=BD(this.c.Pb(),42);this.b=a.cd();this.a=BD(a.dd(),14);this.e=this.a.Kc()}return this.sc(this.b,this.e.Pb())};_.Qb=function Cd(){this.e.Qb();this.a.dc()&&this.c.Qb();--this.d.d};var mE=mdb(Zhe,'AbstractMapBasedMultimap/Itr',732);bcb(1099,732,aie,Dd);_.sc=function Ed(a,b){return b};var fE=mdb(Zhe,'AbstractMapBasedMultimap/1',1099);bcb(1100,1,{},Fd);_.Kb=function Gd(a){return BD(a,14).Nc()};var gE=mdb(Zhe,'AbstractMapBasedMultimap/1methodref$spliterator$Type',1100);bcb(1101,732,aie,Hd);_.sc=function Id(a,b){return new Wo(a,b)};var hE=mdb(Zhe,'AbstractMapBasedMultimap/2',1101);var DK=odb(bie,'Map');bcb(1967,1,cie);_.wc=function Td(a){stb(this,a)};_.yc=function $d(a,b,c){return ttb(this,a,b,c)};_.$b=function Od(){this.vc().$b()};_.tc=function Pd(a){return Jd(this,a)};_._b=function Qd(a){return !!Kd(this,a,false)};_.uc=function Rd(a){var b,c,d;for(c=this.vc().Kc();c.Ob();){b=BD(c.Pb(),42);d=b.dd();if(PD(a)===PD(d)||a!=null&&pb(a,d)){return true}}return false};_.Fb=function Sd(a){var b,c,d;if(a===this){return true}if(!JD(a,83)){return false}d=BD(a,83);if(this.gc()!=d.gc()){return false}for(c=d.vc().Kc();c.Ob();){b=BD(c.Pb(),42);if(!this.tc(b)){return false}}return true};_.xc=function Ud(a){return Wd(Kd(this,a,false))};_.Hb=function Xd(){return pmb(this.vc())};_.dc=function Yd(){return this.gc()==0};_.ec=function Zd(){return new Pib(this)};_.zc=function _d(a,b){throw vbb(new cgb('Put not supported on this map'))};_.Ac=function ae(a){Ld(this,a)};_.Bc=function be(a){return Wd(Kd(this,a,true))};_.gc=function ce(){return this.vc().gc()};_.Ib=function de(){return Md(this)};_.Cc=function ee(){return new $ib(this)};var sJ=mdb(bie,'AbstractMap',1967);bcb(1987,1967,cie);_.bc=function ge(){return new rf(this)};_.vc=function he(){return fe(this)};_.ec=function ie(){var a;a=this.g;return !a?(this.g=this.bc()):a};_.Cc=function je(){var a;a=this.i;return !a?(this.i=new Zv(this)):a};var bH=mdb(Zhe,'Maps/ViewCachingAbstractMap',1987);bcb(389,1987,cie,ne);_.xc=function se(a){return ke(this,a)};_.Bc=function ve(a){return le(this,a)};_.$b=function oe(){this.d==this.e.c?this.e.$b():ir(new mf(this))};_._b=function pe(a){return Gv(this.d,a)};_.Ec=function qe(){return new df(this)};_.Dc=function(){return this.Ec()};_.Fb=function re(a){return this===a||pb(this.d,a)};_.Hb=function te(){return tb(this.d)};_.ec=function ue(){return this.e.ec()};_.gc=function we(){return this.d.gc()};_.Ib=function xe(){return fcb(this.d)};var lE=mdb(Zhe,'AbstractMapBasedMultimap/AsMap',389);var KI=odb(Phe,'Iterable');bcb(28,1,die);_.Jc=function Le(a){reb(this,a)};_.Lc=function Ne(){return this.Oc()};_.Nc=function Pe(){return new Kub(this,0)};_.Oc=function Qe(){return new YAb(null,this.Nc())};_.Fc=function Ge(a){throw vbb(new cgb('Add not supported on this collection'))};_.Gc=function He(a){return ye(this,a)};_.$b=function Ie(){Ae(this)};_.Hc=function Je(a){return ze(this,a,false)};_.Ic=function Ke(a){return Be(this,a)};_.dc=function Me(){return this.gc()==0};_.Mc=function Oe(a){return ze(this,a,true)};_.Pc=function Re(){return De(this)};_.Qc=function Se(a){return Ee(this,a)};_.Ib=function Te(){return Fe(this)};var dJ=mdb(bie,'AbstractCollection',28);var LK=odb(bie,'Set');bcb(eie,28,fie);_.Nc=function Ye(){return new Kub(this,1)};_.Fb=function We(a){return Ue(this,a)};_.Hb=function Xe(){return pmb(this)};var zJ=mdb(bie,'AbstractSet',eie);bcb(1970,eie,fie);var BH=mdb(Zhe,'Sets/ImprovedAbstractSet',1970);bcb(1971,1970,fie);_.$b=function $e(){this.Rc().$b()};_.Hc=function _e(a){return Ze(this,a)};_.dc=function af(){return this.Rc().dc()};_.Mc=function bf(a){var b;if(this.Hc(a)){b=BD(a,42);return this.Rc().ec().Mc(b.cd())}return false};_.gc=function cf(){return this.Rc().gc()};var WG=mdb(Zhe,'Maps/EntrySet',1971);bcb(1097,1971,fie,df);_.Hc=function ef(a){return Ck(this.a.d.vc(),a)};_.Kc=function ff(){return new mf(this.a)};_.Rc=function gf(){return this.a};_.Mc=function hf(a){var b;if(!Ck(this.a.d.vc(),a)){return false}b=BD(a,42);Tc(this.a.e,b.cd());return true};_.Nc=function jf(){return $j(this.a.d.vc().Nc(),new kf(this.a))};var jE=mdb(Zhe,'AbstractMapBasedMultimap/AsMap/AsMapEntries',1097);bcb(1098,1,{},kf);_.Kb=function lf(a){return me(this.a,BD(a,42))};var iE=mdb(Zhe,'AbstractMapBasedMultimap/AsMap/AsMapEntries/0methodref$wrapEntry$Type',1098);bcb(730,1,aie,mf);_.Nb=function nf(a){Rrb(this,a)};_.Pb=function pf(){var a;return a=BD(this.b.Pb(),42),this.a=BD(a.dd(),14),me(this.c,a)};_.Ob=function of(){return this.b.Ob()};_.Qb=function qf(){Vb(!!this.a);this.b.Qb();this.c.e.d-=this.a.gc();this.a.$b();this.a=null};var kE=mdb(Zhe,'AbstractMapBasedMultimap/AsMap/AsMapIterator',730);bcb(532,1970,fie,rf);_.$b=function sf(){this.b.$b()};_.Hc=function tf(a){return this.b._b(a)};_.Jc=function uf(a){Qb(a);this.b.wc(new Xv(a))};_.dc=function vf(){return this.b.dc()};_.Kc=function wf(){return new Mv(this.b.vc().Kc())};_.Mc=function xf(a){if(this.b._b(a)){this.b.Bc(a);return true}return false};_.gc=function yf(){return this.b.gc()};var $G=mdb(Zhe,'Maps/KeySet',532);bcb(318,532,fie,zf);_.$b=function Af(){var a;ir((a=this.b.vc().Kc(),new Hf(this,a)))};_.Ic=function Bf(a){return this.b.ec().Ic(a)};_.Fb=function Cf(a){return this===a||pb(this.b.ec(),a)};_.Hb=function Df(){return tb(this.b.ec())};_.Kc=function Ef(){var a;return a=this.b.vc().Kc(),new Hf(this,a)};_.Mc=function Ff(a){var b,c;c=0;b=BD(this.b.Bc(a),14);if(b){c=b.gc();b.$b();this.a.d-=c}return c>0};_.Nc=function Gf(){return this.b.ec().Nc()};var oE=mdb(Zhe,'AbstractMapBasedMultimap/KeySet',318);bcb(731,1,aie,Hf);_.Nb=function If(a){Rrb(this,a)};_.Ob=function Jf(){return this.c.Ob()};_.Pb=function Kf(){this.a=BD(this.c.Pb(),42);return this.a.cd()};_.Qb=function Lf(){var a;Vb(!!this.a);a=BD(this.a.dd(),14);this.c.Qb();this.b.a.d-=a.gc();a.$b();this.a=null};var nE=mdb(Zhe,'AbstractMapBasedMultimap/KeySet/1',731);bcb(491,389,{83:1,161:1},Mf);_.bc=function Nf(){return this.Sc()};_.ec=function Pf(){return this.Tc()};_.Sc=function Of(){return new Yf(this.c,this.Uc())};_.Tc=function Qf(){var a;return a=this.b,!a?(this.b=this.Sc()):a};_.Uc=function Rf(){return BD(this.d,161)};var sE=mdb(Zhe,'AbstractMapBasedMultimap/SortedAsMap',491);bcb(542,491,gie,Sf);_.bc=function Tf(){return new $f(this.a,BD(BD(this.d,161),171))};_.Sc=function Uf(){return new $f(this.a,BD(BD(this.d,161),171))};_.ec=function Vf(){var a;return a=this.b,BD(!a?(this.b=new $f(this.a,BD(BD(this.d,161),171))):a,271)};_.Tc=function Wf(){var a;return a=this.b,BD(!a?(this.b=new $f(this.a,BD(BD(this.d,161),171))):a,271)};_.Uc=function Xf(){return BD(BD(this.d,161),171)};var pE=mdb(Zhe,'AbstractMapBasedMultimap/NavigableAsMap',542);bcb(490,318,hie,Yf);_.Nc=function Zf(){return this.b.ec().Nc()};var tE=mdb(Zhe,'AbstractMapBasedMultimap/SortedKeySet',490);bcb(388,490,iie,$f);var qE=mdb(Zhe,'AbstractMapBasedMultimap/NavigableKeySet',388);bcb(541,28,die,dg);_.Fc=function eg(a){var b,c;ag(this);c=this.d.dc();b=this.d.Fc(a);if(b){++this.f.d;c&&_f(this)}return b};_.Gc=function fg(a){var b,c,d;if(a.dc()){return false}d=(ag(this),this.d.gc());b=this.d.Gc(a);if(b){c=this.d.gc();this.f.d+=c-d;d==0&&_f(this)}return b};_.$b=function gg(){var a;a=(ag(this),this.d.gc());if(a==0){return}this.d.$b();this.f.d-=a;bg(this)};_.Hc=function hg(a){ag(this);return this.d.Hc(a)};_.Ic=function ig(a){ag(this);return this.d.Ic(a)};_.Fb=function jg(a){if(a===this){return true}ag(this);return pb(this.d,a)};_.Hb=function kg(){ag(this);return tb(this.d)};_.Kc=function lg(){ag(this);return new Gg(this)};_.Mc=function mg(a){var b;ag(this);b=this.d.Mc(a);if(b){--this.f.d;bg(this)}return b};_.gc=function ng(){return cg(this)};_.Nc=function og(){return ag(this),this.d.Nc()};_.Ib=function pg(){ag(this);return fcb(this.d)};var vE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedCollection',541);var yK=odb(bie,'List');bcb(728,541,{20:1,28:1,14:1,15:1},qg);_.ad=function zg(a){ktb(this,a)};_.Nc=function Ag(){return ag(this),this.d.Nc()};_.Vc=function rg(a,b){var c;ag(this);c=this.d.dc();BD(this.d,15).Vc(a,b);++this.a.d;c&&_f(this)};_.Wc=function sg(a,b){var c,d,e;if(b.dc()){return false}e=(ag(this),this.d.gc());c=BD(this.d,15).Wc(a,b);if(c){d=this.d.gc();this.a.d+=d-e;e==0&&_f(this)}return c};_.Xb=function tg(a){ag(this);return BD(this.d,15).Xb(a)};_.Xc=function ug(a){ag(this);return BD(this.d,15).Xc(a)};_.Yc=function vg(){ag(this);return new Mg(this)};_.Zc=function wg(a){ag(this);return new Ng(this,a)};_.$c=function xg(a){var b;ag(this);b=BD(this.d,15).$c(a);--this.a.d;bg(this);return b};_._c=function yg(a,b){ag(this);return BD(this.d,15)._c(a,b)};_.bd=function Bg(a,b){ag(this);return Vc(this.a,this.e,BD(this.d,15).bd(a,b),!this.b?this:this.b)};var xE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedList',728);bcb(1096,728,{20:1,28:1,14:1,15:1,54:1},Cg);var rE=mdb(Zhe,'AbstractMapBasedMultimap/RandomAccessWrappedList',1096);bcb(620,1,aie,Gg);_.Nb=function Ig(a){Rrb(this,a)};_.Ob=function Jg(){Fg(this);return this.b.Ob()};_.Pb=function Kg(){Fg(this);return this.b.Pb()};_.Qb=function Lg(){Eg(this)};var uE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedCollection/WrappedIterator',620);bcb(729,620,jie,Mg,Ng);_.Qb=function Tg(){Eg(this)};_.Rb=function Og(a){var b;b=cg(this.a)==0;(Fg(this),BD(this.b,125)).Rb(a);++this.a.a.d;b&&_f(this.a)};_.Sb=function Pg(){return (Fg(this),BD(this.b,125)).Sb()};_.Tb=function Qg(){return (Fg(this),BD(this.b,125)).Tb()};_.Ub=function Rg(){return (Fg(this),BD(this.b,125)).Ub()};_.Vb=function Sg(){return (Fg(this),BD(this.b,125)).Vb()};_.Wb=function Ug(a){(Fg(this),BD(this.b,125)).Wb(a)};var wE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedList/WrappedListIterator',729);bcb(727,541,hie,Vg);_.Nc=function Wg(){return ag(this),this.d.Nc()};var AE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedSortedSet',727);bcb(1095,727,iie,Xg);var yE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedNavigableSet',1095);bcb(1094,541,fie,Yg);_.Nc=function Zg(){return ag(this),this.d.Nc()};var zE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedSet',1094);bcb(1103,1,{},$g);_.Kb=function _g(a){return fd(BD(a,42))};var BE=mdb(Zhe,'AbstractMapBasedMultimap/lambda$1$Type',1103);bcb(1102,1,{},ah);_.Kb=function bh(a){return new Wo(this.a,a)};var CE=mdb(Zhe,'AbstractMapBasedMultimap/lambda$2$Type',1102);var CK=odb(bie,'Map/Entry');bcb(345,1,kie);_.Fb=function dh(a){var b;if(JD(a,42)){b=BD(a,42);return Hb(this.cd(),b.cd())&&Hb(this.dd(),b.dd())}return false};_.Hb=function eh(){var a,b;a=this.cd();b=this.dd();return (a==null?0:tb(a))^(b==null?0:tb(b))};_.ed=function fh(a){throw vbb(new bgb)};_.Ib=function gh(){return this.cd()+'='+this.dd()};var EE=mdb(Zhe,lie,345);bcb(1988,28,die);_.$b=function hh(){this.fd().$b()};_.Hc=function ih(a){var b;if(JD(a,42)){b=BD(a,42);return Cc(this.fd(),b.cd(),b.dd())}return false};_.Mc=function jh(a){var b;if(JD(a,42)){b=BD(a,42);return Gc(this.fd(),b.cd(),b.dd())}return false};_.gc=function kh(){return this.fd().d};var fH=mdb(Zhe,'Multimaps/Entries',1988);bcb(733,1988,die,lh);_.Kc=function mh(){return this.a.kc()};_.fd=function nh(){return this.a};_.Nc=function oh(){return this.a.lc()};var FE=mdb(Zhe,'AbstractMultimap/Entries',733);bcb(734,733,fie,ph);_.Nc=function sh(){return this.a.lc()};_.Fb=function qh(a){return Ax(this,a)};_.Hb=function rh(){return Bx(this)};var GE=mdb(Zhe,'AbstractMultimap/EntrySet',734);bcb(735,28,die,th);_.$b=function uh(){this.a.$b()};_.Hc=function vh(a){return Dc(this.a,a)};_.Kc=function wh(){return this.a.nc()};_.gc=function xh(){return this.a.d};_.Nc=function yh(){return this.a.oc()};var HE=mdb(Zhe,'AbstractMultimap/Values',735);bcb(1989,28,{835:1,20:1,28:1,14:1});_.Jc=function Gh(a){Qb(a);Ah(this).Jc(new Xw(a))};_.Nc=function Kh(){var a;return a=Ah(this).Nc(),Yj(a,new cx,64|a.qd()&1296,this.a.d)};_.Fc=function Ch(a){zh();return true};_.Gc=function Dh(a){return Qb(this),Qb(a),JD(a,543)?Zw(BD(a,835)):!a.dc()&&fr(this,a.Kc())};_.Hc=function Eh(a){var b;return b=BD(Hv(nd(this.a),a),14),(!b?0:b.gc())>0};_.Fb=function Fh(a){return $w(this,a)};_.Hb=function Hh(){return tb(Ah(this))};_.dc=function Ih(){return Ah(this).dc()};_.Mc=function Jh(a){return Bw(this,a,1)>0};_.Ib=function Lh(){return fcb(Ah(this))};var KE=mdb(Zhe,'AbstractMultiset',1989);bcb(1991,1970,fie);_.$b=function Mh(){Nc(this.a.a)};_.Hc=function Nh(a){var b,c;if(JD(a,492)){c=BD(a,416);if(BD(c.a.dd(),14).gc()<=0){return false}b=Aw(this.a,c.a.cd());return b==BD(c.a.dd(),14).gc()}return false};_.Mc=function Oh(a){var b,c,d,e;if(JD(a,492)){c=BD(a,416);b=c.a.cd();d=BD(c.a.dd(),14).gc();if(d!=0){e=this.a;return ax(e,b,d)}}return false};var pH=mdb(Zhe,'Multisets/EntrySet',1991);bcb(1109,1991,fie,Ph);_.Kc=function Qh(){return new Lw(fe(nd(this.a.a)).Kc())};_.gc=function Rh(){return nd(this.a.a).gc()};var JE=mdb(Zhe,'AbstractMultiset/EntrySet',1109);bcb(619,726,_he);_.hc=function Uh(){return this.gd()};_.jc=function Vh(){return this.hd()};_.cc=function Yh(a){return this.jd(a)};_.fc=function $h(a){return this.kd(a)};_.Zb=function Th(){var a;return a=this.f,!a?(this.f=this.ac()):a};_.hd=function Wh(){return mmb(),mmb(),lmb};_.Fb=function Xh(a){return hw(this,a)};_.jd=function Zh(a){return BD(Qc(this,a),21)};_.kd=function _h(a){return BD(Sc(this,a),21)};_.mc=function ai(a){return mmb(),new zob(BD(a,21))};_.pc=function bi(a,b){return new Yg(this,a,BD(b,21))};var LE=mdb(Zhe,'AbstractSetMultimap',619);bcb(1657,619,_he);_.hc=function ei(){return new Hxb(this.b)};_.gd=function fi(){return new Hxb(this.b)};_.jc=function gi(){return Ix(new Hxb(this.b))};_.hd=function hi(){return Ix(new Hxb(this.b))};_.cc=function ii(a){return BD(BD(Qc(this,a),21),84)};_.jd=function ji(a){return BD(BD(Qc(this,a),21),84)};_.fc=function ki(a){return BD(BD(Sc(this,a),21),84)};_.kd=function li(a){return BD(BD(Sc(this,a),21),84)};_.mc=function mi(a){return JD(a,271)?Ix(BD(a,271)):(mmb(),new Zob(BD(a,84)))};_.Zb=function di(){var a;return a=this.f,!a?(this.f=JD(this.c,171)?new Sf(this,BD(this.c,171)):JD(this.c,161)?new Mf(this,BD(this.c,161)):new ne(this,this.c)):a};_.pc=function ni(a,b){return JD(b,271)?new Xg(this,a,BD(b,271)):new Vg(this,a,BD(b,84))};var NE=mdb(Zhe,'AbstractSortedSetMultimap',1657);bcb(1658,1657,_he);_.Zb=function pi(){var a;return a=this.f,BD(BD(!a?(this.f=JD(this.c,171)?new Sf(this,BD(this.c,171)):JD(this.c,161)?new Mf(this,BD(this.c,161)):new ne(this,this.c)):a,161),171)};_.ec=function ri(){var a;return a=this.i,BD(BD(!a?(this.i=JD(this.c,171)?new $f(this,BD(this.c,171)):JD(this.c,161)?new Yf(this,BD(this.c,161)):new zf(this,this.c)):a,84),271)};_.bc=function qi(){return JD(this.c,171)?new $f(this,BD(this.c,171)):JD(this.c,161)?new Yf(this,BD(this.c,161)):new zf(this,this.c)};var ME=mdb(Zhe,'AbstractSortedKeySortedSetMultimap',1658);bcb(2010,1,{1947:1});_.Fb=function si(a){return zy(this,a)};_.Hb=function ti(){var a;return pmb((a=this.g,!a?(this.g=new vi(this)):a))};_.Ib=function ui(){var a;return Md((a=this.f,!a?(this.f=new Rj(this)):a))};var QE=mdb(Zhe,'AbstractTable',2010);bcb(665,eie,fie,vi);_.$b=function wi(){Pi()};_.Hc=function xi(a){var b,c;if(JD(a,468)){b=BD(a,682);c=BD(Hv(Vi(this.a),Em(b.c.e,b.b)),83);return !!c&&Ck(c.vc(),new Wo(Em(b.c.c,b.a),Mi(b.c,b.b,b.a)))}return false};_.Kc=function yi(){return Ni(this.a)};_.Mc=function zi(a){var b,c;if(JD(a,468)){b=BD(a,682);c=BD(Hv(Vi(this.a),Em(b.c.e,b.b)),83);return !!c&&Dk(c.vc(),new Wo(Em(b.c.c,b.a),Mi(b.c,b.b,b.a)))}return false};_.gc=function Ai(){return Xi(this.a)};_.Nc=function Bi(){return Oi(this.a)};var OE=mdb(Zhe,'AbstractTable/CellSet',665);bcb(1928,28,die,Ci);_.$b=function Di(){Pi()};_.Hc=function Ei(a){return Qi(this.a,a)};_.Kc=function Fi(){return Zi(this.a)};_.gc=function Gi(){return Xi(this.a)};_.Nc=function Hi(){return $i(this.a)};var PE=mdb(Zhe,'AbstractTable/Values',1928);bcb(1632,1631,_he);var RE=mdb(Zhe,'ArrayListMultimapGwtSerializationDependencies',1632);bcb(513,1632,_he,Ji,Ki);_.hc=function Li(){return new Skb(this.a)};_.a=0;var SE=mdb(Zhe,'ArrayListMultimap',513);bcb(664,2010,{664:1,1947:1,3:1},_i);var cF=mdb(Zhe,'ArrayTable',664);bcb(1924,386,$he,aj);_.Xb=function bj(a){return new hj(this.a,a)};var TE=mdb(Zhe,'ArrayTable/1',1924);bcb(1925,1,{},cj);_.ld=function dj(a){return new hj(this.a,a)};var UE=mdb(Zhe,'ArrayTable/1methodref$getCell$Type',1925);bcb(2011,1,{682:1});_.Fb=function ej(a){var b;if(a===this){return true}if(JD(a,468)){b=BD(a,682);return Hb(Em(this.c.e,this.b),Em(b.c.e,b.b))&&Hb(Em(this.c.c,this.a),Em(b.c.c,b.a))&&Hb(Mi(this.c,this.b,this.a),Mi(b.c,b.b,b.a))}return false};_.Hb=function fj(){return Hlb(OC(GC(SI,1),Uhe,1,5,[Em(this.c.e,this.b),Em(this.c.c,this.a),Mi(this.c,this.b,this.a)]))};_.Ib=function gj(){return '('+Em(this.c.e,this.b)+','+Em(this.c.c,this.a)+')='+Mi(this.c,this.b,this.a)};var JH=mdb(Zhe,'Tables/AbstractCell',2011);bcb(468,2011,{468:1,682:1},hj);_.a=0;_.b=0;_.d=0;var VE=mdb(Zhe,'ArrayTable/2',468);bcb(1927,1,{},ij);_.ld=function jj(a){return Ti(this.a,a)};var WE=mdb(Zhe,'ArrayTable/2methodref$getValue$Type',1927);bcb(1926,386,$he,kj);_.Xb=function lj(a){return Ti(this.a,a)};var XE=mdb(Zhe,'ArrayTable/3',1926);bcb(1979,1967,cie);_.$b=function nj(){ir(this.kc())};_.vc=function oj(){return new Sv(this)};_.lc=function pj(){return new Mub(this.kc(),this.gc())};var YG=mdb(Zhe,'Maps/IteratorBasedAbstractMap',1979);bcb(828,1979,cie);_.$b=function tj(){throw vbb(new bgb)};_._b=function uj(a){return sn(this.c,a)};_.kc=function vj(){return new Jj(this,this.c.b.c.gc())};_.lc=function wj(){return Zj(this.c.b.c.gc(),16,new Dj(this))};_.xc=function xj(a){var b;b=BD(tn(this.c,a),19);return !b?null:this.nd(b.a)};_.dc=function yj(){return this.c.b.c.dc()};_.ec=function zj(){return Xm(this.c)};_.zc=function Aj(a,b){var c;c=BD(tn(this.c,a),19);if(!c){throw vbb(new Wdb(this.md()+' '+a+' not in '+Xm(this.c)))}return this.od(c.a,b)};_.Bc=function Bj(a){throw vbb(new bgb)};_.gc=function Cj(){return this.c.b.c.gc()};var _E=mdb(Zhe,'ArrayTable/ArrayMap',828);bcb(1923,1,{},Dj);_.ld=function Ej(a){return qj(this.a,a)};var YE=mdb(Zhe,'ArrayTable/ArrayMap/0methodref$getEntry$Type',1923);bcb(1921,345,kie,Fj);_.cd=function Gj(){return rj(this.a,this.b)};_.dd=function Hj(){return this.a.nd(this.b)};_.ed=function Ij(a){return this.a.od(this.b,a)};_.b=0;var ZE=mdb(Zhe,'ArrayTable/ArrayMap/1',1921);bcb(1922,386,$he,Jj);_.Xb=function Kj(a){return qj(this.a,a)};var $E=mdb(Zhe,'ArrayTable/ArrayMap/2',1922);bcb(1920,828,cie,Lj);_.md=function Mj(){return 'Column'};_.nd=function Nj(a){return Mi(this.b,this.a,a)};_.od=function Oj(a,b){return Wi(this.b,this.a,a,b)};_.a=0;var bF=mdb(Zhe,'ArrayTable/Row',1920);bcb(829,828,cie,Rj);_.nd=function Tj(a){return new Lj(this.a,a)};_.zc=function Uj(a,b){return BD(b,83),Pj()};_.od=function Vj(a,b){return BD(b,83),Qj()};_.md=function Sj(){return 'Row'};var aF=mdb(Zhe,'ArrayTable/RowMap',829);bcb(1120,1,pie,_j);_.qd=function ak(){return this.a.qd()&-262};_.rd=function bk(){return this.a.rd()};_.Nb=function ck(a){this.a.Nb(new gk(a,this.b))};_.sd=function dk(a){return this.a.sd(new ek(a,this.b))};var lF=mdb(Zhe,'CollectSpliterators/1',1120);bcb(1121,1,qie,ek);_.td=function fk(a){this.a.td(this.b.Kb(a))};var dF=mdb(Zhe,'CollectSpliterators/1/lambda$0$Type',1121);bcb(1122,1,qie,gk);_.td=function hk(a){this.a.td(this.b.Kb(a))};var eF=mdb(Zhe,'CollectSpliterators/1/lambda$1$Type',1122);bcb(1123,1,pie,jk);_.qd=function kk(){return this.a};_.rd=function lk(){!!this.d&&(this.b=Deb(this.b,this.d.rd()));return Deb(this.b,0)};_.Nb=function mk(a){if(this.d){this.d.Nb(a);this.d=null}this.c.Nb(new rk(this.e,a));this.b=0};_.sd=function ok(a){while(true){if(!!this.d&&this.d.sd(a)){Kbb(this.b,rie)&&(this.b=Qbb(this.b,1));return true}else{this.d=null}if(!this.c.sd(new pk(this,this.e))){return false}}};_.a=0;_.b=0;var hF=mdb(Zhe,'CollectSpliterators/1FlatMapSpliterator',1123);bcb(1124,1,qie,pk);_.td=function qk(a){ik(this.a,this.b,a)};var fF=mdb(Zhe,'CollectSpliterators/1FlatMapSpliterator/lambda$0$Type',1124);bcb(1125,1,qie,rk);_.td=function sk(a){nk(this.b,this.a,a)};var gF=mdb(Zhe,'CollectSpliterators/1FlatMapSpliterator/lambda$1$Type',1125);bcb(1117,1,pie,tk);_.qd=function uk(){return 16464|this.b};_.rd=function vk(){return this.a.rd()};_.Nb=function wk(a){this.a.xe(new Ak(a,this.c))};_.sd=function xk(a){return this.a.ye(new yk(a,this.c))};_.b=0;var kF=mdb(Zhe,'CollectSpliterators/1WithCharacteristics',1117);bcb(1118,1,sie,yk);_.ud=function zk(a){this.a.td(this.b.ld(a))};var iF=mdb(Zhe,'CollectSpliterators/1WithCharacteristics/lambda$0$Type',1118);bcb(1119,1,sie,Ak);_.ud=function Bk(a){this.a.td(this.b.ld(a))};var jF=mdb(Zhe,'CollectSpliterators/1WithCharacteristics/lambda$1$Type',1119);bcb(245,1,tie);_.wd=function Hk(a){return this.vd(BD(a,245))};_.vd=function Gk(a){var b;if(a==(_k(),$k)){return 1}if(a==(Lk(),Kk)){return -1}b=(ex(),Fcb(this.a,a.a));if(b!=0){return b}return JD(this,519)==JD(a,519)?0:JD(this,519)?1:-1};_.zd=function Ik(){return this.a};_.Fb=function Jk(a){return Ek(this,a)};var qF=mdb(Zhe,'Cut',245);bcb(1761,245,tie,Mk);_.vd=function Nk(a){return a==this?0:1};_.xd=function Ok(a){throw vbb(new xcb)};_.yd=function Pk(a){a.a+='+\u221E)'};_.zd=function Qk(){throw vbb(new Zdb(uie))};_.Hb=function Rk(){return Zfb(),kCb(this)};_.Ad=function Sk(a){return false};_.Ib=function Tk(){return '+\u221E'};var Kk;var mF=mdb(Zhe,'Cut/AboveAll',1761);bcb(519,245,{245:1,519:1,3:1,35:1},Uk);_.xd=function Vk(a){Pfb((a.a+='(',a),this.a)};_.yd=function Wk(a){Kfb(Pfb(a,this.a),93)};_.Hb=function Xk(){return ~tb(this.a)};_.Ad=function Yk(a){return ex(),Fcb(this.a,a)<0};_.Ib=function Zk(){return '/'+this.a+'\\'};var nF=mdb(Zhe,'Cut/AboveValue',519);bcb(1760,245,tie,al);_.vd=function bl(a){return a==this?0:-1};_.xd=function cl(a){a.a+='(-\u221E'};_.yd=function dl(a){throw vbb(new xcb)};_.zd=function el(){throw vbb(new Zdb(uie))};_.Hb=function fl(){return Zfb(),kCb(this)};_.Ad=function gl(a){return true};_.Ib=function hl(){return '-\u221E'};var $k;var oF=mdb(Zhe,'Cut/BelowAll',1760);bcb(1762,245,tie,il);_.xd=function jl(a){Pfb((a.a+='[',a),this.a)};_.yd=function kl(a){Kfb(Pfb(a,this.a),41)};_.Hb=function ll(){return tb(this.a)};_.Ad=function ml(a){return ex(),Fcb(this.a,a)<=0};_.Ib=function nl(){return '\\'+this.a+'/'};var pF=mdb(Zhe,'Cut/BelowValue',1762);bcb(537,1,vie);_.Jc=function ql(a){reb(this,a)};_.Ib=function rl(){return tr(BD(Rb(this,'use Optional.orNull() instead of Optional.or(null)'),20).Kc())};var uF=mdb(Zhe,'FluentIterable',537);bcb(433,537,vie,sl);_.Kc=function tl(){return new Sr(ur(this.a.Kc(),new Sq))};var rF=mdb(Zhe,'FluentIterable/2',433);bcb(1046,537,vie,vl);_.Kc=function wl(){return ul(this)};var tF=mdb(Zhe,'FluentIterable/3',1046);bcb(708,386,$he,xl);_.Xb=function yl(a){return this.a[a].Kc()};var sF=mdb(Zhe,'FluentIterable/3/1',708);bcb(1972,1,{});_.Ib=function zl(){return fcb(this.Bd().b)};var BF=mdb(Zhe,'ForwardingObject',1972);bcb(1973,1972,wie);_.Bd=function Fl(){return this.Cd()};_.Jc=function Gl(a){reb(this,a)};_.Lc=function Jl(){return this.Oc()};_.Nc=function Ml(){return new Kub(this,0)};_.Oc=function Nl(){return new YAb(null,this.Nc())};_.Fc=function Al(a){return this.Cd(),enb()};_.Gc=function Bl(a){return this.Cd(),fnb()};_.$b=function Cl(){this.Cd(),gnb()};_.Hc=function Dl(a){return this.Cd().Hc(a)};_.Ic=function El(a){return this.Cd().Ic(a)};_.dc=function Hl(){return this.Cd().b.dc()};_.Kc=function Il(){return this.Cd().Kc()};_.Mc=function Kl(a){return this.Cd(),jnb()};_.gc=function Ll(){return this.Cd().b.gc()};_.Pc=function Ol(){return this.Cd().Pc()};_.Qc=function Pl(a){return this.Cd().Qc(a)};var vF=mdb(Zhe,'ForwardingCollection',1973);bcb(1980,28,xie);_.Kc=function Xl(){return this.Ed()};_.Fc=function Sl(a){throw vbb(new bgb)};_.Gc=function Tl(a){throw vbb(new bgb)};_.$b=function Ul(){throw vbb(new bgb)};_.Hc=function Vl(a){return a!=null&&ze(this,a,false)};_.Dd=function Wl(){switch(this.gc()){case 0:return im(),im(),hm;case 1:return im(),new my(Qb(this.Ed().Pb()));default:return new px(this,this.Pc());}};_.Mc=function Yl(a){throw vbb(new bgb)};var WF=mdb(Zhe,'ImmutableCollection',1980);bcb(712,1980,xie,Zl);_.Kc=function cm(){return vr(this.a.Kc())};_.Hc=function $l(a){return a!=null&&this.a.Hc(a)};_.Ic=function _l(a){return this.a.Ic(a)};_.dc=function am(){return this.a.dc()};_.Ed=function bm(){return vr(this.a.Kc())};_.gc=function dm(){return this.a.gc()};_.Pc=function em(){return this.a.Pc()};_.Qc=function fm(a){return this.a.Qc(a)};_.Ib=function gm(){return fcb(this.a)};var wF=mdb(Zhe,'ForwardingImmutableCollection',712);bcb(152,1980,yie);_.Kc=function sm(){return this.Ed()};_.Yc=function tm(){return this.Fd(0)};_.Zc=function vm(a){return this.Fd(a)};_.ad=function zm(a){ktb(this,a)};_.Nc=function Am(){return new Kub(this,16)};_.bd=function Cm(a,b){return this.Gd(a,b)};_.Vc=function lm(a,b){throw vbb(new bgb)};_.Wc=function mm(a,b){throw vbb(new bgb)};_.Fb=function om(a){return Ju(this,a)};_.Hb=function pm(){return Ku(this)};_.Xc=function qm(a){return a==null?-1:Lu(this,a)};_.Ed=function rm(){return this.Fd(0)};_.Fd=function um(a){return jm(this,a)};_.$c=function xm(a){throw vbb(new bgb)};_._c=function ym(a,b){throw vbb(new bgb)};_.Gd=function Bm(a,b){var c;return Dm((c=new $u(this),new Jib(c,a,b)))};var hm;var _F=mdb(Zhe,'ImmutableList',152);bcb(2006,152,yie);_.Kc=function Nm(){return vr(this.Hd().Kc())};_.bd=function Qm(a,b){return Dm(this.Hd().bd(a,b))};_.Hc=function Fm(a){return a!=null&&this.Hd().Hc(a)};_.Ic=function Gm(a){return this.Hd().Ic(a)};_.Fb=function Hm(a){return pb(this.Hd(),a)};_.Xb=function Im(a){return Em(this,a)};_.Hb=function Jm(){return tb(this.Hd())};_.Xc=function Km(a){return this.Hd().Xc(a)};_.dc=function Lm(){return this.Hd().dc()};_.Ed=function Mm(){return vr(this.Hd().Kc())};_.gc=function Om(){return this.Hd().gc()};_.Gd=function Pm(a,b){return Dm(this.Hd().bd(a,b))};_.Pc=function Rm(){return this.Hd().Qc(KC(SI,Uhe,1,this.Hd().gc(),5,1))};_.Qc=function Sm(a){return this.Hd().Qc(a)};_.Ib=function Tm(){return fcb(this.Hd())};var xF=mdb(Zhe,'ForwardingImmutableList',2006);bcb(714,1,Aie);_.vc=function cn(){return Wm(this)};_.wc=function en(a){stb(this,a)};_.ec=function jn(){return Xm(this)};_.yc=function kn(a,b,c){return ttb(this,a,b,c)};_.Cc=function rn(){return this.Ld()};_.$b=function Zm(){throw vbb(new bgb)};_._b=function $m(a){return this.xc(a)!=null};_.uc=function _m(a){return this.Ld().Hc(a)};_.Jd=function an(){return new jq(this)};_.Kd=function bn(){return new sq(this)};_.Fb=function dn(a){return Dv(this,a)};_.Hb=function gn(){return Wm(this).Hb()};_.dc=function hn(){return this.gc()==0};_.zc=function nn(a,b){return Ym()};_.Bc=function on(a){throw vbb(new bgb)};_.Ib=function pn(){return Jv(this)};_.Ld=function qn(){if(this.e){return this.e}return this.e=this.Kd()};_.c=null;_.d=null;_.e=null;var Um;var iG=mdb(Zhe,'ImmutableMap',714);bcb(715,714,Aie);_._b=function vn(a){return sn(this,a)};_.uc=function wn(a){return dob(this.b,a)};_.Id=function xn(){return Vn(new Ln(this))};_.Jd=function yn(){return Vn(gob(this.b))};_.Kd=function zn(){return Ql(),new Zl(hob(this.b))};_.Fb=function An(a){return fob(this.b,a)};_.xc=function Bn(a){return tn(this,a)};_.Hb=function Cn(){return tb(this.b.c)};_.dc=function Dn(){return this.b.c.dc()};_.gc=function En(){return this.b.c.gc()};_.Ib=function Fn(){return fcb(this.b.c)};var zF=mdb(Zhe,'ForwardingImmutableMap',715);bcb(1974,1973,Bie);_.Bd=function Gn(){return this.Md()};_.Cd=function Hn(){return this.Md()};_.Nc=function Kn(){return new Kub(this,1)};_.Fb=function In(a){return a===this||this.Md().Fb(a)};_.Hb=function Jn(){return this.Md().Hb()};var CF=mdb(Zhe,'ForwardingSet',1974);bcb(1069,1974,Bie,Ln);_.Bd=function Nn(){return eob(this.a.b)};_.Cd=function On(){return eob(this.a.b)};_.Hc=function Mn(b){if(JD(b,42)&&BD(b,42).cd()==null){return false}try{return Dob(eob(this.a.b),b)}catch(a){a=ubb(a);if(JD(a,205)){return false}else throw vbb(a)}};_.Md=function Pn(){return eob(this.a.b)};_.Qc=function Qn(a){var b;b=Eob(eob(this.a.b),a);eob(this.a.b).b.gc()=0?'+':'')+(c/60|0);b=kB($wnd.Math.abs(c)%60);return (Dpb(),Bpb)[this.q.getDay()]+' '+Cpb[this.q.getMonth()]+' '+kB(this.q.getDate())+' '+kB(this.q.getHours())+':'+kB(this.q.getMinutes())+':'+kB(this.q.getSeconds())+' GMT'+a+b+' '+this.q.getFullYear()};var $J=mdb(bie,'Date',199);bcb(1915,199,Cje,nB);_.a=false;_.b=0;_.c=0;_.d=0;_.e=0;_.f=0;_.g=false;_.i=0;_.j=0;_.k=0;_.n=0;_.o=0;_.p=0;var eI=mdb('com.google.gwt.i18n.shared.impl','DateRecord',1915);bcb(1966,1,{});_.fe=function oB(){return null};_.ge=function pB(){return null};_.he=function qB(){return null};_.ie=function rB(){return null};_.je=function sB(){return null};var nI=mdb(Dje,'JSONValue',1966);bcb(216,1966,{216:1},wB,xB);_.Fb=function yB(a){if(!JD(a,216)){return false}return qz(this.a,BD(a,216).a)};_.ee=function zB(){return DB};_.Hb=function AB(){return rz(this.a)};_.fe=function BB(){return this};_.Ib=function CB(){var a,b,c;c=new Wfb('[');for(b=0,a=this.a.length;b0&&(c.a+=',',c);Pfb(c,tB(this,b))}c.a+=']';return c.a};var fI=mdb(Dje,'JSONArray',216);bcb(483,1966,{483:1},HB);_.ee=function IB(){return LB};_.ge=function JB(){return this};_.Ib=function KB(){return Bcb(),''+this.a};_.a=false;var EB,FB;var gI=mdb(Dje,'JSONBoolean',483);bcb(985,60,Tie,MB);var hI=mdb(Dje,'JSONException',985);bcb(1023,1966,{},PB);_.ee=function QB(){return SB};_.Ib=function RB(){return Xhe};var NB;var iI=mdb(Dje,'JSONNull',1023);bcb(258,1966,{258:1},TB);_.Fb=function UB(a){if(!JD(a,258)){return false}return this.a==BD(a,258).a};_.ee=function VB(){return ZB};_.Hb=function WB(){return Hdb(this.a)};_.he=function XB(){return this};_.Ib=function YB(){return this.a+''};_.a=0;var jI=mdb(Dje,'JSONNumber',258);bcb(183,1966,{183:1},eC,fC);_.Fb=function gC(a){if(!JD(a,183)){return false}return qz(this.a,BD(a,183).a)};_.ee=function hC(){return lC};_.Hb=function iC(){return rz(this.a)};_.ie=function jC(){return this};_.Ib=function kC(){var a,b,c,d,e,f,g;g=new Wfb('{');a=true;f=$B(this,KC(ZI,nie,2,0,6,1));for(c=f,d=0,e=c.length;d=0?':'+this.c:'')+')'};_.c=0;var VI=mdb(Phe,'StackTraceElement',310);zD={3:1,475:1,35:1,2:1};var ZI=mdb(Phe,Vie,2);bcb(107,418,{475:1},Hfb,Ifb,Jfb);var WI=mdb(Phe,'StringBuffer',107);bcb(100,418,{475:1},Ufb,Vfb,Wfb);var XI=mdb(Phe,'StringBuilder',100);bcb(687,73,Mje,Xfb);var YI=mdb(Phe,'StringIndexOutOfBoundsException',687);bcb(2043,1,{});var Yfb;bcb(844,1,{},_fb);_.Kb=function agb(a){return BD(a,78).e};var $I=mdb(Phe,'Throwable/lambda$0$Type',844);bcb(41,60,{3:1,102:1,60:1,78:1,41:1},bgb,cgb);var aJ=mdb(Phe,'UnsupportedOperationException',41);bcb(240,236,{3:1,35:1,236:1,240:1},sgb,tgb);_.wd=function wgb(a){return mgb(this,BD(a,240))};_.ke=function xgb(){return Hcb(rgb(this))};_.Fb=function ygb(a){var b;if(this===a){return true}if(JD(a,240)){b=BD(a,240);return this.e==b.e&&mgb(this,b)==0}return false};_.Hb=function zgb(){var a;if(this.b!=0){return this.b}if(this.a<54){a=Cbb(this.f);this.b=Tbb(xbb(a,-1));this.b=33*this.b+Tbb(xbb(Obb(a,32),-1));this.b=17*this.b+QD(this.e);return this.b}this.b=17*Ngb(this.c)+QD(this.e);return this.b};_.Ib=function Agb(){return rgb(this)};_.a=0;_.b=0;_.d=0;_.e=0;_.f=0;var dgb,egb,fgb,ggb,hgb,igb,jgb,kgb;var bJ=mdb('java.math','BigDecimal',240);bcb(91,236,{3:1,35:1,236:1,91:1},Tgb,Ugb,Vgb,Wgb,Xgb,Ygb);_.wd=function $gb(a){return Igb(this,BD(a,91))};_.ke=function _gb(){return Hcb(shb(this,0))};_.Fb=function ahb(a){return Kgb(this,a)};_.Hb=function chb(){return Ngb(this)};_.Ib=function ehb(){return shb(this,0)};_.b=-2;_.c=0;_.d=0;_.e=0;var Bgb,Cgb,Dgb,Egb,Fgb,Ggb;var cJ=mdb('java.math','BigInteger',91);var nhb,ohb;var Bhb,Chb;bcb(488,1967,cie);_.$b=function Xhb(){Uhb(this)};_._b=function Yhb(a){return Mhb(this,a)};_.uc=function Zhb(a){return Nhb(this,a,this.g)||Nhb(this,a,this.f)};_.vc=function $hb(){return new eib(this)};_.xc=function _hb(a){return Ohb(this,a)};_.zc=function aib(a,b){return Rhb(this,a,b)};_.Bc=function bib(a){return Thb(this,a)};_.gc=function cib(){return Vhb(this)};var gJ=mdb(bie,'AbstractHashMap',488);bcb(261,eie,fie,eib);_.$b=function fib(){this.a.$b()};_.Hc=function gib(a){return dib(this,a)};_.Kc=function hib(){return new nib(this.a)};_.Mc=function iib(a){var b;if(dib(this,a)){b=BD(a,42).cd();this.a.Bc(b);return true}return false};_.gc=function jib(){return this.a.gc()};var fJ=mdb(bie,'AbstractHashMap/EntrySet',261);bcb(262,1,aie,nib);_.Nb=function oib(a){Rrb(this,a)};_.Pb=function qib(){return lib(this)};_.Ob=function pib(){return this.b};_.Qb=function rib(){mib(this)};_.b=false;var eJ=mdb(bie,'AbstractHashMap/EntrySetIterator',262);bcb(417,1,aie,vib);_.Nb=function wib(a){Rrb(this,a)};_.Ob=function xib(){return sib(this)};_.Pb=function yib(){return tib(this)};_.Qb=function zib(){uib(this)};_.b=0;_.c=-1;var hJ=mdb(bie,'AbstractList/IteratorImpl',417);bcb(96,417,jie,Bib);_.Qb=function Hib(){uib(this)};_.Rb=function Cib(a){Aib(this,a)};_.Sb=function Dib(){return this.b>0};_.Tb=function Eib(){return this.b};_.Ub=function Fib(){return sCb(this.b>0),this.a.Xb(this.c=--this.b)};_.Vb=function Gib(){return this.b-1};_.Wb=function Iib(a){yCb(this.c!=-1);this.a._c(this.c,a)};var iJ=mdb(bie,'AbstractList/ListIteratorImpl',96);bcb(219,52,Lie,Jib);_.Vc=function Kib(a,b){wCb(a,this.b);this.c.Vc(this.a+a,b);++this.b};_.Xb=function Lib(a){tCb(a,this.b);return this.c.Xb(this.a+a)};_.$c=function Mib(a){var b;tCb(a,this.b);b=this.c.$c(this.a+a);--this.b;return b};_._c=function Nib(a,b){tCb(a,this.b);return this.c._c(this.a+a,b)};_.gc=function Oib(){return this.b};_.a=0;_.b=0;var jJ=mdb(bie,'AbstractList/SubList',219);bcb(384,eie,fie,Pib);_.$b=function Qib(){this.a.$b()};_.Hc=function Rib(a){return this.a._b(a)};_.Kc=function Sib(){var a;return a=this.a.vc().Kc(),new Vib(a)};_.Mc=function Tib(a){if(this.a._b(a)){this.a.Bc(a);return true}return false};_.gc=function Uib(){return this.a.gc()};var mJ=mdb(bie,'AbstractMap/1',384);bcb(691,1,aie,Vib);_.Nb=function Wib(a){Rrb(this,a)};_.Ob=function Xib(){return this.a.Ob()};_.Pb=function Yib(){var a;return a=BD(this.a.Pb(),42),a.cd()};_.Qb=function Zib(){this.a.Qb()};var lJ=mdb(bie,'AbstractMap/1/1',691);bcb(226,28,die,$ib);_.$b=function _ib(){this.a.$b()};_.Hc=function ajb(a){return this.a.uc(a)};_.Kc=function bjb(){var a;return a=this.a.vc().Kc(),new djb(a)};_.gc=function cjb(){return this.a.gc()};var oJ=mdb(bie,'AbstractMap/2',226);bcb(294,1,aie,djb);_.Nb=function ejb(a){Rrb(this,a)};_.Ob=function fjb(){return this.a.Ob()};_.Pb=function gjb(){var a;return a=BD(this.a.Pb(),42),a.dd()};_.Qb=function hjb(){this.a.Qb()};var nJ=mdb(bie,'AbstractMap/2/1',294);bcb(484,1,{484:1,42:1});_.Fb=function jjb(a){var b;if(!JD(a,42)){return false}b=BD(a,42);return wtb(this.d,b.cd())&&wtb(this.e,b.dd())};_.cd=function kjb(){return this.d};_.dd=function ljb(){return this.e};_.Hb=function mjb(){return xtb(this.d)^xtb(this.e)};_.ed=function njb(a){return ijb(this,a)};_.Ib=function ojb(){return this.d+'='+this.e};var pJ=mdb(bie,'AbstractMap/AbstractEntry',484);bcb(383,484,{484:1,383:1,42:1},pjb);var qJ=mdb(bie,'AbstractMap/SimpleEntry',383);bcb(1984,1,_je);_.Fb=function qjb(a){var b;if(!JD(a,42)){return false}b=BD(a,42);return wtb(this.cd(),b.cd())&&wtb(this.dd(),b.dd())};_.Hb=function rjb(){return xtb(this.cd())^xtb(this.dd())};_.Ib=function sjb(){return this.cd()+'='+this.dd()};var rJ=mdb(bie,lie,1984);bcb(1992,1967,gie);_.tc=function vjb(a){return tjb(this,a)};_._b=function wjb(a){return ujb(this,a)};_.vc=function xjb(){return new Bjb(this)};_.xc=function yjb(a){var b;b=a;return Wd(Awb(this,b))};_.ec=function Ajb(){return new Gjb(this)};var wJ=mdb(bie,'AbstractNavigableMap',1992);bcb(739,eie,fie,Bjb);_.Hc=function Cjb(a){return JD(a,42)&&tjb(this.b,BD(a,42))};_.Kc=function Djb(){return new Ywb(this.b)};_.Mc=function Ejb(a){var b;if(JD(a,42)){b=BD(a,42);return Kwb(this.b,b)}return false};_.gc=function Fjb(){return this.b.c};var tJ=mdb(bie,'AbstractNavigableMap/EntrySet',739);bcb(493,eie,iie,Gjb);_.Nc=function Mjb(){return new Rub(this)};_.$b=function Hjb(){zwb(this.a)};_.Hc=function Ijb(a){return ujb(this.a,a)};_.Kc=function Jjb(){var a;return a=new Ywb((new cxb(this.a)).b),new Njb(a)};_.Mc=function Kjb(a){if(ujb(this.a,a)){Jwb(this.a,a);return true}return false};_.gc=function Ljb(){return this.a.c};var vJ=mdb(bie,'AbstractNavigableMap/NavigableKeySet',493);bcb(494,1,aie,Njb);_.Nb=function Ojb(a){Rrb(this,a)};_.Ob=function Pjb(){return sib(this.a.a)};_.Pb=function Qjb(){var a;return a=Wwb(this.a),a.cd()};_.Qb=function Rjb(){Xwb(this.a)};var uJ=mdb(bie,'AbstractNavigableMap/NavigableKeySet/1',494);bcb(2004,28,die);_.Fc=function Sjb(a){return zCb(cub(this,a)),true};_.Gc=function Tjb(a){uCb(a);mCb(a!=this,"Can't add a queue to itself");return ye(this,a)};_.$b=function Ujb(){while(dub(this)!=null);};var xJ=mdb(bie,'AbstractQueue',2004);bcb(302,28,{4:1,20:1,28:1,14:1},jkb,kkb);_.Fc=function lkb(a){return Xjb(this,a),true};_.$b=function nkb(){Yjb(this)};_.Hc=function okb(a){return Zjb(new xkb(this),a)};_.dc=function pkb(){return akb(this)};_.Kc=function qkb(){return new xkb(this)};_.Mc=function rkb(a){return dkb(new xkb(this),a)};_.gc=function skb(){return this.c-this.b&this.a.length-1};_.Nc=function tkb(){return new Kub(this,272)};_.Qc=function ukb(a){var b;b=this.c-this.b&this.a.length-1;a.lengthb&&NC(a,b,null);return a};_.b=0;_.c=0;var BJ=mdb(bie,'ArrayDeque',302);bcb(446,1,aie,xkb);_.Nb=function ykb(a){Rrb(this,a)};_.Ob=function zkb(){return this.a!=this.b};_.Pb=function Akb(){return vkb(this)};_.Qb=function Bkb(){wkb(this)};_.a=0;_.b=0;_.c=-1;var AJ=mdb(bie,'ArrayDeque/IteratorImpl',446);bcb(12,52,ake,Rkb,Skb,Tkb);_.Vc=function Ukb(a,b){Dkb(this,a,b)};_.Fc=function Vkb(a){return Ekb(this,a)};_.Wc=function Wkb(a,b){return Fkb(this,a,b)};_.Gc=function Xkb(a){return Gkb(this,a)};_.$b=function Ykb(){this.c=KC(SI,Uhe,1,0,5,1)};_.Hc=function Zkb(a){return Jkb(this,a,0)!=-1};_.Jc=function $kb(a){Hkb(this,a)};_.Xb=function _kb(a){return Ikb(this,a)};_.Xc=function alb(a){return Jkb(this,a,0)};_.dc=function blb(){return this.c.length==0};_.Kc=function clb(){return new olb(this)};_.$c=function dlb(a){return Kkb(this,a)};_.Mc=function elb(a){return Lkb(this,a)};_.Ud=function flb(a,b){Mkb(this,a,b)};_._c=function glb(a,b){return Nkb(this,a,b)};_.gc=function hlb(){return this.c.length};_.ad=function ilb(a){Okb(this,a)};_.Pc=function jlb(){return Pkb(this)};_.Qc=function klb(a){return Qkb(this,a)};var DJ=mdb(bie,'ArrayList',12);bcb(7,1,aie,olb);_.Nb=function plb(a){Rrb(this,a)};_.Ob=function qlb(){return llb(this)};_.Pb=function rlb(){return mlb(this)};_.Qb=function slb(){nlb(this)};_.a=0;_.b=-1;var CJ=mdb(bie,'ArrayList/1',7);bcb(2013,$wnd.Function,{},Ylb);_.te=function Zlb(a,b){return Kdb(a,b)};bcb(154,52,bke,amb);_.Hc=function bmb(a){return Bt(this,a)!=-1};_.Jc=function cmb(a){var b,c,d,e;uCb(a);for(c=this.a,d=0,e=c.length;d>>0,a.toString(16))};_.f=0;_.i=Qje;var PM=mdb(Gke,'CNode',57);bcb(814,1,{},zDb);var OM=mdb(Gke,'CNode/CNodeBuilder',814);var EDb;bcb(1525,1,{},GDb);_.Oe=function HDb(a,b){return 0};_.Pe=function IDb(a,b){return 0};var QM=mdb(Gke,Ike,1525);bcb(1790,1,{},JDb);_.Le=function KDb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;j=Pje;for(d=new olb(a.a.b);d.ad.d.c||d.d.c==f.d.c&&d.d.b0?a+this.n.d+this.n.a:0};_.Se=function HHb(){var a,b,c,d,e;e=0;if(this.e){this.b?(e=this.b.a):!!this.a[1][1]&&(e=this.a[1][1].Se())}else if(this.g){e=EHb(this,yHb(this,null,true))}else{for(b=(gHb(),OC(GC(pN,1),Kie,232,0,[dHb,eHb,fHb])),c=0,d=b.length;c0?e+this.n.b+this.n.c:0};_.Te=function IHb(){var a,b,c,d,e;if(this.g){a=yHb(this,null,false);for(c=(gHb(),OC(GC(pN,1),Kie,232,0,[dHb,eHb,fHb])),d=0,e=c.length;d0){d[0]+=this.d;c-=d[0]}if(d[2]>0){d[2]+=this.d;c-=d[2]}this.c.a=$wnd.Math.max(0,c);this.c.d=b.d+a.d+(this.c.a-c)/2;d[1]=$wnd.Math.max(d[1],c);uHb(this,eHb,b.d+a.d+d[0]-(d[1]-c)/2,d)};_.b=null;_.d=0;_.e=false;_.f=false;_.g=false;var rHb=0,sHb=0;var rN=mdb(fle,'GridContainerCell',1473);bcb(461,22,{3:1,35:1,22:1,461:1},OHb);var KHb,LHb,MHb;var sN=ndb(fle,'HorizontalLabelAlignment',461,CI,QHb,PHb);var RHb;bcb(306,212,{212:1,306:1},aIb,bIb,cIb);_.Re=function dIb(){return YHb(this)};_.Se=function eIb(){return ZHb(this)};_.a=0;_.c=false;var tN=mdb(fle,'LabelCell',306);bcb(244,326,{212:1,326:1,244:1},mIb);_.Re=function nIb(){return fIb(this)};_.Se=function oIb(){return gIb(this)};_.Te=function rIb(){hIb(this)};_.Ue=function sIb(){iIb(this)};_.b=0;_.c=0;_.d=false;var yN=mdb(fle,'StripContainerCell',244);bcb(1626,1,Oie,tIb);_.Mb=function uIb(a){return pIb(BD(a,212))};var uN=mdb(fle,'StripContainerCell/lambda$0$Type',1626);bcb(1627,1,{},vIb);_.Fe=function wIb(a){return BD(a,212).Se()};var vN=mdb(fle,'StripContainerCell/lambda$1$Type',1627);bcb(1628,1,Oie,xIb);_.Mb=function yIb(a){return qIb(BD(a,212))};var wN=mdb(fle,'StripContainerCell/lambda$2$Type',1628);bcb(1629,1,{},zIb);_.Fe=function AIb(a){return BD(a,212).Re()};var xN=mdb(fle,'StripContainerCell/lambda$3$Type',1629);bcb(462,22,{3:1,35:1,22:1,462:1},FIb);var BIb,CIb,DIb;var zN=ndb(fle,'VerticalLabelAlignment',462,CI,HIb,GIb);var IIb;bcb(789,1,{},LIb);_.c=0;_.d=0;_.k=0;_.s=0;_.t=0;_.v=false;_.w=0;_.D=false;var CN=mdb(nle,'NodeContext',789);bcb(1471,1,Dke,OIb);_.ue=function PIb(a,b){return NIb(BD(a,61),BD(b,61))};_.Fb=function QIb(a){return this===a};_.ve=function RIb(){return new tpb(this)};var AN=mdb(nle,'NodeContext/0methodref$comparePortSides$Type',1471);bcb(1472,1,Dke,SIb);_.ue=function TIb(a,b){return MIb(BD(a,111),BD(b,111))};_.Fb=function UIb(a){return this===a};_.ve=function VIb(){return new tpb(this)};var BN=mdb(nle,'NodeContext/1methodref$comparePortContexts$Type',1472);bcb(159,22,{3:1,35:1,22:1,159:1},tJb);var WIb,XIb,YIb,ZIb,$Ib,_Ib,aJb,bJb,cJb,dJb,eJb,fJb,gJb,hJb,iJb,jJb,kJb,lJb,mJb,nJb,oJb,pJb;var DN=ndb(nle,'NodeLabelLocation',159,CI,wJb,vJb);var xJb;bcb(111,1,{111:1},AJb);_.a=false;var EN=mdb(nle,'PortContext',111);bcb(1476,1,qie,TJb);_.td=function UJb(a){WHb(BD(a,306))};var FN=mdb(qle,rle,1476);bcb(1477,1,Oie,VJb);_.Mb=function WJb(a){return !!BD(a,111).c};var GN=mdb(qle,sle,1477);bcb(1478,1,qie,XJb);_.td=function YJb(a){WHb(BD(a,111).c)};var HN=mdb(qle,'LabelPlacer/lambda$2$Type',1478);var ZJb;bcb(1475,1,qie,fKb);_.td=function gKb(a){$Jb();zJb(BD(a,111))};var IN=mdb(qle,'NodeLabelAndSizeUtilities/lambda$0$Type',1475);bcb(790,1,qie,mKb);_.td=function nKb(a){kKb(this.b,this.c,this.a,BD(a,181))};_.a=false;_.c=false;var JN=mdb(qle,'NodeLabelCellCreator/lambda$0$Type',790);bcb(1474,1,qie,tKb);_.td=function uKb(a){sKb(this.a,BD(a,181))};var KN=mdb(qle,'PortContextCreator/lambda$0$Type',1474);var BKb;bcb(1829,1,{},VKb);var MN=mdb(ule,'GreedyRectangleStripOverlapRemover',1829);bcb(1830,1,Dke,XKb);_.ue=function YKb(a,b){return WKb(BD(a,222),BD(b,222))};_.Fb=function ZKb(a){return this===a};_.ve=function $Kb(){return new tpb(this)};var LN=mdb(ule,'GreedyRectangleStripOverlapRemover/0methodref$compareByYCoordinate$Type',1830);bcb(1786,1,{},fLb);_.a=5;_.e=0;var SN=mdb(ule,'RectangleStripOverlapRemover',1786);bcb(1787,1,Dke,jLb);_.ue=function kLb(a,b){return gLb(BD(a,222),BD(b,222))};_.Fb=function lLb(a){return this===a};_.ve=function mLb(){return new tpb(this)};var NN=mdb(ule,'RectangleStripOverlapRemover/0methodref$compareLeftRectangleBorders$Type',1787);bcb(1789,1,Dke,nLb);_.ue=function oLb(a,b){return hLb(BD(a,222),BD(b,222))};_.Fb=function pLb(a){return this===a};_.ve=function qLb(){return new tpb(this)};var ON=mdb(ule,'RectangleStripOverlapRemover/1methodref$compareRightRectangleBorders$Type',1789);bcb(406,22,{3:1,35:1,22:1,406:1},wLb);var rLb,sLb,tLb,uLb;var PN=ndb(ule,'RectangleStripOverlapRemover/OverlapRemovalDirection',406,CI,yLb,xLb);var zLb;bcb(222,1,{222:1},BLb);var QN=mdb(ule,'RectangleStripOverlapRemover/RectangleNode',222);bcb(1788,1,qie,CLb);_.td=function DLb(a){aLb(this.a,BD(a,222))};var RN=mdb(ule,'RectangleStripOverlapRemover/lambda$1$Type',1788);bcb(1304,1,Dke,GLb);_.ue=function HLb(a,b){return FLb(BD(a,167),BD(b,167))};_.Fb=function ILb(a){return this===a};_.ve=function JLb(){return new tpb(this)};var WN=mdb(wle,'PolyominoCompactor/CornerCasesGreaterThanRestComparator',1304);bcb(1307,1,{},KLb);_.Kb=function LLb(a){return BD(a,324).a};var TN=mdb(wle,'PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$0$Type',1307);bcb(1308,1,Oie,MLb);_.Mb=function NLb(a){return BD(a,323).a};var UN=mdb(wle,'PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$1$Type',1308);bcb(1309,1,Oie,OLb);_.Mb=function PLb(a){return BD(a,323).a};var VN=mdb(wle,'PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$2$Type',1309);bcb(1302,1,Dke,RLb);_.ue=function SLb(a,b){return QLb(BD(a,167),BD(b,167))};_.Fb=function TLb(a){return this===a};_.ve=function ULb(){return new tpb(this)};var YN=mdb(wle,'PolyominoCompactor/MinNumOfExtensionDirectionsComparator',1302);bcb(1305,1,{},VLb);_.Kb=function WLb(a){return BD(a,324).a};var XN=mdb(wle,'PolyominoCompactor/MinNumOfExtensionDirectionsComparator/lambda$0$Type',1305);bcb(767,1,Dke,YLb);_.ue=function ZLb(a,b){return XLb(BD(a,167),BD(b,167))};_.Fb=function $Lb(a){return this===a};_.ve=function _Lb(){return new tpb(this)};var ZN=mdb(wle,'PolyominoCompactor/MinNumOfExtensionsComparator',767);bcb(1300,1,Dke,bMb);_.ue=function cMb(a,b){return aMb(BD(a,321),BD(b,321))};_.Fb=function dMb(a){return this===a};_.ve=function eMb(){return new tpb(this)};var _N=mdb(wle,'PolyominoCompactor/MinPerimeterComparator',1300);bcb(1301,1,Dke,gMb);_.ue=function hMb(a,b){return fMb(BD(a,321),BD(b,321))};_.Fb=function iMb(a){return this===a};_.ve=function jMb(){return new tpb(this)};var $N=mdb(wle,'PolyominoCompactor/MinPerimeterComparatorWithShape',1301);bcb(1303,1,Dke,lMb);_.ue=function mMb(a,b){return kMb(BD(a,167),BD(b,167))};_.Fb=function nMb(a){return this===a};_.ve=function oMb(){return new tpb(this)};var bO=mdb(wle,'PolyominoCompactor/SingleExtensionSideGreaterThanRestComparator',1303);bcb(1306,1,{},pMb);_.Kb=function qMb(a){return BD(a,324).a};var aO=mdb(wle,'PolyominoCompactor/SingleExtensionSideGreaterThanRestComparator/lambda$0$Type',1306);bcb(777,1,{},tMb);_.Ce=function uMb(a,b){return sMb(this,BD(a,46),BD(b,167))};var cO=mdb(wle,'SuccessorCombination',777);bcb(644,1,{},wMb);_.Ce=function xMb(a,b){var c;return vMb((c=BD(a,46),BD(b,167),c))};var dO=mdb(wle,'SuccessorJitter',644);bcb(643,1,{},zMb);_.Ce=function AMb(a,b){var c;return yMb((c=BD(a,46),BD(b,167),c))};var eO=mdb(wle,'SuccessorLineByLine',643);bcb(568,1,{},CMb);_.Ce=function DMb(a,b){var c;return BMb((c=BD(a,46),BD(b,167),c))};var fO=mdb(wle,'SuccessorManhattan',568);bcb(1356,1,{},FMb);_.Ce=function GMb(a,b){var c;return EMb((c=BD(a,46),BD(b,167),c))};var gO=mdb(wle,'SuccessorMaxNormWindingInMathPosSense',1356);bcb(400,1,{},JMb);_.Ce=function KMb(a,b){return HMb(this,a,b)};_.c=false;_.d=false;_.e=false;_.f=false;var iO=mdb(wle,'SuccessorQuadrantsGeneric',400);bcb(1357,1,{},LMb);_.Kb=function MMb(a){return BD(a,324).a};var hO=mdb(wle,'SuccessorQuadrantsGeneric/lambda$0$Type',1357);bcb(323,22,{3:1,35:1,22:1,323:1},SMb);_.a=false;var NMb,OMb,PMb,QMb;var jO=ndb(Ble,Cle,323,CI,UMb,TMb);var VMb;bcb(1298,1,{});_.Ib=function bNb(){var a,b,c,d,e,f;c=' ';a=meb(0);for(e=0;e=0?'b'+a+'['+fRb(this.a)+']':'b['+fRb(this.a)+']'}return 'b_'+FCb(this)};var YO=mdb(jme,'FBendpoint',559);bcb(282,134,{3:1,282:1,94:1,134:1},gRb);_.Ib=function hRb(){return fRb(this)};var ZO=mdb(jme,'FEdge',282);bcb(231,134,{3:1,231:1,94:1,134:1},kRb);var $O=mdb(jme,'FGraph',231);bcb(447,357,{3:1,447:1,357:1,94:1,134:1},mRb);_.Ib=function nRb(){return this.b==null||this.b.length==0?'l['+fRb(this.a)+']':'l_'+this.b};var _O=mdb(jme,'FLabel',447);bcb(144,357,{3:1,144:1,357:1,94:1,134:1},pRb);_.Ib=function qRb(){return oRb(this)};_.b=0;var aP=mdb(jme,'FNode',144);bcb(2003,1,{});_.bf=function vRb(a){rRb(this,a)};_.cf=function wRb(){sRb(this)};_.d=0;var cP=mdb(lme,'AbstractForceModel',2003);bcb(631,2003,{631:1},xRb);_.af=function zRb(a,b){var c,d,e,f,g;uRb(this.f,a,b);e=c7c(R6c(b.d),a.d);g=$wnd.Math.sqrt(e.a*e.a+e.b*e.b);d=$wnd.Math.max(0,g-U6c(a.e)/2-U6c(b.e)/2);c=jRb(this.e,a,b);c>0?(f=-yRb(d,this.c)*c):(f=CRb(d,this.b)*BD(vNb(a,(wSb(),oSb)),19).a);Y6c(e,f/g);return e};_.bf=function ARb(a){rRb(this,a);this.a=BD(vNb(a,(wSb(),eSb)),19).a;this.c=Edb(ED(vNb(a,uSb)));this.b=Edb(ED(vNb(a,qSb)))};_.df=function BRb(a){return a0&&(f-=ERb(d,this.a)*c);Y6c(e,f*this.b/g);return e};_.bf=function GRb(a){var b,c,d,e,f,g,h;rRb(this,a);this.b=Edb(ED(vNb(a,(wSb(),vSb))));this.c=this.b/BD(vNb(a,eSb),19).a;d=a.e.c.length;f=0;e=0;for(h=new olb(a.e);h.a0};_.a=0;_.b=0;_.c=0;var eP=mdb(lme,'FruchtermanReingoldModel',632);bcb(849,1,ale,TRb);_.Qe=function URb(a){t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,mme),''),'Force Model'),'Determines the model for force calculation.'),MRb),(_5c(),V5c)),gP),pqb((N5c(),L5c)))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,nme),''),'Iterations'),'The number of iterations on the force model.'),meb(300)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ome),''),'Repulsive Power'),'Determines how many bend points are added to the edge; such bend points are regarded as repelling particles in the force model'),meb(0)),X5c),JI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,pme),''),'FR Temperature'),'The temperature is used as a scaling factor for particle displacements.'),qme),U5c),BI),pqb(L5c))));o4c(a,pme,mme,RRb);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,rme),''),'Eades Repulsion'),"Factor for repulsive forces in Eades' model."),5),U5c),BI),pqb(L5c))));o4c(a,rme,mme,ORb);xSb((new ySb,a))};var KRb,LRb,MRb,NRb,ORb,PRb,QRb,RRb;var fP=mdb(sme,'ForceMetaDataProvider',849);bcb(424,22,{3:1,35:1,22:1,424:1},YRb);var VRb,WRb;var gP=ndb(sme,'ForceModelStrategy',424,CI,$Rb,ZRb);var _Rb;bcb(988,1,ale,ySb);_.Qe=function zSb(a){xSb(a)};var bSb,cSb,dSb,eSb,fSb,gSb,hSb,iSb,jSb,kSb,lSb,mSb,nSb,oSb,pSb,qSb,rSb,sSb,tSb,uSb,vSb;var iP=mdb(sme,'ForceOptions',988);bcb(989,1,{},ASb);_.$e=function BSb(){var a;return a=new ZQb,a};_._e=function CSb(a){};var hP=mdb(sme,'ForceOptions/ForceFactory',989);var DSb,ESb,FSb,GSb;bcb(850,1,ale,PSb);_.Qe=function QSb(a){t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Mme),''),'Fixed Position'),'Prevent that the node is moved by the layout algorithm.'),(Bcb(),false)),(_5c(),T5c)),wI),pqb((N5c(),K5c)))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Nme),''),'Desired Edge Length'),'Either specified for parent nodes or for individual edges, where the latter takes higher precedence.'),100),U5c),BI),qqb(L5c,OC(GC(e1,1),Kie,175,0,[I5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ome),''),'Layout Dimension'),'Dimensions that are permitted to be altered during layout.'),KSb),V5c),oP),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Pme),''),'Stress Epsilon'),'Termination criterion for the iterative process.'),qme),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Qme),''),'Iteration Limit'),"Maximum number of performed iterations. Takes higher precedence than 'epsilon'."),meb(Ohe)),X5c),JI),pqb(L5c))));cTb((new dTb,a))};var ISb,JSb,KSb,LSb,MSb,NSb;var jP=mdb(sme,'StressMetaDataProvider',850);bcb(992,1,ale,dTb);_.Qe=function eTb(a){cTb(a)};var RSb,SSb,TSb,USb,VSb,WSb,XSb,YSb,ZSb,$Sb,_Sb,aTb;var lP=mdb(sme,'StressOptions',992);bcb(993,1,{},fTb);_.$e=function gTb(){var a;return a=new iTb,a};_._e=function hTb(a){};var kP=mdb(sme,'StressOptions/StressFactory',993);bcb(1128,209,Mle,iTb);_.Ze=function jTb(a,b){var c,d,e,f,g;Odd(b,Sme,1);Ccb(DD(hkd(a,(bTb(),VSb))))?Ccb(DD(hkd(a,_Sb)))||$Cb((c=new _Cb((Pgd(),new bhd(a))),c)):WQb(new ZQb,a,Udd(b,1));e=TQb(a);d=LQb(this.a,e);for(g=d.Kc();g.Ob();){f=BD(g.Pb(),231);if(f.e.c.length<=1){continue}sTb(this.b,f);qTb(this.b);Hkb(f.d,new kTb)}e=KQb(d);SQb(e);Qdd(b)};var nP=mdb(Ume,'StressLayoutProvider',1128);bcb(1129,1,qie,kTb);_.td=function lTb(a){lRb(BD(a,447))};var mP=mdb(Ume,'StressLayoutProvider/lambda$0$Type',1129);bcb(990,1,{},tTb);_.c=0;_.e=0;_.g=0;var qP=mdb(Ume,'StressMajorization',990);bcb(379,22,{3:1,35:1,22:1,379:1},zTb);var vTb,wTb,xTb;var oP=ndb(Ume,'StressMajorization/Dimension',379,CI,BTb,ATb);var CTb;bcb(991,1,Dke,ETb);_.ue=function FTb(a,b){return uTb(this.a,BD(a,144),BD(b,144))};_.Fb=function GTb(a){return this===a};_.ve=function HTb(){return new tpb(this)};var pP=mdb(Ume,'StressMajorization/lambda$0$Type',991);bcb(1229,1,{},PTb);var tP=mdb(Wme,'ElkLayered',1229);bcb(1230,1,qie,STb);_.td=function TTb(a){QTb(BD(a,37))};var rP=mdb(Wme,'ElkLayered/lambda$0$Type',1230);bcb(1231,1,qie,UTb);_.td=function VTb(a){RTb(this.a,BD(a,37))};var sP=mdb(Wme,'ElkLayered/lambda$1$Type',1231);bcb(1263,1,{},bUb);var WTb,XTb,YTb;var xP=mdb(Wme,'GraphConfigurator',1263);bcb(759,1,qie,dUb);_.td=function eUb(a){$Tb(this.a,BD(a,10))};var uP=mdb(Wme,'GraphConfigurator/lambda$0$Type',759);bcb(760,1,{},fUb);_.Kb=function gUb(a){return ZTb(),new YAb(null,new Kub(BD(a,29).a,16))};var vP=mdb(Wme,'GraphConfigurator/lambda$1$Type',760);bcb(761,1,qie,hUb);_.td=function iUb(a){$Tb(this.a,BD(a,10))};var wP=mdb(Wme,'GraphConfigurator/lambda$2$Type',761);bcb(1127,209,Mle,jUb);_.Ze=function kUb(a,b){var c;c=U1b(new a2b,a);PD(hkd(a,(Nyc(),axc)))===PD((hbd(),ebd))?JTb(this.a,c,b):KTb(this.a,c,b);z2b(new D2b,c)};var yP=mdb(Wme,'LayeredLayoutProvider',1127);bcb(356,22,{3:1,35:1,22:1,356:1},rUb);var lUb,mUb,nUb,oUb,pUb;var zP=ndb(Wme,'LayeredPhases',356,CI,tUb,sUb);var uUb;bcb(1651,1,{},CUb);_.i=0;var wUb;var CP=mdb(Xme,'ComponentsToCGraphTransformer',1651);var hVb;bcb(1652,1,{},DUb);_.ef=function EUb(a,b){return $wnd.Math.min(a.a!=null?Edb(a.a):a.c.i,b.a!=null?Edb(b.a):b.c.i)};_.ff=function FUb(a,b){return $wnd.Math.min(a.a!=null?Edb(a.a):a.c.i,b.a!=null?Edb(b.a):b.c.i)};var AP=mdb(Xme,'ComponentsToCGraphTransformer/1',1652);bcb(81,1,{81:1});_.i=0;_.k=true;_.o=Qje;var IP=mdb(Yme,'CNode',81);bcb(460,81,{460:1,81:1},GUb,HUb);_.Ib=function IUb(){return ''};var BP=mdb(Xme,'ComponentsToCGraphTransformer/CRectNode',460);bcb(1623,1,{},VUb);var JUb,KUb;var FP=mdb(Xme,'OneDimensionalComponentsCompaction',1623);bcb(1624,1,{},YUb);_.Kb=function ZUb(a){return WUb(BD(a,46))};_.Fb=function $Ub(a){return this===a};var DP=mdb(Xme,'OneDimensionalComponentsCompaction/lambda$0$Type',1624);bcb(1625,1,{},_Ub);_.Kb=function aVb(a){return XUb(BD(a,46))};_.Fb=function bVb(a){return this===a};var EP=mdb(Xme,'OneDimensionalComponentsCompaction/lambda$1$Type',1625);bcb(1654,1,{},dVb);var GP=mdb(Yme,'CGraph',1654);bcb(189,1,{189:1},gVb);_.b=0;_.c=0;_.e=0;_.g=true;_.i=Qje;var HP=mdb(Yme,'CGroup',189);bcb(1653,1,{},jVb);_.ef=function kVb(a,b){return $wnd.Math.max(a.a!=null?Edb(a.a):a.c.i,b.a!=null?Edb(b.a):b.c.i)};_.ff=function lVb(a,b){return $wnd.Math.max(a.a!=null?Edb(a.a):a.c.i,b.a!=null?Edb(b.a):b.c.i)};var JP=mdb(Yme,Ike,1653);bcb(1655,1,{},CVb);_.d=false;var mVb;var LP=mdb(Yme,Nke,1655);bcb(1656,1,{},DVb);_.Kb=function EVb(a){return nVb(),Bcb(),BD(BD(a,46).a,81).d.e!=0?true:false};_.Fb=function FVb(a){return this===a};var KP=mdb(Yme,Oke,1656);bcb(823,1,{},IVb);_.a=false;_.b=false;_.c=false;_.d=false;var MP=mdb(Yme,Pke,823);bcb(1825,1,{},OVb);var RP=mdb(Zme,Qke,1825);var bQ=odb($me,Fke);bcb(1826,1,{369:1},SVb);_.Ke=function TVb(a){QVb(this,BD(a,466))};var OP=mdb(Zme,Rke,1826);bcb(1827,1,Dke,VVb);_.ue=function WVb(a,b){return UVb(BD(a,81),BD(b,81))};_.Fb=function XVb(a){return this===a};_.ve=function YVb(){return new tpb(this)};var NP=mdb(Zme,Ske,1827);bcb(466,1,{466:1},ZVb);_.a=false;var PP=mdb(Zme,Tke,466);bcb(1828,1,Dke,$Vb);_.ue=function _Vb(a,b){return PVb(BD(a,466),BD(b,466))};_.Fb=function aWb(a){return this===a};_.ve=function bWb(){return new tpb(this)};var QP=mdb(Zme,Uke,1828);bcb(140,1,{140:1},cWb,dWb);_.Fb=function eWb(a){var b;if(a==null){return false}if(TP!=rb(a)){return false}b=BD(a,140);return wtb(this.c,b.c)&&wtb(this.d,b.d)};_.Hb=function fWb(){return Hlb(OC(GC(SI,1),Uhe,1,5,[this.c,this.d]))};_.Ib=function gWb(){return '('+this.c+She+this.d+(this.a?'cx':'')+this.b+')'};_.a=true;_.c=0;_.d=0;var TP=mdb($me,'Point',140);bcb(405,22,{3:1,35:1,22:1,405:1},oWb);var hWb,iWb,jWb,kWb;var SP=ndb($me,'Point/Quadrant',405,CI,sWb,rWb);var tWb;bcb(1642,1,{},CWb);_.b=null;_.c=null;_.d=null;_.e=null;_.f=null;var vWb,wWb,xWb,yWb,zWb;var aQ=mdb($me,'RectilinearConvexHull',1642);bcb(574,1,{369:1},NWb);_.Ke=function OWb(a){MWb(this,BD(a,140))};_.b=0;var KWb;var VP=mdb($me,'RectilinearConvexHull/MaximalElementsEventHandler',574);bcb(1644,1,Dke,QWb);_.ue=function RWb(a,b){return PWb(ED(a),ED(b))};_.Fb=function SWb(a){return this===a};_.ve=function TWb(){return new tpb(this)};var UP=mdb($me,'RectilinearConvexHull/MaximalElementsEventHandler/lambda$0$Type',1644);bcb(1643,1,{369:1},VWb);_.Ke=function WWb(a){UWb(this,BD(a,140))};_.a=0;_.b=null;_.c=null;_.d=null;_.e=null;var WP=mdb($me,'RectilinearConvexHull/RectangleEventHandler',1643);bcb(1645,1,Dke,XWb);_.ue=function YWb(a,b){return EWb(BD(a,140),BD(b,140))};_.Fb=function ZWb(a){return this===a};_.ve=function $Wb(){return new tpb(this)};var XP=mdb($me,'RectilinearConvexHull/lambda$0$Type',1645);bcb(1646,1,Dke,_Wb);_.ue=function aXb(a,b){return FWb(BD(a,140),BD(b,140))};_.Fb=function bXb(a){return this===a};_.ve=function cXb(){return new tpb(this)};var YP=mdb($me,'RectilinearConvexHull/lambda$1$Type',1646);bcb(1647,1,Dke,dXb);_.ue=function eXb(a,b){return GWb(BD(a,140),BD(b,140))};_.Fb=function fXb(a){return this===a};_.ve=function gXb(){return new tpb(this)};var ZP=mdb($me,'RectilinearConvexHull/lambda$2$Type',1647);bcb(1648,1,Dke,hXb);_.ue=function iXb(a,b){return HWb(BD(a,140),BD(b,140))};_.Fb=function jXb(a){return this===a};_.ve=function kXb(){return new tpb(this)};var $P=mdb($me,'RectilinearConvexHull/lambda$3$Type',1648);bcb(1649,1,Dke,lXb);_.ue=function mXb(a,b){return IWb(BD(a,140),BD(b,140))};_.Fb=function nXb(a){return this===a};_.ve=function oXb(){return new tpb(this)};var _P=mdb($me,'RectilinearConvexHull/lambda$4$Type',1649);bcb(1650,1,{},qXb);var cQ=mdb($me,'Scanline',1650);bcb(2005,1,{});var dQ=mdb(_me,'AbstractGraphPlacer',2005);bcb(325,1,{325:1},AXb);_.mf=function BXb(a){if(this.nf(a)){Rc(this.b,BD(vNb(a,(wtc(),Esc)),21),a);return true}else{return false}};_.nf=function CXb(a){var b,c,d,e;b=BD(vNb(a,(wtc(),Esc)),21);e=BD(Qc(wXb,b),21);for(d=e.Kc();d.Ob();){c=BD(d.Pb(),21);if(!BD(Qc(this.b,c),15).dc()){return false}}return true};var wXb;var gQ=mdb(_me,'ComponentGroup',325);bcb(765,2005,{},HXb);_.of=function IXb(a){var b,c;for(c=new olb(this.a);c.an){v=0;w+=m+e;m=0}q=g.c;uXb(g,v+q.a,w+q.b);X6c(q);c=$wnd.Math.max(c,v+s.a);m=$wnd.Math.max(m,s.b);v+=s.a+e}b.f.a=c;b.f.b=w+m;if(Ccb(DD(vNb(f,qwc)))){d=new gYb;YXb(d,a,e);for(l=a.Kc();l.Ob();){k=BD(l.Pb(),37);P6c(X6c(k.c),d.e)}P6c(X6c(b.f),d.a)}tXb(b,a)};var uQ=mdb(_me,'SimpleRowGraphPlacer',1291);bcb(1292,1,Dke,VYb);_.ue=function WYb(a,b){return UYb(BD(a,37),BD(b,37))};_.Fb=function XYb(a){return this===a};_.ve=function YYb(){return new tpb(this)};var tQ=mdb(_me,'SimpleRowGraphPlacer/1',1292);var ZYb;bcb(1262,1,Vke,dZb);_.Lb=function eZb(a){var b;return b=BD(vNb(BD(a,243).b,(Nyc(),jxc)),74),!!b&&b.b!=0};_.Fb=function fZb(a){return this===a};_.Mb=function gZb(a){var b;return b=BD(vNb(BD(a,243).b,(Nyc(),jxc)),74),!!b&&b.b!=0};var vQ=mdb(dne,'CompoundGraphPostprocessor/1',1262);bcb(1261,1,ene,wZb);_.pf=function xZb(a,b){qZb(this,BD(a,37),b)};var xQ=mdb(dne,'CompoundGraphPreprocessor',1261);bcb(441,1,{441:1},yZb);_.c=false;var wQ=mdb(dne,'CompoundGraphPreprocessor/ExternalPort',441);bcb(243,1,{243:1},BZb);_.Ib=function CZb(){return Zr(this.c)+':'+TZb(this.b)};var zQ=mdb(dne,'CrossHierarchyEdge',243);bcb(763,1,Dke,EZb);_.ue=function FZb(a,b){return DZb(this,BD(a,243),BD(b,243))};_.Fb=function GZb(a){return this===a};_.ve=function IZb(){return new tpb(this)};var yQ=mdb(dne,'CrossHierarchyEdgeComparator',763);bcb(299,134,{3:1,299:1,94:1,134:1});_.p=0;var JQ=mdb(fne,'LGraphElement',299);bcb(17,299,{3:1,17:1,299:1,94:1,134:1},UZb);_.Ib=function VZb(){return TZb(this)};var AQ=mdb(fne,'LEdge',17);bcb(37,299,{3:1,20:1,37:1,299:1,94:1,134:1},XZb);_.Jc=function YZb(a){reb(this,a)};_.Kc=function ZZb(){return new olb(this.b)};_.Ib=function $Zb(){if(this.b.c.length==0){return 'G-unlayered'+Fe(this.a)}else if(this.a.c.length==0){return 'G-layered'+Fe(this.b)}return 'G[layerless'+Fe(this.a)+', layers'+Fe(this.b)+']'};var KQ=mdb(fne,'LGraph',37);var _Zb;bcb(657,1,{});_.qf=function b$b(){return this.e.n};_.We=function c$b(a){return vNb(this.e,a)};_.rf=function d$b(){return this.e.o};_.sf=function e$b(){return this.e.p};_.Xe=function f$b(a){return wNb(this.e,a)};_.tf=function g$b(a){this.e.n.a=a.a;this.e.n.b=a.b};_.uf=function h$b(a){this.e.o.a=a.a;this.e.o.b=a.b};_.vf=function i$b(a){this.e.p=a};var BQ=mdb(fne,'LGraphAdapters/AbstractLShapeAdapter',657);bcb(577,1,{839:1},j$b);_.wf=function k$b(){var a,b;if(!this.b){this.b=Pu(this.a.b.c.length);for(b=new olb(this.a.b);b.a0&&E_b((BCb(c-1,b.length),b.charCodeAt(c-1)),nne)){--c}if(g> ',a),C0b(c));Qfb(Pfb((a.a+='[',a),c.i),']')}return a.a};_.c=true;_.d=false;var t0b,u0b,v0b,w0b,x0b,y0b;var aR=mdb(fne,'LPort',11);bcb(397,1,vie,J0b);_.Jc=function K0b(a){reb(this,a)};_.Kc=function L0b(){var a;a=new olb(this.a.e);return new M0b(a)};var RQ=mdb(fne,'LPort/1',397);bcb(1290,1,aie,M0b);_.Nb=function N0b(a){Rrb(this,a)};_.Pb=function P0b(){return BD(mlb(this.a),17).c};_.Ob=function O0b(){return llb(this.a)};_.Qb=function Q0b(){nlb(this.a)};var QQ=mdb(fne,'LPort/1/1',1290);bcb(359,1,vie,R0b);_.Jc=function S0b(a){reb(this,a)};_.Kc=function T0b(){var a;return a=new olb(this.a.g),new U0b(a)};var TQ=mdb(fne,'LPort/2',359);bcb(762,1,aie,U0b);_.Nb=function V0b(a){Rrb(this,a)};_.Pb=function X0b(){return BD(mlb(this.a),17).d};_.Ob=function W0b(){return llb(this.a)};_.Qb=function Y0b(){nlb(this.a)};var SQ=mdb(fne,'LPort/2/1',762);bcb(1283,1,vie,Z0b);_.Jc=function $0b(a){reb(this,a)};_.Kc=function _0b(){return new b1b(this)};var VQ=mdb(fne,'LPort/CombineIter',1283);bcb(201,1,aie,b1b);_.Nb=function c1b(a){Rrb(this,a)};_.Qb=function f1b(){Srb()};_.Ob=function d1b(){return a1b(this)};_.Pb=function e1b(){return llb(this.a)?mlb(this.a):mlb(this.b)};var UQ=mdb(fne,'LPort/CombineIter/1',201);bcb(1285,1,Vke,h1b);_.Lb=function i1b(a){return g1b(a)};_.Fb=function j1b(a){return this===a};_.Mb=function k1b(a){return z0b(),BD(a,11).e.c.length!=0};var WQ=mdb(fne,'LPort/lambda$0$Type',1285);bcb(1284,1,Vke,m1b);_.Lb=function n1b(a){return l1b(a)};_.Fb=function o1b(a){return this===a};_.Mb=function p1b(a){return z0b(),BD(a,11).g.c.length!=0};var XQ=mdb(fne,'LPort/lambda$1$Type',1284);bcb(1286,1,Vke,q1b);_.Lb=function r1b(a){return z0b(),BD(a,11).j==(Ucd(),Acd)};_.Fb=function s1b(a){return this===a};_.Mb=function t1b(a){return z0b(),BD(a,11).j==(Ucd(),Acd)};var YQ=mdb(fne,'LPort/lambda$2$Type',1286);bcb(1287,1,Vke,u1b);_.Lb=function v1b(a){return z0b(),BD(a,11).j==(Ucd(),zcd)};_.Fb=function w1b(a){return this===a};_.Mb=function x1b(a){return z0b(),BD(a,11).j==(Ucd(),zcd)};var ZQ=mdb(fne,'LPort/lambda$3$Type',1287);bcb(1288,1,Vke,y1b);_.Lb=function z1b(a){return z0b(),BD(a,11).j==(Ucd(),Rcd)};_.Fb=function A1b(a){return this===a};_.Mb=function B1b(a){return z0b(),BD(a,11).j==(Ucd(),Rcd)};var $Q=mdb(fne,'LPort/lambda$4$Type',1288);bcb(1289,1,Vke,C1b);_.Lb=function D1b(a){return z0b(),BD(a,11).j==(Ucd(),Tcd)};_.Fb=function E1b(a){return this===a};_.Mb=function F1b(a){return z0b(),BD(a,11).j==(Ucd(),Tcd)};var _Q=mdb(fne,'LPort/lambda$5$Type',1289);bcb(29,299,{3:1,20:1,299:1,29:1,94:1,134:1},H1b);_.Jc=function I1b(a){reb(this,a)};_.Kc=function J1b(){return new olb(this.a)};_.Ib=function K1b(){return 'L_'+Jkb(this.b.b,this,0)+Fe(this.a)};var cR=mdb(fne,'Layer',29);bcb(1342,1,{},a2b);var mR=mdb(tne,une,1342);bcb(1346,1,{},e2b);_.Kb=function f2b(a){return atd(BD(a,82))};var dR=mdb(tne,'ElkGraphImporter/0methodref$connectableShapeToNode$Type',1346);bcb(1349,1,{},g2b);_.Kb=function h2b(a){return atd(BD(a,82))};var eR=mdb(tne,'ElkGraphImporter/1methodref$connectableShapeToNode$Type',1349);bcb(1343,1,qie,i2b);_.td=function j2b(a){Q1b(this.a,BD(a,118))};var fR=mdb(tne,vne,1343);bcb(1344,1,qie,k2b);_.td=function l2b(a){Q1b(this.a,BD(a,118))};var gR=mdb(tne,wne,1344);bcb(1345,1,{},m2b);_.Kb=function n2b(a){return new YAb(null,new Kub(Old(BD(a,79)),16))};var hR=mdb(tne,xne,1345);bcb(1347,1,Oie,o2b);_.Mb=function p2b(a){return b2b(this.a,BD(a,33))};var iR=mdb(tne,yne,1347);bcb(1348,1,{},q2b);_.Kb=function r2b(a){return new YAb(null,new Kub(Nld(BD(a,79)),16))};var jR=mdb(tne,'ElkGraphImporter/lambda$5$Type',1348);bcb(1350,1,Oie,s2b);_.Mb=function t2b(a){return c2b(this.a,BD(a,33))};var kR=mdb(tne,'ElkGraphImporter/lambda$7$Type',1350);bcb(1351,1,Oie,u2b);_.Mb=function v2b(a){return d2b(BD(a,79))};var lR=mdb(tne,'ElkGraphImporter/lambda$8$Type',1351);bcb(1278,1,{},D2b);var w2b;var rR=mdb(tne,'ElkGraphLayoutTransferrer',1278);bcb(1279,1,Oie,G2b);_.Mb=function H2b(a){return E2b(this.a,BD(a,17))};var nR=mdb(tne,'ElkGraphLayoutTransferrer/lambda$0$Type',1279);bcb(1280,1,qie,I2b);_.td=function J2b(a){x2b();Ekb(this.a,BD(a,17))};var oR=mdb(tne,'ElkGraphLayoutTransferrer/lambda$1$Type',1280);bcb(1281,1,Oie,K2b);_.Mb=function L2b(a){return F2b(this.a,BD(a,17))};var pR=mdb(tne,'ElkGraphLayoutTransferrer/lambda$2$Type',1281);bcb(1282,1,qie,M2b);_.td=function N2b(a){x2b();Ekb(this.a,BD(a,17))};var qR=mdb(tne,'ElkGraphLayoutTransferrer/lambda$3$Type',1282);bcb(1485,1,ene,S2b);_.pf=function T2b(a,b){Q2b(BD(a,37),b)};var uR=mdb(Ane,'CommentNodeMarginCalculator',1485);bcb(1486,1,{},U2b);_.Kb=function V2b(a){return new YAb(null,new Kub(BD(a,29).a,16))};var sR=mdb(Ane,'CommentNodeMarginCalculator/lambda$0$Type',1486);bcb(1487,1,qie,W2b);_.td=function X2b(a){R2b(BD(a,10))};var tR=mdb(Ane,'CommentNodeMarginCalculator/lambda$1$Type',1487);bcb(1488,1,ene,_2b);_.pf=function a3b(a,b){Z2b(BD(a,37),b)};var vR=mdb(Ane,'CommentPostprocessor',1488);bcb(1489,1,ene,e3b);_.pf=function f3b(a,b){b3b(BD(a,37),b)};var wR=mdb(Ane,'CommentPreprocessor',1489);bcb(1490,1,ene,h3b);_.pf=function i3b(a,b){g3b(BD(a,37),b)};var xR=mdb(Ane,'ConstraintsPostprocessor',1490);bcb(1491,1,ene,p3b);_.pf=function q3b(a,b){n3b(BD(a,37),b)};var yR=mdb(Ane,'EdgeAndLayerConstraintEdgeReverser',1491);bcb(1492,1,ene,t3b);_.pf=function v3b(a,b){r3b(BD(a,37),b)};var CR=mdb(Ane,'EndLabelPostprocessor',1492);bcb(1493,1,{},w3b);_.Kb=function x3b(a){return new YAb(null,new Kub(BD(a,29).a,16))};var zR=mdb(Ane,'EndLabelPostprocessor/lambda$0$Type',1493);bcb(1494,1,Oie,y3b);_.Mb=function z3b(a){return u3b(BD(a,10))};var AR=mdb(Ane,'EndLabelPostprocessor/lambda$1$Type',1494);bcb(1495,1,qie,A3b);_.td=function B3b(a){s3b(BD(a,10))};var BR=mdb(Ane,'EndLabelPostprocessor/lambda$2$Type',1495);bcb(1496,1,ene,M3b);_.pf=function P3b(a,b){I3b(BD(a,37),b)};var JR=mdb(Ane,'EndLabelPreprocessor',1496);bcb(1497,1,{},Q3b);_.Kb=function R3b(a){return new YAb(null,new Kub(BD(a,29).a,16))};var DR=mdb(Ane,'EndLabelPreprocessor/lambda$0$Type',1497);bcb(1498,1,qie,S3b);_.td=function T3b(a){E3b(this.a,this.b,this.c,BD(a,10))};_.a=0;_.b=0;_.c=false;var ER=mdb(Ane,'EndLabelPreprocessor/lambda$1$Type',1498);bcb(1499,1,Oie,U3b);_.Mb=function V3b(a){return PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),pad))};var FR=mdb(Ane,'EndLabelPreprocessor/lambda$2$Type',1499);bcb(1500,1,qie,W3b);_.td=function X3b(a){Dsb(this.a,BD(a,70))};var GR=mdb(Ane,'EndLabelPreprocessor/lambda$3$Type',1500);bcb(1501,1,Oie,Y3b);_.Mb=function Z3b(a){return PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),oad))};var HR=mdb(Ane,'EndLabelPreprocessor/lambda$4$Type',1501);bcb(1502,1,qie,$3b);_.td=function _3b(a){Dsb(this.a,BD(a,70))};var IR=mdb(Ane,'EndLabelPreprocessor/lambda$5$Type',1502);bcb(1551,1,ene,i4b);_.pf=function j4b(a,b){f4b(BD(a,37),b)};var a4b;var RR=mdb(Ane,'EndLabelSorter',1551);bcb(1552,1,Dke,l4b);_.ue=function m4b(a,b){return k4b(BD(a,456),BD(b,456))};_.Fb=function n4b(a){return this===a};_.ve=function o4b(){return new tpb(this)};var KR=mdb(Ane,'EndLabelSorter/1',1552);bcb(456,1,{456:1},p4b);var LR=mdb(Ane,'EndLabelSorter/LabelGroup',456);bcb(1553,1,{},q4b);_.Kb=function r4b(a){return b4b(),new YAb(null,new Kub(BD(a,29).a,16))};var MR=mdb(Ane,'EndLabelSorter/lambda$0$Type',1553);bcb(1554,1,Oie,s4b);_.Mb=function t4b(a){return b4b(),BD(a,10).k==(j0b(),h0b)};var NR=mdb(Ane,'EndLabelSorter/lambda$1$Type',1554);bcb(1555,1,qie,u4b);_.td=function v4b(a){g4b(BD(a,10))};var OR=mdb(Ane,'EndLabelSorter/lambda$2$Type',1555);bcb(1556,1,Oie,w4b);_.Mb=function x4b(a){return b4b(),PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),oad))};var PR=mdb(Ane,'EndLabelSorter/lambda$3$Type',1556);bcb(1557,1,Oie,y4b);_.Mb=function z4b(a){return b4b(),PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),pad))};var QR=mdb(Ane,'EndLabelSorter/lambda$4$Type',1557);bcb(1503,1,ene,L4b);_.pf=function M4b(a,b){J4b(this,BD(a,37))};_.b=0;_.c=0;var YR=mdb(Ane,'FinalSplineBendpointsCalculator',1503);bcb(1504,1,{},N4b);_.Kb=function O4b(a){return new YAb(null,new Kub(BD(a,29).a,16))};var SR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$0$Type',1504);bcb(1505,1,{},P4b);_.Kb=function Q4b(a){return new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var TR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$1$Type',1505);bcb(1506,1,Oie,R4b);_.Mb=function S4b(a){return !OZb(BD(a,17))};var UR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$2$Type',1506);bcb(1507,1,Oie,T4b);_.Mb=function U4b(a){return wNb(BD(a,17),(wtc(),rtc))};var VR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$3$Type',1507);bcb(1508,1,qie,V4b);_.td=function W4b(a){C4b(this.a,BD(a,128))};var WR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$4$Type',1508);bcb(1509,1,qie,X4b);_.td=function Y4b(a){smb(BD(a,17).a)};var XR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$5$Type',1509);bcb(792,1,ene,u5b);_.pf=function v5b(a,b){l5b(this,BD(a,37),b)};var $R=mdb(Ane,'GraphTransformer',792);bcb(511,22,{3:1,35:1,22:1,511:1},z5b);var w5b,x5b;var ZR=ndb(Ane,'GraphTransformer/Mode',511,CI,B5b,A5b);var C5b;bcb(1510,1,ene,I5b);_.pf=function J5b(a,b){F5b(BD(a,37),b)};var _R=mdb(Ane,'HierarchicalNodeResizingProcessor',1510);bcb(1511,1,ene,Q5b);_.pf=function R5b(a,b){M5b(BD(a,37),b)};var bS=mdb(Ane,'HierarchicalPortConstraintProcessor',1511);bcb(1512,1,Dke,T5b);_.ue=function U5b(a,b){return S5b(BD(a,10),BD(b,10))};_.Fb=function V5b(a){return this===a};_.ve=function W5b(){return new tpb(this)};var aS=mdb(Ane,'HierarchicalPortConstraintProcessor/NodeComparator',1512);bcb(1513,1,ene,Z5b);_.pf=function $5b(a,b){X5b(BD(a,37),b)};var cS=mdb(Ane,'HierarchicalPortDummySizeProcessor',1513);bcb(1514,1,ene,l6b);_.pf=function m6b(a,b){e6b(this,BD(a,37),b)};_.a=0;var fS=mdb(Ane,'HierarchicalPortOrthogonalEdgeRouter',1514);bcb(1515,1,Dke,o6b);_.ue=function p6b(a,b){return n6b(BD(a,10),BD(b,10))};_.Fb=function q6b(a){return this===a};_.ve=function r6b(){return new tpb(this)};var dS=mdb(Ane,'HierarchicalPortOrthogonalEdgeRouter/1',1515);bcb(1516,1,Dke,t6b);_.ue=function u6b(a,b){return s6b(BD(a,10),BD(b,10))};_.Fb=function v6b(a){return this===a};_.ve=function w6b(){return new tpb(this)};var eS=mdb(Ane,'HierarchicalPortOrthogonalEdgeRouter/2',1516);bcb(1517,1,ene,z6b);_.pf=function A6b(a,b){y6b(BD(a,37),b)};var gS=mdb(Ane,'HierarchicalPortPositionProcessor',1517);bcb(1518,1,ene,J6b);_.pf=function K6b(a,b){I6b(this,BD(a,37))};_.a=0;_.c=0;var B6b,C6b;var kS=mdb(Ane,'HighDegreeNodeLayeringProcessor',1518);bcb(571,1,{571:1},L6b);_.b=-1;_.d=-1;var hS=mdb(Ane,'HighDegreeNodeLayeringProcessor/HighDegreeNodeInformation',571);bcb(1519,1,{},M6b);_.Kb=function N6b(a){return D6b(),R_b(BD(a,10))};_.Fb=function O6b(a){return this===a};var iS=mdb(Ane,'HighDegreeNodeLayeringProcessor/lambda$0$Type',1519);bcb(1520,1,{},P6b);_.Kb=function Q6b(a){return D6b(),U_b(BD(a,10))};_.Fb=function R6b(a){return this===a};var jS=mdb(Ane,'HighDegreeNodeLayeringProcessor/lambda$1$Type',1520);bcb(1526,1,ene,X6b);_.pf=function Y6b(a,b){W6b(this,BD(a,37),b)};var pS=mdb(Ane,'HyperedgeDummyMerger',1526);bcb(793,1,{},Z6b);_.a=false;_.b=false;_.c=false;var lS=mdb(Ane,'HyperedgeDummyMerger/MergeState',793);bcb(1527,1,{},$6b);_.Kb=function _6b(a){return new YAb(null,new Kub(BD(a,29).a,16))};var mS=mdb(Ane,'HyperedgeDummyMerger/lambda$0$Type',1527);bcb(1528,1,{},a7b);_.Kb=function b7b(a){return new YAb(null,new Kub(BD(a,10).j,16))};var nS=mdb(Ane,'HyperedgeDummyMerger/lambda$1$Type',1528);bcb(1529,1,qie,c7b);_.td=function d7b(a){BD(a,11).p=-1};var oS=mdb(Ane,'HyperedgeDummyMerger/lambda$2$Type',1529);bcb(1530,1,ene,g7b);_.pf=function h7b(a,b){f7b(BD(a,37),b)};var qS=mdb(Ane,'HypernodesProcessor',1530);bcb(1531,1,ene,j7b);_.pf=function k7b(a,b){i7b(BD(a,37),b)};var rS=mdb(Ane,'InLayerConstraintProcessor',1531);bcb(1532,1,ene,m7b);_.pf=function n7b(a,b){l7b(BD(a,37),b)};var sS=mdb(Ane,'InnermostNodeMarginCalculator',1532);bcb(1533,1,ene,r7b);_.pf=function w7b(a,b){q7b(this,BD(a,37))};_.a=Qje;_.b=Qje;_.c=Pje;_.d=Pje;var zS=mdb(Ane,'InteractiveExternalPortPositioner',1533);bcb(1534,1,{},x7b);_.Kb=function y7b(a){return BD(a,17).d.i};_.Fb=function z7b(a){return this===a};var tS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$0$Type',1534);bcb(1535,1,{},A7b);_.Kb=function B7b(a){return s7b(this.a,ED(a))};_.Fb=function C7b(a){return this===a};var uS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$1$Type',1535);bcb(1536,1,{},D7b);_.Kb=function E7b(a){return BD(a,17).c.i};_.Fb=function F7b(a){return this===a};var vS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$2$Type',1536);bcb(1537,1,{},G7b);_.Kb=function H7b(a){return t7b(this.a,ED(a))};_.Fb=function I7b(a){return this===a};var wS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$3$Type',1537);bcb(1538,1,{},J7b);_.Kb=function K7b(a){return u7b(this.a,ED(a))};_.Fb=function L7b(a){return this===a};var xS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$4$Type',1538);bcb(1539,1,{},M7b);_.Kb=function N7b(a){return v7b(this.a,ED(a))};_.Fb=function O7b(a){return this===a};var yS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$5$Type',1539);bcb(77,22,{3:1,35:1,22:1,77:1,234:1},T8b);_.Kf=function U8b(){switch(this.g){case 15:return new eoc;case 22:return new Aoc;case 47:return new Joc;case 28:case 35:return new uac;case 32:return new S2b;case 42:return new _2b;case 1:return new e3b;case 41:return new h3b;case 56:return new u5b((y5b(),x5b));case 0:return new u5b((y5b(),w5b));case 2:return new p3b;case 54:return new t3b;case 33:return new M3b;case 51:return new L4b;case 55:return new I5b;case 13:return new Q5b;case 38:return new Z5b;case 44:return new l6b;case 40:return new z6b;case 9:return new J6b;case 49:return new sgc;case 37:return new X6b;case 43:return new g7b;case 27:return new j7b;case 30:return new m7b;case 3:return new r7b;case 18:return new b9b;case 29:return new h9b;case 5:return new u9b;case 50:return new D9b;case 34:return new $9b;case 36:return new Iac;case 52:return new i4b;case 11:return new Sac;case 7:return new abc;case 39:return new obc;case 45:return new rbc;case 16:return new vbc;case 10:return new Fbc;case 48:return new Xbc;case 21:return new ccc;case 23:return new fGc((rGc(),pGc));case 8:return new lcc;case 12:return new tcc;case 4:return new ycc;case 19:return new Tcc;case 17:return new pdc;case 53:return new sdc;case 6:return new hec;case 25:return new wdc;case 46:return new Ndc;case 31:return new sec;case 14:return new Fec;case 26:return new ppc;case 20:return new Uec;case 24:return new fGc((rGc(),qGc));default:throw vbb(new Wdb(Dne+(this.f!=null?this.f:''+this.g)));}};var P7b,Q7b,R7b,S7b,T7b,U7b,V7b,W7b,X7b,Y7b,Z7b,$7b,_7b,a8b,b8b,c8b,d8b,e8b,f8b,g8b,h8b,i8b,j8b,k8b,l8b,m8b,n8b,o8b,p8b,q8b,r8b,s8b,t8b,u8b,v8b,w8b,x8b,y8b,z8b,A8b,B8b,C8b,D8b,E8b,F8b,G8b,H8b,I8b,J8b,K8b,L8b,M8b,N8b,O8b,P8b,Q8b,R8b;var AS=ndb(Ane,Ene,77,CI,W8b,V8b);var X8b;bcb(1540,1,ene,b9b);_.pf=function c9b(a,b){_8b(BD(a,37),b)};var BS=mdb(Ane,'InvertedPortProcessor',1540);bcb(1541,1,ene,h9b);_.pf=function i9b(a,b){g9b(BD(a,37),b)};var FS=mdb(Ane,'LabelAndNodeSizeProcessor',1541);bcb(1542,1,Oie,j9b);_.Mb=function k9b(a){return BD(a,10).k==(j0b(),h0b)};var CS=mdb(Ane,'LabelAndNodeSizeProcessor/lambda$0$Type',1542);bcb(1543,1,Oie,l9b);_.Mb=function m9b(a){return BD(a,10).k==(j0b(),e0b)};var DS=mdb(Ane,'LabelAndNodeSizeProcessor/lambda$1$Type',1543);bcb(1544,1,qie,n9b);_.td=function o9b(a){e9b(this.b,this.a,this.c,BD(a,10))};_.a=false;_.c=false;var ES=mdb(Ane,'LabelAndNodeSizeProcessor/lambda$2$Type',1544);bcb(1545,1,ene,u9b);_.pf=function v9b(a,b){s9b(BD(a,37),b)};var p9b;var HS=mdb(Ane,'LabelDummyInserter',1545);bcb(1546,1,Vke,w9b);_.Lb=function x9b(a){return PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),nad))};_.Fb=function y9b(a){return this===a};_.Mb=function z9b(a){return PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),nad))};var GS=mdb(Ane,'LabelDummyInserter/1',1546);bcb(1547,1,ene,D9b);_.pf=function E9b(a,b){C9b(BD(a,37),b)};var JS=mdb(Ane,'LabelDummyRemover',1547);bcb(1548,1,Oie,F9b);_.Mb=function G9b(a){return Ccb(DD(vNb(BD(a,70),(Nyc(),Pwc))))};var IS=mdb(Ane,'LabelDummyRemover/lambda$0$Type',1548);bcb(1359,1,ene,$9b);_.pf=function cac(a,b){W9b(this,BD(a,37),b)};_.a=null;var H9b;var QS=mdb(Ane,'LabelDummySwitcher',1359);bcb(286,1,{286:1},gac);_.c=0;_.d=null;_.f=0;var KS=mdb(Ane,'LabelDummySwitcher/LabelDummyInfo',286);bcb(1360,1,{},hac);_.Kb=function iac(a){return I9b(),new YAb(null,new Kub(BD(a,29).a,16))};var LS=mdb(Ane,'LabelDummySwitcher/lambda$0$Type',1360);bcb(1361,1,Oie,jac);_.Mb=function kac(a){return I9b(),BD(a,10).k==(j0b(),f0b)};var MS=mdb(Ane,'LabelDummySwitcher/lambda$1$Type',1361);bcb(1362,1,{},lac);_.Kb=function mac(a){return _9b(this.a,BD(a,10))};var NS=mdb(Ane,'LabelDummySwitcher/lambda$2$Type',1362);bcb(1363,1,qie,nac);_.td=function oac(a){aac(this.a,BD(a,286))};var OS=mdb(Ane,'LabelDummySwitcher/lambda$3$Type',1363);bcb(1364,1,Dke,pac);_.ue=function qac(a,b){return bac(BD(a,286),BD(b,286))};_.Fb=function rac(a){return this===a};_.ve=function sac(){return new tpb(this)};var PS=mdb(Ane,'LabelDummySwitcher/lambda$4$Type',1364);bcb(791,1,ene,uac);_.pf=function vac(a,b){tac(BD(a,37),b)};var RS=mdb(Ane,'LabelManagementProcessor',791);bcb(1549,1,ene,Iac);_.pf=function Jac(a,b){Cac(BD(a,37),b)};var TS=mdb(Ane,'LabelSideSelector',1549);bcb(1550,1,Oie,Kac);_.Mb=function Lac(a){return Ccb(DD(vNb(BD(a,70),(Nyc(),Pwc))))};var SS=mdb(Ane,'LabelSideSelector/lambda$0$Type',1550);bcb(1558,1,ene,Sac);_.pf=function Tac(a,b){Oac(BD(a,37),b)};var US=mdb(Ane,'LayerConstraintPostprocessor',1558);bcb(1559,1,ene,abc);_.pf=function bbc(a,b){$ac(BD(a,37),b)};var Uac;var WS=mdb(Ane,'LayerConstraintPreprocessor',1559);bcb(360,22,{3:1,35:1,22:1,360:1},ibc);var cbc,dbc,ebc,fbc;var VS=ndb(Ane,'LayerConstraintPreprocessor/HiddenNodeConnections',360,CI,kbc,jbc);var lbc;bcb(1560,1,ene,obc);_.pf=function pbc(a,b){nbc(BD(a,37),b)};var XS=mdb(Ane,'LayerSizeAndGraphHeightCalculator',1560);bcb(1561,1,ene,rbc);_.pf=function tbc(a,b){qbc(BD(a,37),b)};var YS=mdb(Ane,'LongEdgeJoiner',1561);bcb(1562,1,ene,vbc);_.pf=function xbc(a,b){ubc(BD(a,37),b)};var ZS=mdb(Ane,'LongEdgeSplitter',1562);bcb(1563,1,ene,Fbc);_.pf=function Ibc(a,b){Bbc(this,BD(a,37),b)};_.d=0;_.e=0;_.i=0;_.j=0;_.k=0;_.n=0;var bT=mdb(Ane,'NodePromotion',1563);bcb(1564,1,{},Jbc);_.Kb=function Kbc(a){return BD(a,46),Bcb(),true};_.Fb=function Lbc(a){return this===a};var $S=mdb(Ane,'NodePromotion/lambda$0$Type',1564);bcb(1565,1,{},Mbc);_.Kb=function Nbc(a){return Gbc(this.a,BD(a,46))};_.Fb=function Obc(a){return this===a};_.a=0;var _S=mdb(Ane,'NodePromotion/lambda$1$Type',1565);bcb(1566,1,{},Pbc);_.Kb=function Qbc(a){return Hbc(this.a,BD(a,46))};_.Fb=function Rbc(a){return this===a};_.a=0;var aT=mdb(Ane,'NodePromotion/lambda$2$Type',1566);bcb(1567,1,ene,Xbc);_.pf=function Ybc(a,b){Sbc(BD(a,37),b)};var cT=mdb(Ane,'NorthSouthPortPostprocessor',1567);bcb(1568,1,ene,ccc);_.pf=function ecc(a,b){acc(BD(a,37),b)};var eT=mdb(Ane,'NorthSouthPortPreprocessor',1568);bcb(1569,1,Dke,fcc);_.ue=function gcc(a,b){return dcc(BD(a,11),BD(b,11))};_.Fb=function hcc(a){return this===a};_.ve=function icc(){return new tpb(this)};var dT=mdb(Ane,'NorthSouthPortPreprocessor/lambda$0$Type',1569);bcb(1570,1,ene,lcc);_.pf=function ncc(a,b){kcc(BD(a,37),b)};var hT=mdb(Ane,'PartitionMidprocessor',1570);bcb(1571,1,Oie,occ);_.Mb=function pcc(a){return wNb(BD(a,10),(Nyc(),Nxc))};var fT=mdb(Ane,'PartitionMidprocessor/lambda$0$Type',1571);bcb(1572,1,qie,qcc);_.td=function rcc(a){mcc(this.a,BD(a,10))};var gT=mdb(Ane,'PartitionMidprocessor/lambda$1$Type',1572);bcb(1573,1,ene,tcc);_.pf=function ucc(a,b){scc(BD(a,37),b)};var iT=mdb(Ane,'PartitionPostprocessor',1573);bcb(1574,1,ene,ycc);_.pf=function zcc(a,b){wcc(BD(a,37),b)};var nT=mdb(Ane,'PartitionPreprocessor',1574);bcb(1575,1,Oie,Acc);_.Mb=function Bcc(a){return wNb(BD(a,10),(Nyc(),Nxc))};var jT=mdb(Ane,'PartitionPreprocessor/lambda$0$Type',1575);bcb(1576,1,{},Ccc);_.Kb=function Dcc(a){return new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var kT=mdb(Ane,'PartitionPreprocessor/lambda$1$Type',1576);bcb(1577,1,Oie,Ecc);_.Mb=function Fcc(a){return vcc(BD(a,17))};var lT=mdb(Ane,'PartitionPreprocessor/lambda$2$Type',1577);bcb(1578,1,qie,Gcc);_.td=function Hcc(a){xcc(BD(a,17))};var mT=mdb(Ane,'PartitionPreprocessor/lambda$3$Type',1578);bcb(1579,1,ene,Tcc);_.pf=function Xcc(a,b){Qcc(BD(a,37),b)};var Icc,Jcc,Kcc,Lcc,Mcc,Ncc;var tT=mdb(Ane,'PortListSorter',1579);bcb(1580,1,{},Zcc);_.Kb=function $cc(a){return Occ(),BD(a,11).e};var oT=mdb(Ane,'PortListSorter/lambda$0$Type',1580);bcb(1581,1,{},_cc);_.Kb=function adc(a){return Occ(),BD(a,11).g};var pT=mdb(Ane,'PortListSorter/lambda$1$Type',1581);bcb(1582,1,Dke,bdc);_.ue=function cdc(a,b){return Ucc(BD(a,11),BD(b,11))};_.Fb=function ddc(a){return this===a};_.ve=function edc(){return new tpb(this)};var qT=mdb(Ane,'PortListSorter/lambda$2$Type',1582);bcb(1583,1,Dke,fdc);_.ue=function gdc(a,b){return Vcc(BD(a,11),BD(b,11))};_.Fb=function hdc(a){return this===a};_.ve=function idc(){return new tpb(this)};var rT=mdb(Ane,'PortListSorter/lambda$3$Type',1583);bcb(1584,1,Dke,jdc);_.ue=function kdc(a,b){return Wcc(BD(a,11),BD(b,11))};_.Fb=function ldc(a){return this===a};_.ve=function mdc(){return new tpb(this)};var sT=mdb(Ane,'PortListSorter/lambda$4$Type',1584);bcb(1585,1,ene,pdc);_.pf=function qdc(a,b){ndc(BD(a,37),b)};var uT=mdb(Ane,'PortSideProcessor',1585);bcb(1586,1,ene,sdc);_.pf=function tdc(a,b){rdc(BD(a,37),b)};var vT=mdb(Ane,'ReversedEdgeRestorer',1586);bcb(1591,1,ene,wdc);_.pf=function xdc(a,b){udc(this,BD(a,37),b)};var CT=mdb(Ane,'SelfLoopPortRestorer',1591);bcb(1592,1,{},ydc);_.Kb=function zdc(a){return new YAb(null,new Kub(BD(a,29).a,16))};var wT=mdb(Ane,'SelfLoopPortRestorer/lambda$0$Type',1592);bcb(1593,1,Oie,Adc);_.Mb=function Bdc(a){return BD(a,10).k==(j0b(),h0b)};var xT=mdb(Ane,'SelfLoopPortRestorer/lambda$1$Type',1593);bcb(1594,1,Oie,Cdc);_.Mb=function Ddc(a){return wNb(BD(a,10),(wtc(),ntc))};var yT=mdb(Ane,'SelfLoopPortRestorer/lambda$2$Type',1594);bcb(1595,1,{},Edc);_.Kb=function Fdc(a){return BD(vNb(BD(a,10),(wtc(),ntc)),403)};var zT=mdb(Ane,'SelfLoopPortRestorer/lambda$3$Type',1595);bcb(1596,1,qie,Gdc);_.td=function Hdc(a){vdc(this.a,BD(a,403))};var AT=mdb(Ane,'SelfLoopPortRestorer/lambda$4$Type',1596);bcb(794,1,qie,Idc);_.td=function Jdc(a){ljc(BD(a,101))};var BT=mdb(Ane,'SelfLoopPortRestorer/lambda$5$Type',794);bcb(1597,1,ene,Ndc);_.pf=function Pdc(a,b){Kdc(BD(a,37),b)};var LT=mdb(Ane,'SelfLoopPostProcessor',1597);bcb(1598,1,{},Qdc);_.Kb=function Rdc(a){return new YAb(null,new Kub(BD(a,29).a,16))};var DT=mdb(Ane,'SelfLoopPostProcessor/lambda$0$Type',1598);bcb(1599,1,Oie,Sdc);_.Mb=function Tdc(a){return BD(a,10).k==(j0b(),h0b)};var ET=mdb(Ane,'SelfLoopPostProcessor/lambda$1$Type',1599);bcb(1600,1,Oie,Udc);_.Mb=function Vdc(a){return wNb(BD(a,10),(wtc(),ntc))};var FT=mdb(Ane,'SelfLoopPostProcessor/lambda$2$Type',1600);bcb(1601,1,qie,Wdc);_.td=function Xdc(a){Ldc(BD(a,10))};var GT=mdb(Ane,'SelfLoopPostProcessor/lambda$3$Type',1601);bcb(1602,1,{},Ydc);_.Kb=function Zdc(a){return new YAb(null,new Kub(BD(a,101).f,1))};var HT=mdb(Ane,'SelfLoopPostProcessor/lambda$4$Type',1602);bcb(1603,1,qie,$dc);_.td=function _dc(a){Mdc(this.a,BD(a,409))};var IT=mdb(Ane,'SelfLoopPostProcessor/lambda$5$Type',1603);bcb(1604,1,Oie,aec);_.Mb=function bec(a){return !!BD(a,101).i};var JT=mdb(Ane,'SelfLoopPostProcessor/lambda$6$Type',1604);bcb(1605,1,qie,cec);_.td=function dec(a){Odc(this.a,BD(a,101))};var KT=mdb(Ane,'SelfLoopPostProcessor/lambda$7$Type',1605);bcb(1587,1,ene,hec);_.pf=function iec(a,b){gec(BD(a,37),b)};var PT=mdb(Ane,'SelfLoopPreProcessor',1587);bcb(1588,1,{},jec);_.Kb=function kec(a){return new YAb(null,new Kub(BD(a,101).f,1))};var MT=mdb(Ane,'SelfLoopPreProcessor/lambda$0$Type',1588);bcb(1589,1,{},lec);_.Kb=function mec(a){return BD(a,409).a};var NT=mdb(Ane,'SelfLoopPreProcessor/lambda$1$Type',1589);bcb(1590,1,qie,nec);_.td=function oec(a){fec(BD(a,17))};var OT=mdb(Ane,'SelfLoopPreProcessor/lambda$2$Type',1590);bcb(1606,1,ene,sec);_.pf=function tec(a,b){qec(this,BD(a,37),b)};var VT=mdb(Ane,'SelfLoopRouter',1606);bcb(1607,1,{},uec);_.Kb=function vec(a){return new YAb(null,new Kub(BD(a,29).a,16))};var QT=mdb(Ane,'SelfLoopRouter/lambda$0$Type',1607);bcb(1608,1,Oie,wec);_.Mb=function xec(a){return BD(a,10).k==(j0b(),h0b)};var RT=mdb(Ane,'SelfLoopRouter/lambda$1$Type',1608);bcb(1609,1,Oie,yec);_.Mb=function zec(a){return wNb(BD(a,10),(wtc(),ntc))};var ST=mdb(Ane,'SelfLoopRouter/lambda$2$Type',1609);bcb(1610,1,{},Aec);_.Kb=function Bec(a){return BD(vNb(BD(a,10),(wtc(),ntc)),403)};var TT=mdb(Ane,'SelfLoopRouter/lambda$3$Type',1610);bcb(1611,1,qie,Cec);_.td=function Dec(a){pec(this.a,this.b,BD(a,403))};var UT=mdb(Ane,'SelfLoopRouter/lambda$4$Type',1611);bcb(1612,1,ene,Fec);_.pf=function Iec(a,b){Eec(BD(a,37),b)};var $T=mdb(Ane,'SemiInteractiveCrossMinProcessor',1612);bcb(1613,1,Oie,Jec);_.Mb=function Kec(a){return BD(a,10).k==(j0b(),h0b)};var WT=mdb(Ane,'SemiInteractiveCrossMinProcessor/lambda$0$Type',1613);bcb(1614,1,Oie,Lec);_.Mb=function Mec(a){return uNb(BD(a,10))._b((Nyc(),ayc))};var XT=mdb(Ane,'SemiInteractiveCrossMinProcessor/lambda$1$Type',1614);bcb(1615,1,Dke,Nec);_.ue=function Oec(a,b){return Gec(BD(a,10),BD(b,10))};_.Fb=function Pec(a){return this===a};_.ve=function Qec(){return new tpb(this)};var YT=mdb(Ane,'SemiInteractiveCrossMinProcessor/lambda$2$Type',1615);bcb(1616,1,{},Rec);_.Ce=function Sec(a,b){return Hec(BD(a,10),BD(b,10))};var ZT=mdb(Ane,'SemiInteractiveCrossMinProcessor/lambda$3$Type',1616);bcb(1618,1,ene,Uec);_.pf=function Yec(a,b){Tec(BD(a,37),b)};var bU=mdb(Ane,'SortByInputModelProcessor',1618);bcb(1619,1,Oie,Zec);_.Mb=function $ec(a){return BD(a,11).g.c.length!=0};var _T=mdb(Ane,'SortByInputModelProcessor/lambda$0$Type',1619);bcb(1620,1,qie,_ec);_.td=function afc(a){Wec(this.a,BD(a,11))};var aU=mdb(Ane,'SortByInputModelProcessor/lambda$1$Type',1620);bcb(1693,803,{},jfc);_.Me=function kfc(a){var b,c,d,e;this.c=a;switch(this.a.g){case 2:b=new Rkb;MAb(JAb(new YAb(null,new Kub(this.c.a.b,16)),new lgc),new ngc(this,b));nEb(this,new tfc);Hkb(b,new xfc);b.c=KC(SI,Uhe,1,0,5,1);MAb(JAb(new YAb(null,new Kub(this.c.a.b,16)),new zfc),new Bfc(b));nEb(this,new Ffc);Hkb(b,new Jfc);b.c=KC(SI,Uhe,1,0,5,1);c=Ntb($zb(OAb(new YAb(null,new Kub(this.c.a.b,16)),new Lfc(this))),new Nfc);MAb(new YAb(null,new Kub(this.c.a.a,16)),new Rfc(c,b));nEb(this,new Vfc);Hkb(b,new Zfc);b.c=KC(SI,Uhe,1,0,5,1);break;case 3:d=new Rkb;nEb(this,new lfc);e=Ntb($zb(OAb(new YAb(null,new Kub(this.c.a.b,16)),new pfc(this))),new Pfc);MAb(JAb(new YAb(null,new Kub(this.c.a.b,16)),new _fc),new bgc(e,d));nEb(this,new fgc);Hkb(d,new jgc);d.c=KC(SI,Uhe,1,0,5,1);break;default:throw vbb(new x2c);}};_.b=0;var AU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation',1693);bcb(1694,1,Vke,lfc);_.Lb=function mfc(a){return JD(BD(a,57).g,145)};_.Fb=function nfc(a){return this===a};_.Mb=function ofc(a){return JD(BD(a,57).g,145)};var cU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$0$Type',1694);bcb(1695,1,{},pfc);_.Fe=function qfc(a){return dfc(this.a,BD(a,57))};var dU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$1$Type',1695);bcb(1703,1,Pie,rfc);_.Vd=function sfc(){cfc(this.a,this.b,-1)};_.b=0;var eU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$10$Type',1703);bcb(1705,1,Vke,tfc);_.Lb=function ufc(a){return JD(BD(a,57).g,145)};_.Fb=function vfc(a){return this===a};_.Mb=function wfc(a){return JD(BD(a,57).g,145)};var fU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$11$Type',1705);bcb(1706,1,qie,xfc);_.td=function yfc(a){BD(a,365).Vd()};var gU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$12$Type',1706);bcb(1707,1,Oie,zfc);_.Mb=function Afc(a){return JD(BD(a,57).g,10)};var hU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$13$Type',1707);bcb(1709,1,qie,Bfc);_.td=function Cfc(a){efc(this.a,BD(a,57))};var iU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$14$Type',1709);bcb(1708,1,Pie,Dfc);_.Vd=function Efc(){cfc(this.b,this.a,-1)};_.a=0;var jU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$15$Type',1708);bcb(1710,1,Vke,Ffc);_.Lb=function Gfc(a){return JD(BD(a,57).g,10)};_.Fb=function Hfc(a){return this===a};_.Mb=function Ifc(a){return JD(BD(a,57).g,10)};var kU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$16$Type',1710);bcb(1711,1,qie,Jfc);_.td=function Kfc(a){BD(a,365).Vd()};var lU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$17$Type',1711);bcb(1712,1,{},Lfc);_.Fe=function Mfc(a){return ffc(this.a,BD(a,57))};var mU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$18$Type',1712);bcb(1713,1,{},Nfc);_.De=function Ofc(){return 0};var nU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$19$Type',1713);bcb(1696,1,{},Pfc);_.De=function Qfc(){return 0};var oU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$2$Type',1696);bcb(1715,1,qie,Rfc);_.td=function Sfc(a){gfc(this.a,this.b,BD(a,307))};_.a=0;var pU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$20$Type',1715);bcb(1714,1,Pie,Tfc);_.Vd=function Ufc(){bfc(this.a,this.b,-1)};_.b=0;var qU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$21$Type',1714);bcb(1716,1,Vke,Vfc);_.Lb=function Wfc(a){return BD(a,57),true};_.Fb=function Xfc(a){return this===a};_.Mb=function Yfc(a){return BD(a,57),true};var rU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$22$Type',1716);bcb(1717,1,qie,Zfc);_.td=function $fc(a){BD(a,365).Vd()};var sU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$23$Type',1717);bcb(1697,1,Oie,_fc);_.Mb=function agc(a){return JD(BD(a,57).g,10)};var tU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$3$Type',1697);bcb(1699,1,qie,bgc);_.td=function cgc(a){hfc(this.a,this.b,BD(a,57))};_.a=0;var uU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$4$Type',1699);bcb(1698,1,Pie,dgc);_.Vd=function egc(){cfc(this.b,this.a,-1)};_.a=0;var vU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$5$Type',1698);bcb(1700,1,Vke,fgc);_.Lb=function ggc(a){return BD(a,57),true};_.Fb=function hgc(a){return this===a};_.Mb=function igc(a){return BD(a,57),true};var wU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$6$Type',1700);bcb(1701,1,qie,jgc);_.td=function kgc(a){BD(a,365).Vd()};var xU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$7$Type',1701);bcb(1702,1,Oie,lgc);_.Mb=function mgc(a){return JD(BD(a,57).g,145)};var yU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$8$Type',1702);bcb(1704,1,qie,ngc);_.td=function ogc(a){ifc(this.a,this.b,BD(a,57))};var zU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$9$Type',1704);bcb(1521,1,ene,sgc);_.pf=function xgc(a,b){rgc(this,BD(a,37),b)};var pgc;var EU=mdb(Jne,'HorizontalGraphCompactor',1521);bcb(1522,1,{},ygc);_.Oe=function zgc(a,b){var c,d,e;if(vgc(a,b)){return 0}c=tgc(a);d=tgc(b);if(!!c&&c.k==(j0b(),e0b)||!!d&&d.k==(j0b(),e0b)){return 0}e=BD(vNb(this.a.a,(wtc(),otc)),304);return fBc(e,c?c.k:(j0b(),g0b),d?d.k:(j0b(),g0b))};_.Pe=function Agc(a,b){var c,d,e;if(vgc(a,b)){return 1}c=tgc(a);d=tgc(b);e=BD(vNb(this.a.a,(wtc(),otc)),304);return iBc(e,c?c.k:(j0b(),g0b),d?d.k:(j0b(),g0b))};var BU=mdb(Jne,'HorizontalGraphCompactor/1',1522);bcb(1523,1,{},Bgc);_.Ne=function Cgc(a,b){return qgc(),a.a.i==0};var CU=mdb(Jne,'HorizontalGraphCompactor/lambda$0$Type',1523);bcb(1524,1,{},Dgc);_.Ne=function Egc(a,b){return wgc(this.a,a,b)};var DU=mdb(Jne,'HorizontalGraphCompactor/lambda$1$Type',1524);bcb(1664,1,{},Ygc);var Fgc,Ggc;var cV=mdb(Jne,'LGraphToCGraphTransformer',1664);bcb(1672,1,Oie,ehc);_.Mb=function fhc(a){return a!=null};var FU=mdb(Jne,'LGraphToCGraphTransformer/0methodref$nonNull$Type',1672);bcb(1665,1,{},ghc);_.Kb=function hhc(a){return Hgc(),fcb(vNb(BD(BD(a,57).g,10),(wtc(),$sc)))};var GU=mdb(Jne,'LGraphToCGraphTransformer/lambda$0$Type',1665);bcb(1666,1,{},ihc);_.Kb=function jhc(a){return Hgc(),gic(BD(BD(a,57).g,145))};var HU=mdb(Jne,'LGraphToCGraphTransformer/lambda$1$Type',1666);bcb(1675,1,Oie,khc);_.Mb=function lhc(a){return Hgc(),JD(BD(a,57).g,10)};var IU=mdb(Jne,'LGraphToCGraphTransformer/lambda$10$Type',1675);bcb(1676,1,qie,mhc);_.td=function nhc(a){Zgc(BD(a,57))};var JU=mdb(Jne,'LGraphToCGraphTransformer/lambda$11$Type',1676);bcb(1677,1,Oie,ohc);_.Mb=function phc(a){return Hgc(),JD(BD(a,57).g,145)};var KU=mdb(Jne,'LGraphToCGraphTransformer/lambda$12$Type',1677);bcb(1681,1,qie,qhc);_.td=function rhc(a){$gc(BD(a,57))};var LU=mdb(Jne,'LGraphToCGraphTransformer/lambda$13$Type',1681);bcb(1678,1,qie,shc);_.td=function thc(a){_gc(this.a,BD(a,8))};_.a=0;var MU=mdb(Jne,'LGraphToCGraphTransformer/lambda$14$Type',1678);bcb(1679,1,qie,uhc);_.td=function vhc(a){ahc(this.a,BD(a,110))};_.a=0;var NU=mdb(Jne,'LGraphToCGraphTransformer/lambda$15$Type',1679);bcb(1680,1,qie,whc);_.td=function xhc(a){bhc(this.a,BD(a,8))};_.a=0;var OU=mdb(Jne,'LGraphToCGraphTransformer/lambda$16$Type',1680);bcb(1682,1,{},yhc);_.Kb=function zhc(a){return Hgc(),new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var PU=mdb(Jne,'LGraphToCGraphTransformer/lambda$17$Type',1682);bcb(1683,1,Oie,Ahc);_.Mb=function Bhc(a){return Hgc(),OZb(BD(a,17))};var QU=mdb(Jne,'LGraphToCGraphTransformer/lambda$18$Type',1683);bcb(1684,1,qie,Chc);_.td=function Dhc(a){Qgc(this.a,BD(a,17))};var RU=mdb(Jne,'LGraphToCGraphTransformer/lambda$19$Type',1684);bcb(1668,1,qie,Ehc);_.td=function Fhc(a){Rgc(this.a,BD(a,145))};var SU=mdb(Jne,'LGraphToCGraphTransformer/lambda$2$Type',1668);bcb(1685,1,{},Ghc);_.Kb=function Hhc(a){return Hgc(),new YAb(null,new Kub(BD(a,29).a,16))};var TU=mdb(Jne,'LGraphToCGraphTransformer/lambda$20$Type',1685);bcb(1686,1,{},Ihc);_.Kb=function Jhc(a){return Hgc(),new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var UU=mdb(Jne,'LGraphToCGraphTransformer/lambda$21$Type',1686);bcb(1687,1,{},Khc);_.Kb=function Lhc(a){return Hgc(),BD(vNb(BD(a,17),(wtc(),rtc)),15)};var VU=mdb(Jne,'LGraphToCGraphTransformer/lambda$22$Type',1687);bcb(1688,1,Oie,Mhc);_.Mb=function Nhc(a){return chc(BD(a,15))};var WU=mdb(Jne,'LGraphToCGraphTransformer/lambda$23$Type',1688);bcb(1689,1,qie,Ohc);_.td=function Phc(a){Jgc(this.a,BD(a,15))};var XU=mdb(Jne,'LGraphToCGraphTransformer/lambda$24$Type',1689);bcb(1667,1,qie,Qhc);_.td=function Rhc(a){Sgc(this.a,this.b,BD(a,145))};var YU=mdb(Jne,'LGraphToCGraphTransformer/lambda$3$Type',1667);bcb(1669,1,{},Shc);_.Kb=function Thc(a){return Hgc(),new YAb(null,new Kub(BD(a,29).a,16))};var ZU=mdb(Jne,'LGraphToCGraphTransformer/lambda$4$Type',1669);bcb(1670,1,{},Uhc);_.Kb=function Vhc(a){return Hgc(),new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var $U=mdb(Jne,'LGraphToCGraphTransformer/lambda$5$Type',1670);bcb(1671,1,{},Whc);_.Kb=function Xhc(a){return Hgc(),BD(vNb(BD(a,17),(wtc(),rtc)),15)};var _U=mdb(Jne,'LGraphToCGraphTransformer/lambda$6$Type',1671);bcb(1673,1,qie,Yhc);_.td=function Zhc(a){dhc(this.a,BD(a,15))};var aV=mdb(Jne,'LGraphToCGraphTransformer/lambda$8$Type',1673);bcb(1674,1,qie,$hc);_.td=function _hc(a){Tgc(this.a,this.b,BD(a,145))};var bV=mdb(Jne,'LGraphToCGraphTransformer/lambda$9$Type',1674);bcb(1663,1,{},dic);_.Le=function eic(a){var b,c,d,e,f;this.a=a;this.d=new KFb;this.c=KC(jN,Uhe,121,this.a.a.a.c.length,0,1);this.b=0;for(c=new olb(this.a.a.a);c.a=p){Ekb(f,meb(k));s=$wnd.Math.max(s,t[k-1]-l);h+=o;q+=t[k-1]-q;l=t[k-1];o=i[k]}o=$wnd.Math.max(o,i[k]);++k}h+=o}n=$wnd.Math.min(1/s,1/b.b/h);if(n>d){d=n;c=f}}return c};_.Wf=function mpc(){return false};var CW=mdb(Rne,'MSDCutIndexHeuristic',802);bcb(1617,1,ene,ppc);_.pf=function qpc(a,b){opc(BD(a,37),b)};var DW=mdb(Rne,'SingleEdgeGraphWrapper',1617);bcb(227,22,{3:1,35:1,22:1,227:1},Bpc);var upc,vpc,wpc,xpc,ypc,zpc;var EW=ndb(Sne,'CenterEdgeLabelPlacementStrategy',227,CI,Dpc,Cpc);var Epc;bcb(422,22,{3:1,35:1,22:1,422:1},Jpc);var Gpc,Hpc;var FW=ndb(Sne,'ConstraintCalculationStrategy',422,CI,Lpc,Kpc);var Mpc;bcb(314,22,{3:1,35:1,22:1,314:1,246:1,234:1},Tpc);_.Kf=function Vpc(){return Spc(this)};_.Xf=function Upc(){return Spc(this)};var Opc,Ppc,Qpc;var GW=ndb(Sne,'CrossingMinimizationStrategy',314,CI,Xpc,Wpc);var Ypc;bcb(337,22,{3:1,35:1,22:1,337:1},cqc);var $pc,_pc,aqc;var HW=ndb(Sne,'CuttingStrategy',337,CI,eqc,dqc);var fqc;bcb(335,22,{3:1,35:1,22:1,335:1,246:1,234:1},oqc);_.Kf=function qqc(){return nqc(this)};_.Xf=function pqc(){return nqc(this)};var hqc,iqc,jqc,kqc,lqc;var IW=ndb(Sne,'CycleBreakingStrategy',335,CI,sqc,rqc);var tqc;bcb(419,22,{3:1,35:1,22:1,419:1},yqc);var vqc,wqc;var JW=ndb(Sne,'DirectionCongruency',419,CI,Aqc,zqc);var Bqc;bcb(450,22,{3:1,35:1,22:1,450:1},Hqc);var Dqc,Eqc,Fqc;var KW=ndb(Sne,'EdgeConstraint',450,CI,Jqc,Iqc);var Kqc;bcb(276,22,{3:1,35:1,22:1,276:1},Uqc);var Mqc,Nqc,Oqc,Pqc,Qqc,Rqc;var LW=ndb(Sne,'EdgeLabelSideSelection',276,CI,Wqc,Vqc);var Xqc;bcb(479,22,{3:1,35:1,22:1,479:1},arc);var Zqc,$qc;var MW=ndb(Sne,'EdgeStraighteningStrategy',479,CI,crc,brc);var drc;bcb(274,22,{3:1,35:1,22:1,274:1},mrc);var frc,grc,hrc,irc,jrc,krc;var NW=ndb(Sne,'FixedAlignment',274,CI,orc,nrc);var prc;bcb(275,22,{3:1,35:1,22:1,275:1},zrc);var rrc,trc,urc,vrc,wrc,xrc;var OW=ndb(Sne,'GraphCompactionStrategy',275,CI,Brc,Arc);var Crc;bcb(256,22,{3:1,35:1,22:1,256:1},Prc);var Erc,Frc,Grc,Hrc,Irc,Jrc,Krc,Lrc,Mrc,Nrc;var PW=ndb(Sne,'GraphProperties',256,CI,Rrc,Qrc);var Src;bcb(292,22,{3:1,35:1,22:1,292:1},Yrc);var Urc,Vrc,Wrc;var QW=ndb(Sne,'GreedySwitchType',292,CI,$rc,Zrc);var _rc;bcb(303,22,{3:1,35:1,22:1,303:1},fsc);var bsc,csc,dsc;var RW=ndb(Sne,'InLayerConstraint',303,CI,hsc,gsc);var isc;bcb(420,22,{3:1,35:1,22:1,420:1},nsc);var ksc,lsc;var SW=ndb(Sne,'InteractiveReferencePoint',420,CI,psc,osc);var qsc;var ssc,tsc,usc,vsc,wsc,xsc,ysc,zsc,Asc,Bsc,Csc,Dsc,Esc,Fsc,Gsc,Hsc,Isc,Jsc,Ksc,Lsc,Msc,Nsc,Osc,Psc,Qsc,Rsc,Ssc,Tsc,Usc,Vsc,Wsc,Xsc,Ysc,Zsc,$sc,_sc,atc,btc,ctc,dtc,etc,ftc,gtc,htc,itc,jtc,ktc,ltc,mtc,ntc,otc,ptc,qtc,rtc,stc,ttc,utc,vtc;bcb(163,22,{3:1,35:1,22:1,163:1},Dtc);var xtc,ytc,ztc,Atc,Btc;var TW=ndb(Sne,'LayerConstraint',163,CI,Ftc,Etc);var Gtc;bcb(848,1,ale,kwc);_.Qe=function lwc(a){t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Yne),''),'Direction Congruency'),'Specifies how drawings of the same graph with different layout directions compare to each other: either a natural reading direction is preserved or the drawings are rotated versions of each other.'),puc),(_5c(),V5c)),JW),pqb((N5c(),L5c)))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Zne),''),'Feedback Edges'),'Whether feedback edges should be highlighted by routing around the nodes.'),(Bcb(),false)),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,$ne),''),'Interactive Reference Point'),'Determines which point of a node is considered by interactive layout phases.'),Muc),V5c),SW),pqb(L5c))));o4c(a,$ne,goe,Ouc);o4c(a,$ne,qoe,Nuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,_ne),''),'Merge Edges'),'Edges that have no ports are merged so they touch the connected nodes at the same points. When this option is disabled, one port is created for each edge directly connected to a node. When it is enabled, all such incoming edges share an input port, and all outgoing edges share an output port.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,aoe),''),'Merge Hierarchy-Crossing Edges'),'If hierarchical layout is active, hierarchy-crossing edges use as few hierarchical ports as possible. They are broken by the algorithm, with hierarchical ports inserted as required. Usually, one such port is created for each edge at each hierarchy crossing point. With this option set to true, we try to create as few hierarchical ports as possible in the process. In particular, all edges that form a hyperedge can share a port.'),true),T5c),wI),pqb(L5c))));t4c(a,new p5c(C5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,boe),''),'Allow Non-Flow Ports To Switch Sides'),"Specifies whether non-flow ports may switch sides if their node's port constraints are either FIXED_SIDE or FIXED_ORDER. A non-flow port is a port on a side that is not part of the currently configured layout flow. For instance, given a left-to-right layout direction, north and south ports would be considered non-flow ports. Further note that the underlying criterium whether to switch sides or not solely relies on the minimization of edge crossings. Hence, edge length and other aesthetics criteria are not addressed."),false),T5c),wI),pqb(M5c)),OC(GC(ZI,1),nie,2,6,['org.eclipse.elk.layered.northOrSouthPort']))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,coe),''),'Port Sorting Strategy'),"Only relevant for nodes with FIXED_SIDE port constraints. Determines the way a node's ports are distributed on the sides of a node if their order is not prescribed. The option is set on parent nodes."),xvc),V5c),cX),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,doe),''),'Thoroughness'),'How much effort should be spent to produce a nice layout.'),meb(7)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,eoe),''),'Add Unnecessary Bendpoints'),'Adds bend points even if an edge does not change direction. If true, each long edge dummy will contribute a bend point to its edges and hierarchy-crossing edges will always get a bend point where they cross hierarchy boundaries. By default, bend points are only added where an edge changes direction.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,foe),''),'Generate Position and Layer IDs'),'If enabled position id and layer id are generated, which are usually only used internally when setting the interactiveLayout option. This option should be specified on the root node.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,goe),'cycleBreaking'),'Cycle Breaking Strategy'),'Strategy for cycle breaking. Cycle breaking looks for cycles in the graph and determines which edges to reverse to break the cycles. Reversed edges will end up pointing to the opposite direction of regular edges (that is, reversed edges will point left if edges usually point right).'),nuc),V5c),IW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,hoe),ppe),'Node Layering Strategy'),'Strategy for node layering.'),bvc),V5c),YW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ioe),ppe),'Layer Constraint'),'Determines a constraint on the placement of the node regarding the layering.'),Tuc),V5c),TW),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,joe),ppe),'Layer Choice Constraint'),"Allows to set a constraint regarding the layer placement of a node. Let i be the value of teh constraint. Assumed the drawing has n layers and i < n. If set to i, it expresses that the node should be placed in i-th layer. Should i>=n be true then the node is placed in the last layer of the drawing. Note that this option is not part of any of ELK Layered's default configurations but is only evaluated as part of the `InteractiveLayeredGraphVisitor`, which must be applied manually or used via the `DiagramLayoutEngine."),meb(-1)),X5c),JI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,koe),ppe),'Layer ID'),'Layer identifier that was calculated by ELK Layered for a node. This is only generated if interactiveLayot or generatePositionAndLayerIds is set.'),meb(-1)),X5c),JI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,loe),qpe),'Upper Bound On Width [MinWidth Layerer]'),"Defines a loose upper bound on the width of the MinWidth layerer. If set to '-1' multiple values are tested and the best result is selected."),meb(4)),X5c),JI),pqb(L5c))));o4c(a,loe,hoe,Wuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,moe),qpe),'Upper Layer Estimation Scaling Factor [MinWidth Layerer]'),"Multiplied with Upper Bound On Width for defining an upper bound on the width of layers which haven't been determined yet, but whose maximum width had been (roughly) estimated by the MinWidth algorithm. Compensates for too high estimations. If set to '-1' multiple values are tested and the best result is selected."),meb(2)),X5c),JI),pqb(L5c))));o4c(a,moe,hoe,Yuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,noe),rpe),'Node Promotion Strategy'),'Reduces number of dummy nodes after layering phase (if possible).'),_uc),V5c),aX),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ooe),rpe),'Max Node Promotion Iterations'),'Limits the number of iterations for node promotion.'),meb(0)),X5c),JI),pqb(L5c))));o4c(a,ooe,noe,null);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,poe),'layering.coffmanGraham'),'Layer Bound'),'The maximum number of nodes allowed per layer.'),meb(Ohe)),X5c),JI),pqb(L5c))));o4c(a,poe,hoe,Quc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,qoe),spe),'Crossing Minimization Strategy'),'Strategy for crossing minimization.'),luc),V5c),GW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,roe),spe),'Force Node Model Order'),'The node order given by the model does not change to produce a better layout. E.g. if node A is before node B in the model this is not changed during crossing minimization. This assumes that the node model order is already respected before crossing minimization. This can be achieved by setting considerModelOrder.strategy to NODES_AND_EDGES.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,soe),spe),'Hierarchical Sweepiness'),'How likely it is to use cross-hierarchy (1) vs bottom-up (-1).'),0.1),U5c),BI),pqb(L5c))));o4c(a,soe,tpe,fuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,toe),spe),'Semi-Interactive Crossing Minimization'),"Preserves the order of nodes within a layer but still minimizes crossings between edges connecting long edge dummies. Derives the desired order from positions specified by the 'org.eclipse.elk.position' layout option. Requires a crossing minimization strategy that is able to process 'in-layer' constraints."),false),T5c),wI),pqb(L5c))));o4c(a,toe,qoe,juc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,uoe),spe),'Position Choice Constraint'),"Allows to set a constraint regarding the position placement of a node in a layer. Assumed the layer in which the node placed includes n other nodes and i < n. If set to i, it expresses that the node should be placed at the i-th position. Should i>=n be true then the node is placed at the last position in the layer. Note that this option is not part of any of ELK Layered's default configurations but is only evaluated as part of the `InteractiveLayeredGraphVisitor`, which must be applied manually or used via the `DiagramLayoutEngine."),meb(-1)),X5c),JI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,voe),spe),'Position ID'),'Position within a layer that was determined by ELK Layered for a node. This is only generated if interactiveLayot or generatePositionAndLayerIds is set.'),meb(-1)),X5c),JI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,woe),upe),'Greedy Switch Activation Threshold'),"By default it is decided automatically if the greedy switch is activated or not. The decision is based on whether the size of the input graph (without dummy nodes) is smaller than the value of this option. A '0' enforces the activation."),meb(40)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,xoe),upe),'Greedy Switch Crossing Minimization'),"Greedy Switch strategy for crossing minimization. The greedy switch heuristic is executed after the regular crossing minimization as a post-processor. Note that if 'hierarchyHandling' is set to 'INCLUDE_CHILDREN', the 'greedySwitchHierarchical.type' option must be used."),cuc),V5c),QW),pqb(L5c))));o4c(a,xoe,qoe,duc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,yoe),'crossingMinimization.greedySwitchHierarchical'),'Greedy Switch Crossing Minimization (hierarchical)'),"Activates the greedy switch heuristic in case hierarchical layout is used. The differences to the non-hierarchical case (see 'greedySwitch.type') are: 1) greedy switch is inactive by default, 3) only the option value set on the node at which hierarchical layout starts is relevant, and 2) if it's activated by the user, it properly addresses hierarchy-crossing edges."),$tc),V5c),QW),pqb(L5c))));o4c(a,yoe,qoe,_tc);o4c(a,yoe,tpe,auc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,zoe),vpe),'Node Placement Strategy'),'Strategy for node placement.'),vvc),V5c),_W),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Aoe),vpe),'Favor Straight Edges Over Balancing'),"Favor straight edges over a balanced node placement. The default behavior is determined automatically based on the used 'edgeRouting'. For an orthogonal style it is set to true, for all other styles to false."),T5c),wI),pqb(L5c))));o4c(a,Aoe,zoe,lvc);o4c(a,Aoe,zoe,mvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Boe),wpe),'BK Edge Straightening'),"Specifies whether the Brandes Koepf node placer tries to increase the number of straight edges at the expense of diagram size. There is a subtle difference to the 'favorStraightEdges' option, which decides whether a balanced placement of the nodes is desired, or not. In bk terms this means combining the four alignments into a single balanced one, or not. This option on the other hand tries to straighten additional edges during the creation of each of the four alignments."),fvc),V5c),MW),pqb(L5c))));o4c(a,Boe,zoe,gvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Coe),wpe),'BK Fixed Alignment'),'Tells the BK node placer to use a certain alignment (out of its four) instead of the one producing the smallest height, or the combination of all four.'),ivc),V5c),NW),pqb(L5c))));o4c(a,Coe,zoe,jvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Doe),'nodePlacement.linearSegments'),'Linear Segments Deflection Dampening'),'Dampens the movement of nodes to keep the diagram from getting too large.'),0.3),U5c),BI),pqb(L5c))));o4c(a,Doe,zoe,ovc);t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Eoe),'nodePlacement.networkSimplex'),'Node Flexibility'),"Aims at shorter and straighter edges. Two configurations are possible: (a) allow ports to move freely on the side they are assigned to (the order is always defined beforehand), (b) additionally allow to enlarge a node wherever it helps. If this option is not configured for a node, the 'nodeFlexibility.default' value is used, which is specified for the node's parent."),V5c),$W),pqb(K5c))));o4c(a,Eoe,zoe,tvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Foe),'nodePlacement.networkSimplex.nodeFlexibility'),'Node Flexibility Default'),"Default value of the 'nodeFlexibility' option for the children of a hierarchical node."),rvc),V5c),$W),pqb(L5c))));o4c(a,Foe,zoe,svc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Goe),xpe),'Self-Loop Distribution'),'Alter the distribution of the loops around the node. It only takes effect for PortConstraints.FREE.'),xuc),V5c),eX),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Hoe),xpe),'Self-Loop Ordering'),'Alter the ordering of the loops they can either be stacked or sequenced. It only takes effect for PortConstraints.FREE.'),zuc),V5c),fX),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ioe),'edgeRouting.splines'),'Spline Routing Mode'),'Specifies the way control points are assembled for each individual edge. CONSERVATIVE ensures that edges are properly routed around the nodes but feels rather orthogonal at times. SLOPPY uses fewer control points to obtain curvier edge routes but may result in edges overlapping nodes.'),Buc),V5c),hX),pqb(L5c))));o4c(a,Ioe,ype,Cuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Joe),'edgeRouting.splines.sloppy'),'Sloppy Spline Layer Spacing Factor'),'Spacing factor for routing area between layers when using sloppy spline routing.'),0.2),U5c),BI),pqb(L5c))));o4c(a,Joe,ype,Euc);o4c(a,Joe,Ioe,Fuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Koe),'edgeRouting.polyline'),'Sloped Edge Zone Width'),'Width of the strip to the left and to the right of each layer where the polyline edge router is allowed to refrain from ensuring that edges are routed horizontally. This prevents awkward bend points for nodes that extent almost to the edge of their layer.'),2),U5c),BI),pqb(L5c))));o4c(a,Koe,ype,vuc);t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Loe),zpe),'Spacing Base Value'),"An optional base value for all other layout options of the 'spacing' group. It can be used to conveniently alter the overall 'spaciousness' of the drawing. Whenever an explicit value is set for the other layout options, this base value will have no effect. The base value is not inherited, i.e. it must be set for each hierarchical node."),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Moe),zpe),'Edge Node Between Layers Spacing'),"The spacing to be preserved between nodes and edges that are routed next to the node's layer. For the spacing between nodes and edges that cross the node's layer 'spacing.edgeNode' is used."),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Noe),zpe),'Edge Edge Between Layer Spacing'),"Spacing to be preserved between pairs of edges that are routed between the same pair of layers. Note that 'spacing.edgeEdge' is used for the spacing between pairs of edges crossing the same layer."),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ooe),zpe),'Node Node Between Layers Spacing'),"The spacing to be preserved between any pair of nodes of two adjacent layers. Note that 'spacing.nodeNode' is used for the spacing between nodes within the layer itself."),20),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Poe),Ape),'Direction Priority'),'Defines how important it is to have a certain edge point into the direction of the overall layout. This option is evaluated during the cycle breaking phase.'),meb(0)),X5c),JI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Qoe),Ape),'Shortness Priority'),'Defines how important it is to keep an edge as short as possible. This option is evaluated during the layering phase.'),meb(0)),X5c),JI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Roe),Ape),'Straightness Priority'),'Defines how important it is to keep an edge straight, i.e. aligned with one of the two axes. This option is evaluated during node placement.'),meb(0)),X5c),JI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Soe),Bpe),Ole),'Tries to further compact components (disconnected sub-graphs).'),false),T5c),wI),pqb(L5c))));o4c(a,Soe,zme,true);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Toe),Cpe),'Post Compaction Strategy'),Dpe),Ntc),V5c),OW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Uoe),Cpe),'Post Compaction Constraint Calculation'),Dpe),Ltc),V5c),FW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Voe),Epe),'High Degree Node Treatment'),'Makes room around high degree nodes to place leafs and trees.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Woe),Epe),'High Degree Node Threshold'),'Whether a node is considered to have a high degree.'),meb(16)),X5c),JI),pqb(L5c))));o4c(a,Woe,Voe,true);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Xoe),Epe),'High Degree Node Maximum Tree Height'),'Maximum height of a subtree connected to a high degree node to be moved to separate layers.'),meb(5)),X5c),JI),pqb(L5c))));o4c(a,Xoe,Voe,true);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Yoe),Fpe),'Graph Wrapping Strategy'),"For certain graphs and certain prescribed drawing areas it may be desirable to split the laid out graph into chunks that are placed side by side. The edges that connect different chunks are 'wrapped' around from the end of one chunk to the start of the other chunk. The points between the chunks are referred to as 'cuts'."),bwc),V5c),jX),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Zoe),Fpe),'Additional Wrapped Edges Spacing'),'To visually separate edges that are wrapped from regularly routed edges an additional spacing value can be specified in form of this layout option. The spacing is added to the regular edgeNode spacing.'),10),U5c),BI),pqb(L5c))));o4c(a,Zoe,Yoe,Ivc);o4c(a,Zoe,Yoe,Jvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,$oe),Fpe),'Correction Factor for Wrapping'),"At times and for certain types of graphs the executed wrapping may produce results that are consistently biased in the same fashion: either wrapping to often or to rarely. This factor can be used to correct the bias. Internally, it is simply multiplied with the 'aspect ratio' layout option."),1),U5c),BI),pqb(L5c))));o4c(a,$oe,Yoe,Lvc);o4c(a,$oe,Yoe,Mvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,_oe),Gpe),'Cutting Strategy'),'The strategy by which the layer indexes are determined at which the layering crumbles into chunks.'),Tvc),V5c),HW),pqb(L5c))));o4c(a,_oe,Yoe,Uvc);o4c(a,_oe,Yoe,Vvc);t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,ape),Gpe),'Manually Specified Cuts'),'Allows the user to specify her own cuts for a certain graph.'),Y5c),yK),pqb(L5c))));o4c(a,ape,_oe,Ovc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,bpe),'wrapping.cutting.msd'),'MSD Freedom'),'The MSD cutting strategy starts with an initial guess on the number of chunks the graph should be split into. The freedom specifies how much the strategy may deviate from this guess. E.g. if an initial number of 3 is computed, a freedom of 1 allows 2, 3, and 4 cuts.'),Qvc),X5c),JI),pqb(L5c))));o4c(a,bpe,_oe,Rvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,cpe),Hpe),'Validification Strategy'),'When wrapping graphs, one can specify indices that are not allowed as split points. The validification strategy makes sure every computed split point is allowed.'),gwc),V5c),iX),pqb(L5c))));o4c(a,cpe,Yoe,hwc);o4c(a,cpe,Yoe,iwc);t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,dpe),Hpe),'Valid Indices for Wrapping'),null),Y5c),yK),pqb(L5c))));o4c(a,dpe,Yoe,dwc);o4c(a,dpe,Yoe,ewc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,epe),Ipe),'Improve Cuts'),'For general graphs it is important that not too many edges wrap backwards. Thus a compromise between evenly-distributed cuts and the total number of cut edges is sought.'),true),T5c),wI),pqb(L5c))));o4c(a,epe,Yoe,Zvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,fpe),Ipe),'Distance Penalty When Improving Cuts'),null),2),U5c),BI),pqb(L5c))));o4c(a,fpe,Yoe,Xvc);o4c(a,fpe,epe,true);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,gpe),Ipe),'Improve Wrapped Edges'),'The initial wrapping is performed in a very simple way. As a consequence, edges that wrap from one chunk to another may be unnecessarily long. Activating this option tries to shorten such edges.'),true),T5c),wI),pqb(L5c))));o4c(a,gpe,Yoe,_vc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,hpe),Jpe),'Edge Label Side Selection'),'Method to decide on edge label sides.'),tuc),V5c),LW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ipe),Jpe),'Edge Center Label Placement Strategy'),'Determines in which layer center labels of long edges should be placed.'),ruc),V5c),EW),qqb(L5c,OC(GC(e1,1),Kie,175,0,[J5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,jpe),Kpe),'Consider Model Order'),'Preserves the order of nodes and edges in the model file if this does not lead to additional edge crossings. Depending on the strategy this is not always possible since the node and edge order might be conflicting.'),Wtc),V5c),bX),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,kpe),Kpe),'No Model Order'),'Set on a node to not set a model order for this node even though it is a real node.'),false),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,lpe),Kpe),'Consider Model Order for Components'),'If set to NONE the usual ordering strategy (by cumulative node priority and size of nodes) is used. INSIDE_PORT_SIDES orders the components with external ports only inside the groups with the same port side. FORCE_MODEL_ORDER enforces the mode order on components. This option might produce bad alignments and sub optimal drawings in terms of used area since the ordering should be respected.'),Ptc),V5c),hQ),pqb(L5c))));o4c(a,lpe,zme,null);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,mpe),Kpe),'Long Edge Ordering Strategy'),'Indicates whether long edges are sorted under, over, or equal to nodes that have no connection to a previous layer in a left-to-right or right-to-left layout. Under and over changes to right and left in a vertical layout.'),Ttc),V5c),ZW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,npe),Kpe),'Crossing Counter Node Order Influence'),'Indicates with what percentage (1 for 100%) violations of the node model order are weighted against the crossings e.g. a value of 0.5 means two model order violations are as important as on edge crossing. This allows some edge crossings in favor of preserving the model order. It is advised to set this value to a very small positive value (e.g. 0.001) to have minimal crossing and a optimal node order. Defaults to no influence (0).'),0),U5c),BI),pqb(L5c))));o4c(a,npe,jpe,null);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ope),Kpe),'Crossing Counter Port Order Influence'),'Indicates with what percentage (1 for 100%) violations of the port model order are weighted against the crossings e.g. a value of 0.5 means two model order violations are as important as on edge crossing. This allows some edge crossings in favor of preserving the model order. It is advised to set this value to a very small positive value (e.g. 0.001) to have minimal crossing and a optimal port order. Defaults to no influence (0).'),0),U5c),BI),pqb(L5c))));o4c(a,ope,jpe,null);Oyc((new Pyc,a))};var Itc,Jtc,Ktc,Ltc,Mtc,Ntc,Otc,Ptc,Qtc,Rtc,Stc,Ttc,Utc,Vtc,Wtc,Xtc,Ytc,Ztc,$tc,_tc,auc,buc,cuc,duc,euc,fuc,guc,huc,iuc,juc,kuc,luc,muc,nuc,ouc,puc,quc,ruc,suc,tuc,uuc,vuc,wuc,xuc,yuc,zuc,Auc,Buc,Cuc,Duc,Euc,Fuc,Guc,Huc,Iuc,Juc,Kuc,Luc,Muc,Nuc,Ouc,Puc,Quc,Ruc,Suc,Tuc,Uuc,Vuc,Wuc,Xuc,Yuc,Zuc,$uc,_uc,avc,bvc,cvc,dvc,evc,fvc,gvc,hvc,ivc,jvc,kvc,lvc,mvc,nvc,ovc,pvc,qvc,rvc,svc,tvc,uvc,vvc,wvc,xvc,yvc,zvc,Avc,Bvc,Cvc,Dvc,Evc,Fvc,Gvc,Hvc,Ivc,Jvc,Kvc,Lvc,Mvc,Nvc,Ovc,Pvc,Qvc,Rvc,Svc,Tvc,Uvc,Vvc,Wvc,Xvc,Yvc,Zvc,$vc,_vc,awc,bwc,cwc,dwc,ewc,fwc,gwc,hwc,iwc;var UW=mdb(Sne,'LayeredMetaDataProvider',848);bcb(986,1,ale,Pyc);_.Qe=function Qyc(a){Oyc(a)};var mwc,nwc,owc,pwc,qwc,rwc,swc,twc,uwc,vwc,wwc,xwc,ywc,zwc,Awc,Bwc,Cwc,Dwc,Ewc,Fwc,Gwc,Hwc,Iwc,Jwc,Kwc,Lwc,Mwc,Nwc,Owc,Pwc,Qwc,Rwc,Swc,Twc,Uwc,Vwc,Wwc,Xwc,Ywc,Zwc,$wc,_wc,axc,bxc,cxc,dxc,exc,fxc,gxc,hxc,ixc,jxc,kxc,lxc,mxc,nxc,oxc,pxc,qxc,rxc,sxc,txc,uxc,vxc,wxc,xxc,yxc,zxc,Axc,Bxc,Cxc,Dxc,Exc,Fxc,Gxc,Hxc,Ixc,Jxc,Kxc,Lxc,Mxc,Nxc,Oxc,Pxc,Qxc,Rxc,Sxc,Txc,Uxc,Vxc,Wxc,Xxc,Yxc,Zxc,$xc,_xc,ayc,byc,cyc,dyc,eyc,fyc,gyc,hyc,iyc,jyc,kyc,lyc,myc,nyc,oyc,pyc,qyc,ryc,syc,tyc,uyc,vyc,wyc,xyc,yyc,zyc,Ayc,Byc,Cyc,Dyc,Eyc,Fyc,Gyc,Hyc,Iyc,Jyc,Kyc,Lyc,Myc;var WW=mdb(Sne,'LayeredOptions',986);bcb(987,1,{},Ryc);_.$e=function Syc(){var a;return a=new jUb,a};_._e=function Tyc(a){};var VW=mdb(Sne,'LayeredOptions/LayeredFactory',987);bcb(1372,1,{});_.a=0;var Uyc;var $1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder',1372);bcb(779,1372,{},ezc);var bzc,czc;var XW=mdb(Sne,'LayeredSpacings/LayeredSpacingsBuilder',779);bcb(313,22,{3:1,35:1,22:1,313:1,246:1,234:1},nzc);_.Kf=function pzc(){return mzc(this)};_.Xf=function ozc(){return mzc(this)};var fzc,gzc,hzc,izc,jzc,kzc;var YW=ndb(Sne,'LayeringStrategy',313,CI,rzc,qzc);var szc;bcb(378,22,{3:1,35:1,22:1,378:1},zzc);var uzc,vzc,wzc;var ZW=ndb(Sne,'LongEdgeOrderingStrategy',378,CI,Bzc,Azc);var Czc;bcb(197,22,{3:1,35:1,22:1,197:1},Kzc);var Ezc,Fzc,Gzc,Hzc;var $W=ndb(Sne,'NodeFlexibility',197,CI,Nzc,Mzc);var Ozc;bcb(315,22,{3:1,35:1,22:1,315:1,246:1,234:1},Xzc);_.Kf=function Zzc(){return Wzc(this)};_.Xf=function Yzc(){return Wzc(this)};var Qzc,Rzc,Szc,Tzc,Uzc;var _W=ndb(Sne,'NodePlacementStrategy',315,CI,_zc,$zc);var aAc;bcb(260,22,{3:1,35:1,22:1,260:1},lAc);var cAc,dAc,eAc,fAc,gAc,hAc,iAc,jAc;var aX=ndb(Sne,'NodePromotionStrategy',260,CI,nAc,mAc);var oAc;bcb(339,22,{3:1,35:1,22:1,339:1},uAc);var qAc,rAc,sAc;var bX=ndb(Sne,'OrderingStrategy',339,CI,wAc,vAc);var xAc;bcb(421,22,{3:1,35:1,22:1,421:1},CAc);var zAc,AAc;var cX=ndb(Sne,'PortSortingStrategy',421,CI,EAc,DAc);var FAc;bcb(452,22,{3:1,35:1,22:1,452:1},LAc);var HAc,IAc,JAc;var dX=ndb(Sne,'PortType',452,CI,NAc,MAc);var OAc;bcb(375,22,{3:1,35:1,22:1,375:1},UAc);var QAc,RAc,SAc;var eX=ndb(Sne,'SelfLoopDistributionStrategy',375,CI,WAc,VAc);var XAc;bcb(376,22,{3:1,35:1,22:1,376:1},aBc);var ZAc,$Ac;var fX=ndb(Sne,'SelfLoopOrderingStrategy',376,CI,cBc,bBc);var dBc;bcb(304,1,{304:1},oBc);var gX=mdb(Sne,'Spacings',304);bcb(336,22,{3:1,35:1,22:1,336:1},uBc);var qBc,rBc,sBc;var hX=ndb(Sne,'SplineRoutingMode',336,CI,wBc,vBc);var xBc;bcb(338,22,{3:1,35:1,22:1,338:1},DBc);var zBc,ABc,BBc;var iX=ndb(Sne,'ValidifyStrategy',338,CI,FBc,EBc);var GBc;bcb(377,22,{3:1,35:1,22:1,377:1},MBc);var IBc,JBc,KBc;var jX=ndb(Sne,'WrappingStrategy',377,CI,OBc,NBc);var PBc;bcb(1383,1,Bqe,VBc);_.Yf=function WBc(a){return BD(a,37),RBc};_.pf=function XBc(a,b){UBc(this,BD(a,37),b)};var RBc;var kX=mdb(Cqe,'DepthFirstCycleBreaker',1383);bcb(782,1,Bqe,aCc);_.Yf=function cCc(a){return BD(a,37),YBc};_.pf=function dCc(a,b){$Bc(this,BD(a,37),b)};_.Zf=function bCc(a){return BD(Ikb(a,Bub(this.d,a.c.length)),10)};var YBc;var lX=mdb(Cqe,'GreedyCycleBreaker',782);bcb(1386,782,Bqe,eCc);_.Zf=function fCc(a){var b,c,d,e;e=null;b=Ohe;for(d=new olb(a);d.a1){Ccb(DD(vNb(Q_b((tCb(0,a.c.length),BD(a.c[0],10))),(Nyc(),Awc))))?YGc(a,this.d,BD(this,660)):(mmb(),Okb(a,this.d));PEc(this.e,a)}};_.Sf=function DEc(a,b,c,d){var e,f,g,h,i,j,k;if(b!=sEc(c,a.length)){f=a[b-(c?1:-1)];UDc(this.f,f,c?(KAc(),IAc):(KAc(),HAc))}e=a[b][0];k=!d||e.k==(j0b(),e0b);j=Ou(a[b]);this.ag(j,k,false,c);g=0;for(i=new olb(j);i.a');a0?(RHc(this.a,a[b-1],a[b]),undefined):!c&&b1){Ccb(DD(vNb(Q_b((tCb(0,a.c.length),BD(a.c[0],10))),(Nyc(),Awc))))?YGc(a,this.d,this):(mmb(),Okb(a,this.d));Ccb(DD(vNb(Q_b((tCb(0,a.c.length),BD(a.c[0],10))),Awc)))||PEc(this.e,a)}};var YX=mdb(Gqe,'ModelOrderBarycenterHeuristic',660);bcb(1803,1,Dke,$Gc);_.ue=function _Gc(a,b){return VGc(this.a,BD(a,10),BD(b,10))};_.Fb=function aHc(a){return this===a};_.ve=function bHc(){return new tpb(this)};var XX=mdb(Gqe,'ModelOrderBarycenterHeuristic/lambda$0$Type',1803);bcb(1403,1,Bqe,fHc);_.Yf=function gHc(a){var b;return BD(a,37),b=k3c(cHc),e3c(b,(qUb(),nUb),(S8b(),H8b)),b};_.pf=function hHc(a,b){eHc((BD(a,37),b))};var cHc;var ZX=mdb(Gqe,'NoCrossingMinimizer',1403);bcb(796,402,Eqe,iHc);_.$f=function jHc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n;l=this.g;switch(c.g){case 1:{e=0;f=0;for(k=new olb(a.j);k.a1&&(e.j==(Ucd(),zcd)?(this.b[a]=true):e.j==Tcd&&a>0&&(this.b[a-1]=true))};_.f=0;var aY=mdb(Lne,'AllCrossingsCounter',1798);bcb(587,1,{},BHc);_.b=0;_.d=0;var bY=mdb(Lne,'BinaryIndexedTree',587);bcb(524,1,{},dIc);var DHc,EHc;var lY=mdb(Lne,'CrossingsCounter',524);bcb(1906,1,Dke,hIc);_.ue=function iIc(a,b){return YHc(this.a,BD(a,11),BD(b,11))};_.Fb=function jIc(a){return this===a};_.ve=function kIc(){return new tpb(this)};var cY=mdb(Lne,'CrossingsCounter/lambda$0$Type',1906);bcb(1907,1,Dke,lIc);_.ue=function mIc(a,b){return ZHc(this.a,BD(a,11),BD(b,11))};_.Fb=function nIc(a){return this===a};_.ve=function oIc(){return new tpb(this)};var dY=mdb(Lne,'CrossingsCounter/lambda$1$Type',1907);bcb(1908,1,Dke,pIc);_.ue=function qIc(a,b){return $Hc(this.a,BD(a,11),BD(b,11))};_.Fb=function rIc(a){return this===a};_.ve=function sIc(){return new tpb(this)};var eY=mdb(Lne,'CrossingsCounter/lambda$2$Type',1908);bcb(1909,1,Dke,tIc);_.ue=function uIc(a,b){return _Hc(this.a,BD(a,11),BD(b,11))};_.Fb=function vIc(a){return this===a};_.ve=function wIc(){return new tpb(this)};var fY=mdb(Lne,'CrossingsCounter/lambda$3$Type',1909);bcb(1910,1,qie,xIc);_.td=function yIc(a){eIc(this.a,BD(a,11))};var gY=mdb(Lne,'CrossingsCounter/lambda$4$Type',1910);bcb(1911,1,Oie,zIc);_.Mb=function AIc(a){return fIc(this.a,BD(a,11))};var hY=mdb(Lne,'CrossingsCounter/lambda$5$Type',1911);bcb(1912,1,qie,CIc);_.td=function DIc(a){BIc(this,a)};var iY=mdb(Lne,'CrossingsCounter/lambda$6$Type',1912);bcb(1913,1,qie,EIc);_.td=function FIc(a){var b;FHc();Wjb(this.b,(b=this.a,BD(a,11),b))};var jY=mdb(Lne,'CrossingsCounter/lambda$7$Type',1913);bcb(826,1,Vke,GIc);_.Lb=function HIc(a){return FHc(),wNb(BD(a,11),(wtc(),gtc))};_.Fb=function IIc(a){return this===a};_.Mb=function JIc(a){return FHc(),wNb(BD(a,11),(wtc(),gtc))};var kY=mdb(Lne,'CrossingsCounter/lambda$8$Type',826);bcb(1905,1,{},LIc);var pY=mdb(Lne,'HyperedgeCrossingsCounter',1905);bcb(467,1,{35:1,467:1},NIc);_.wd=function OIc(a){return MIc(this,BD(a,467))};_.b=0;_.c=0;_.e=0;_.f=0;var oY=mdb(Lne,'HyperedgeCrossingsCounter/Hyperedge',467);bcb(362,1,{35:1,362:1},QIc);_.wd=function RIc(a){return PIc(this,BD(a,362))};_.b=0;_.c=0;var nY=mdb(Lne,'HyperedgeCrossingsCounter/HyperedgeCorner',362);bcb(523,22,{3:1,35:1,22:1,523:1},VIc);var SIc,TIc;var mY=ndb(Lne,'HyperedgeCrossingsCounter/HyperedgeCorner/Type',523,CI,XIc,WIc);var YIc;bcb(1405,1,Bqe,dJc);_.Yf=function eJc(a){return BD(vNb(BD(a,37),(wtc(),Ksc)),21).Hc((Orc(),Hrc))?_Ic:null};_.pf=function fJc(a,b){cJc(this,BD(a,37),b)};var _Ic;var rY=mdb(Hqe,'InteractiveNodePlacer',1405);bcb(1406,1,Bqe,tJc);_.Yf=function uJc(a){return BD(vNb(BD(a,37),(wtc(),Ksc)),21).Hc((Orc(),Hrc))?gJc:null};_.pf=function vJc(a,b){rJc(this,BD(a,37),b)};var gJc,hJc,iJc;var tY=mdb(Hqe,'LinearSegmentsNodePlacer',1406);bcb(257,1,{35:1,257:1},zJc);_.wd=function AJc(a){return wJc(this,BD(a,257))};_.Fb=function BJc(a){var b;if(JD(a,257)){b=BD(a,257);return this.b==b.b}return false};_.Hb=function CJc(){return this.b};_.Ib=function DJc(){return 'ls'+Fe(this.e)};_.a=0;_.b=0;_.c=-1;_.d=-1;_.g=0;var sY=mdb(Hqe,'LinearSegmentsNodePlacer/LinearSegment',257);bcb(1408,1,Bqe,$Jc);_.Yf=function _Jc(a){return BD(vNb(BD(a,37),(wtc(),Ksc)),21).Hc((Orc(),Hrc))?EJc:null};_.pf=function hKc(a,b){WJc(this,BD(a,37),b)};_.b=0;_.g=0;var EJc;var dZ=mdb(Hqe,'NetworkSimplexPlacer',1408);bcb(1427,1,Dke,iKc);_.ue=function jKc(a,b){return beb(BD(a,19).a,BD(b,19).a)};_.Fb=function kKc(a){return this===a};_.ve=function lKc(){return new tpb(this)};var uY=mdb(Hqe,'NetworkSimplexPlacer/0methodref$compare$Type',1427);bcb(1429,1,Dke,mKc);_.ue=function nKc(a,b){return beb(BD(a,19).a,BD(b,19).a)};_.Fb=function oKc(a){return this===a};_.ve=function pKc(){return new tpb(this)};var vY=mdb(Hqe,'NetworkSimplexPlacer/1methodref$compare$Type',1429);bcb(649,1,{649:1},qKc);var wY=mdb(Hqe,'NetworkSimplexPlacer/EdgeRep',649);bcb(401,1,{401:1},rKc);_.b=false;var xY=mdb(Hqe,'NetworkSimplexPlacer/NodeRep',401);bcb(508,12,{3:1,4:1,20:1,28:1,52:1,12:1,14:1,15:1,54:1,508:1},vKc);var CY=mdb(Hqe,'NetworkSimplexPlacer/Path',508);bcb(1409,1,{},wKc);_.Kb=function xKc(a){return BD(a,17).d.i.k};var yY=mdb(Hqe,'NetworkSimplexPlacer/Path/lambda$0$Type',1409);bcb(1410,1,Oie,yKc);_.Mb=function zKc(a){return BD(a,267)==(j0b(),g0b)};var zY=mdb(Hqe,'NetworkSimplexPlacer/Path/lambda$1$Type',1410);bcb(1411,1,{},AKc);_.Kb=function BKc(a){return BD(a,17).d.i};var AY=mdb(Hqe,'NetworkSimplexPlacer/Path/lambda$2$Type',1411);bcb(1412,1,Oie,CKc);_.Mb=function DKc(a){return eLc(Lzc(BD(a,10)))};var BY=mdb(Hqe,'NetworkSimplexPlacer/Path/lambda$3$Type',1412);bcb(1413,1,Oie,EKc);_.Mb=function FKc(a){return dKc(BD(a,11))};var DY=mdb(Hqe,'NetworkSimplexPlacer/lambda$0$Type',1413);bcb(1414,1,qie,GKc);_.td=function HKc(a){LJc(this.a,this.b,BD(a,11))};var EY=mdb(Hqe,'NetworkSimplexPlacer/lambda$1$Type',1414);bcb(1423,1,qie,IKc);_.td=function JKc(a){MJc(this.a,BD(a,17))};var FY=mdb(Hqe,'NetworkSimplexPlacer/lambda$10$Type',1423);bcb(1424,1,{},KKc);_.Kb=function LKc(a){return FJc(),new YAb(null,new Kub(BD(a,29).a,16))};var GY=mdb(Hqe,'NetworkSimplexPlacer/lambda$11$Type',1424);bcb(1425,1,qie,MKc);_.td=function NKc(a){NJc(this.a,BD(a,10))};var HY=mdb(Hqe,'NetworkSimplexPlacer/lambda$12$Type',1425);bcb(1426,1,{},OKc);_.Kb=function PKc(a){return FJc(),meb(BD(a,121).e)};var IY=mdb(Hqe,'NetworkSimplexPlacer/lambda$13$Type',1426);bcb(1428,1,{},QKc);_.Kb=function RKc(a){return FJc(),meb(BD(a,121).e)};var JY=mdb(Hqe,'NetworkSimplexPlacer/lambda$15$Type',1428);bcb(1430,1,Oie,SKc);_.Mb=function TKc(a){return FJc(),BD(a,401).c.k==(j0b(),h0b)};var KY=mdb(Hqe,'NetworkSimplexPlacer/lambda$17$Type',1430);bcb(1431,1,Oie,UKc);_.Mb=function VKc(a){return FJc(),BD(a,401).c.j.c.length>1};var LY=mdb(Hqe,'NetworkSimplexPlacer/lambda$18$Type',1431);bcb(1432,1,qie,WKc);_.td=function XKc(a){eKc(this.c,this.b,this.d,this.a,BD(a,401))};_.c=0;_.d=0;var MY=mdb(Hqe,'NetworkSimplexPlacer/lambda$19$Type',1432);bcb(1415,1,{},YKc);_.Kb=function ZKc(a){return FJc(),new YAb(null,new Kub(BD(a,29).a,16))};var NY=mdb(Hqe,'NetworkSimplexPlacer/lambda$2$Type',1415);bcb(1433,1,qie,$Kc);_.td=function _Kc(a){fKc(this.a,BD(a,11))};_.a=0;var OY=mdb(Hqe,'NetworkSimplexPlacer/lambda$20$Type',1433);bcb(1434,1,{},aLc);_.Kb=function bLc(a){return FJc(),new YAb(null,new Kub(BD(a,29).a,16))};var PY=mdb(Hqe,'NetworkSimplexPlacer/lambda$21$Type',1434);bcb(1435,1,qie,cLc);_.td=function dLc(a){OJc(this.a,BD(a,10))};var QY=mdb(Hqe,'NetworkSimplexPlacer/lambda$22$Type',1435);bcb(1436,1,Oie,fLc);_.Mb=function gLc(a){return eLc(a)};var RY=mdb(Hqe,'NetworkSimplexPlacer/lambda$23$Type',1436);bcb(1437,1,{},hLc);_.Kb=function iLc(a){return FJc(),new YAb(null,new Kub(BD(a,29).a,16))};var SY=mdb(Hqe,'NetworkSimplexPlacer/lambda$24$Type',1437);bcb(1438,1,Oie,jLc);_.Mb=function kLc(a){return PJc(this.a,BD(a,10))};var TY=mdb(Hqe,'NetworkSimplexPlacer/lambda$25$Type',1438);bcb(1439,1,qie,lLc);_.td=function mLc(a){QJc(this.a,this.b,BD(a,10))};var UY=mdb(Hqe,'NetworkSimplexPlacer/lambda$26$Type',1439);bcb(1440,1,Oie,nLc);_.Mb=function oLc(a){return FJc(),!OZb(BD(a,17))};var VY=mdb(Hqe,'NetworkSimplexPlacer/lambda$27$Type',1440);bcb(1441,1,Oie,pLc);_.Mb=function qLc(a){return FJc(),!OZb(BD(a,17))};var WY=mdb(Hqe,'NetworkSimplexPlacer/lambda$28$Type',1441);bcb(1442,1,{},rLc);_.Ce=function sLc(a,b){return RJc(this.a,BD(a,29),BD(b,29))};var XY=mdb(Hqe,'NetworkSimplexPlacer/lambda$29$Type',1442);bcb(1416,1,{},tLc);_.Kb=function uLc(a){return FJc(),new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var YY=mdb(Hqe,'NetworkSimplexPlacer/lambda$3$Type',1416);bcb(1417,1,Oie,vLc);_.Mb=function wLc(a){return FJc(),cKc(BD(a,17))};var ZY=mdb(Hqe,'NetworkSimplexPlacer/lambda$4$Type',1417);bcb(1418,1,qie,xLc);_.td=function yLc(a){XJc(this.a,BD(a,17))};var $Y=mdb(Hqe,'NetworkSimplexPlacer/lambda$5$Type',1418);bcb(1419,1,{},zLc);_.Kb=function ALc(a){return FJc(),new YAb(null,new Kub(BD(a,29).a,16))};var _Y=mdb(Hqe,'NetworkSimplexPlacer/lambda$6$Type',1419);bcb(1420,1,Oie,BLc);_.Mb=function CLc(a){return FJc(),BD(a,10).k==(j0b(),h0b)};var aZ=mdb(Hqe,'NetworkSimplexPlacer/lambda$7$Type',1420);bcb(1421,1,{},DLc);_.Kb=function ELc(a){return FJc(),new YAb(null,new Lub(new Sr(ur(O_b(BD(a,10)).a.Kc(),new Sq))))};var bZ=mdb(Hqe,'NetworkSimplexPlacer/lambda$8$Type',1421);bcb(1422,1,Oie,FLc);_.Mb=function GLc(a){return FJc(),NZb(BD(a,17))};var cZ=mdb(Hqe,'NetworkSimplexPlacer/lambda$9$Type',1422);bcb(1404,1,Bqe,KLc);_.Yf=function LLc(a){return BD(vNb(BD(a,37),(wtc(),Ksc)),21).Hc((Orc(),Hrc))?HLc:null};_.pf=function MLc(a,b){JLc(BD(a,37),b)};var HLc;var eZ=mdb(Hqe,'SimpleNodePlacer',1404);bcb(180,1,{180:1},ULc);_.Ib=function VLc(){var a;a='';this.c==(YLc(),XLc)?(a+=kle):this.c==WLc&&(a+=jle);this.o==(eMc(),cMc)?(a+=vle):this.o==dMc?(a+='UP'):(a+='BALANCED');return a};var hZ=mdb(Kqe,'BKAlignedLayout',180);bcb(516,22,{3:1,35:1,22:1,516:1},ZLc);var WLc,XLc;var fZ=ndb(Kqe,'BKAlignedLayout/HDirection',516,CI,_Lc,$Lc);var aMc;bcb(515,22,{3:1,35:1,22:1,515:1},fMc);var cMc,dMc;var gZ=ndb(Kqe,'BKAlignedLayout/VDirection',515,CI,hMc,gMc);var iMc;bcb(1634,1,{},mMc);var iZ=mdb(Kqe,'BKAligner',1634);bcb(1637,1,{},rMc);var lZ=mdb(Kqe,'BKCompactor',1637);bcb(654,1,{654:1},sMc);_.a=0;var jZ=mdb(Kqe,'BKCompactor/ClassEdge',654);bcb(458,1,{458:1},uMc);_.a=null;_.b=0;var kZ=mdb(Kqe,'BKCompactor/ClassNode',458);bcb(1407,1,Bqe,CMc);_.Yf=function GMc(a){return BD(vNb(BD(a,37),(wtc(),Ksc)),21).Hc((Orc(),Hrc))?vMc:null};_.pf=function HMc(a,b){BMc(this,BD(a,37),b)};_.d=false;var vMc;var mZ=mdb(Kqe,'BKNodePlacer',1407);bcb(1635,1,{},JMc);_.d=0;var oZ=mdb(Kqe,'NeighborhoodInformation',1635);bcb(1636,1,Dke,OMc);_.ue=function PMc(a,b){return NMc(this,BD(a,46),BD(b,46))};_.Fb=function QMc(a){return this===a};_.ve=function RMc(){return new tpb(this)};var nZ=mdb(Kqe,'NeighborhoodInformation/NeighborComparator',1636);bcb(808,1,{});var sZ=mdb(Kqe,'ThresholdStrategy',808);bcb(1763,808,{},WMc);_.bg=function XMc(a,b,c){return this.a.o==(eMc(),dMc)?Pje:Qje};_.cg=function YMc(){};var pZ=mdb(Kqe,'ThresholdStrategy/NullThresholdStrategy',1763);bcb(579,1,{579:1},ZMc);_.c=false;_.d=false;var qZ=mdb(Kqe,'ThresholdStrategy/Postprocessable',579);bcb(1764,808,{},bNc);_.bg=function cNc(a,b,c){var d,e,f;e=b==c;d=this.a.a[c.p]==b;if(!(e||d)){return a}f=a;if(this.a.c==(YLc(),XLc)){e&&(f=$Mc(this,b,true));!isNaN(f)&&!isFinite(f)&&d&&(f=$Mc(this,c,false))}else{e&&(f=$Mc(this,b,true));!isNaN(f)&&!isFinite(f)&&d&&(f=$Mc(this,c,false))}return f};_.cg=function dNc(){var a,b,c,d,e;while(this.d.b!=0){e=BD(Ksb(this.d),579);d=_Mc(this,e);if(!d.a){continue}a=d.a;c=Ccb(this.a.f[this.a.g[e.b.p].p]);if(!c&&!OZb(a)&&a.c.i.c==a.d.i.c){continue}b=aNc(this,e);b||swb(this.e,e)}while(this.e.a.c.length!=0){aNc(this,BD(rwb(this.e),579))}};var rZ=mdb(Kqe,'ThresholdStrategy/SimpleThresholdStrategy',1764);bcb(635,1,{635:1,246:1,234:1},hNc);_.Kf=function jNc(){return gNc(this)};_.Xf=function iNc(){return gNc(this)};var eNc;var tZ=mdb(Lqe,'EdgeRouterFactory',635);bcb(1458,1,Bqe,wNc);_.Yf=function xNc(a){return uNc(BD(a,37))};_.pf=function yNc(a,b){vNc(BD(a,37),b)};var lNc,mNc,nNc,oNc,pNc,qNc,rNc,sNc;var uZ=mdb(Lqe,'OrthogonalEdgeRouter',1458);bcb(1451,1,Bqe,NNc);_.Yf=function ONc(a){return INc(BD(a,37))};_.pf=function PNc(a,b){KNc(this,BD(a,37),b)};var zNc,ANc,BNc,CNc,DNc,ENc;var wZ=mdb(Lqe,'PolylineEdgeRouter',1451);bcb(1452,1,Vke,RNc);_.Lb=function SNc(a){return QNc(BD(a,10))};_.Fb=function TNc(a){return this===a};_.Mb=function UNc(a){return QNc(BD(a,10))};var vZ=mdb(Lqe,'PolylineEdgeRouter/1',1452);bcb(1809,1,Oie,ZNc);_.Mb=function $Nc(a){return BD(a,129).c==(HOc(),FOc)};var xZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$0$Type',1809);bcb(1810,1,{},_Nc);_.Ge=function aOc(a){return BD(a,129).d};var yZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$1$Type',1810);bcb(1811,1,Oie,bOc);_.Mb=function cOc(a){return BD(a,129).c==(HOc(),FOc)};var zZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$2$Type',1811);bcb(1812,1,{},dOc);_.Ge=function eOc(a){return BD(a,129).d};var AZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$3$Type',1812);bcb(1813,1,{},fOc);_.Ge=function gOc(a){return BD(a,129).d};var BZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$4$Type',1813);bcb(1814,1,{},hOc);_.Ge=function iOc(a){return BD(a,129).d};var CZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$5$Type',1814);bcb(112,1,{35:1,112:1},uOc);_.wd=function vOc(a){return kOc(this,BD(a,112))};_.Fb=function wOc(a){var b;if(JD(a,112)){b=BD(a,112);return this.g==b.g}return false};_.Hb=function xOc(){return this.g};_.Ib=function zOc(){var a,b,c,d;a=new Wfb('{');d=new olb(this.n);while(d.a'+this.b+' ('+Yr(this.c)+')'};_.d=0;var EZ=mdb(Mqe,'HyperEdgeSegmentDependency',129);bcb(520,22,{3:1,35:1,22:1,520:1},IOc);var FOc,GOc;var DZ=ndb(Mqe,'HyperEdgeSegmentDependency/DependencyType',520,CI,KOc,JOc);var LOc;bcb(1815,1,{},ZOc);var MZ=mdb(Mqe,'HyperEdgeSegmentSplitter',1815);bcb(1816,1,{},aPc);_.a=0;_.b=0;var FZ=mdb(Mqe,'HyperEdgeSegmentSplitter/AreaRating',1816);bcb(329,1,{329:1},bPc);_.a=0;_.b=0;_.c=0;var GZ=mdb(Mqe,'HyperEdgeSegmentSplitter/FreeArea',329);bcb(1817,1,Dke,cPc);_.ue=function dPc(a,b){return _Oc(BD(a,112),BD(b,112))};_.Fb=function ePc(a){return this===a};_.ve=function fPc(){return new tpb(this)};var HZ=mdb(Mqe,'HyperEdgeSegmentSplitter/lambda$0$Type',1817);bcb(1818,1,qie,gPc);_.td=function hPc(a){TOc(this.a,this.d,this.c,this.b,BD(a,112))};_.b=0;var IZ=mdb(Mqe,'HyperEdgeSegmentSplitter/lambda$1$Type',1818);bcb(1819,1,{},iPc);_.Kb=function jPc(a){return new YAb(null,new Kub(BD(a,112).e,16))};var JZ=mdb(Mqe,'HyperEdgeSegmentSplitter/lambda$2$Type',1819);bcb(1820,1,{},kPc);_.Kb=function lPc(a){return new YAb(null,new Kub(BD(a,112).j,16))};var KZ=mdb(Mqe,'HyperEdgeSegmentSplitter/lambda$3$Type',1820);bcb(1821,1,{},mPc);_.Fe=function nPc(a){return Edb(ED(a))};var LZ=mdb(Mqe,'HyperEdgeSegmentSplitter/lambda$4$Type',1821);bcb(655,1,{},tPc);_.a=0;_.b=0;_.c=0;var QZ=mdb(Mqe,'OrthogonalRoutingGenerator',655);bcb(1638,1,{},xPc);_.Kb=function yPc(a){return new YAb(null,new Kub(BD(a,112).e,16))};var OZ=mdb(Mqe,'OrthogonalRoutingGenerator/lambda$0$Type',1638);bcb(1639,1,{},zPc);_.Kb=function APc(a){return new YAb(null,new Kub(BD(a,112).j,16))};var PZ=mdb(Mqe,'OrthogonalRoutingGenerator/lambda$1$Type',1639);bcb(661,1,{});var RZ=mdb(Nqe,'BaseRoutingDirectionStrategy',661);bcb(1807,661,{},EPc);_.dg=function FPc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p;if(!!a.r&&!a.q){return}k=b+a.o*c;for(j=new olb(a.n);j.aqme){f=k;e=a;d=new f7c(l,f);Dsb(g.a,d);BPc(this,g,e,d,false);m=a.r;if(m){n=Edb(ED(Ut(m.e,0)));d=new f7c(n,f);Dsb(g.a,d);BPc(this,g,e,d,false);f=b+m.o*c;e=m;d=new f7c(n,f);Dsb(g.a,d);BPc(this,g,e,d,false)}d=new f7c(p,f);Dsb(g.a,d);BPc(this,g,e,d,false)}}}}};_.eg=function GPc(a){return a.i.n.a+a.n.a+a.a.a};_.fg=function HPc(){return Ucd(),Rcd};_.gg=function IPc(){return Ucd(),Acd};var SZ=mdb(Nqe,'NorthToSouthRoutingStrategy',1807);bcb(1808,661,{},JPc);_.dg=function KPc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p;if(!!a.r&&!a.q){return}k=b-a.o*c;for(j=new olb(a.n);j.aqme){f=k;e=a;d=new f7c(l,f);Dsb(g.a,d);BPc(this,g,e,d,false);m=a.r;if(m){n=Edb(ED(Ut(m.e,0)));d=new f7c(n,f);Dsb(g.a,d);BPc(this,g,e,d,false);f=b-m.o*c;e=m;d=new f7c(n,f);Dsb(g.a,d);BPc(this,g,e,d,false)}d=new f7c(p,f);Dsb(g.a,d);BPc(this,g,e,d,false)}}}}};_.eg=function LPc(a){return a.i.n.a+a.n.a+a.a.a};_.fg=function MPc(){return Ucd(),Acd};_.gg=function NPc(){return Ucd(),Rcd};var TZ=mdb(Nqe,'SouthToNorthRoutingStrategy',1808);bcb(1806,661,{},OPc);_.dg=function PPc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p;if(!!a.r&&!a.q){return}k=b+a.o*c;for(j=new olb(a.n);j.aqme){f=k;e=a;d=new f7c(f,l);Dsb(g.a,d);BPc(this,g,e,d,true);m=a.r;if(m){n=Edb(ED(Ut(m.e,0)));d=new f7c(f,n);Dsb(g.a,d);BPc(this,g,e,d,true);f=b+m.o*c;e=m;d=new f7c(f,n);Dsb(g.a,d);BPc(this,g,e,d,true)}d=new f7c(f,p);Dsb(g.a,d);BPc(this,g,e,d,true)}}}}};_.eg=function QPc(a){return a.i.n.b+a.n.b+a.a.b};_.fg=function RPc(){return Ucd(),zcd};_.gg=function SPc(){return Ucd(),Tcd};var UZ=mdb(Nqe,'WestToEastRoutingStrategy',1806);bcb(813,1,{},YPc);_.Ib=function ZPc(){return Fe(this.a)};_.b=0;_.c=false;_.d=false;_.f=0;var WZ=mdb(Pqe,'NubSpline',813);bcb(407,1,{407:1},aQc,bQc);var VZ=mdb(Pqe,'NubSpline/PolarCP',407);bcb(1453,1,Bqe,vQc);_.Yf=function xQc(a){return qQc(BD(a,37))};_.pf=function yQc(a,b){uQc(this,BD(a,37),b)};var cQc,dQc,eQc,fQc,gQc;var b$=mdb(Pqe,'SplineEdgeRouter',1453);bcb(268,1,{268:1},BQc);_.Ib=function CQc(){return this.a+' ->('+this.c+') '+this.b};_.c=0;var XZ=mdb(Pqe,'SplineEdgeRouter/Dependency',268);bcb(455,22,{3:1,35:1,22:1,455:1},GQc);var DQc,EQc;var YZ=ndb(Pqe,'SplineEdgeRouter/SideToProcess',455,CI,IQc,HQc);var JQc;bcb(1454,1,Oie,LQc);_.Mb=function MQc(a){return hQc(),!BD(a,128).o};var ZZ=mdb(Pqe,'SplineEdgeRouter/lambda$0$Type',1454);bcb(1455,1,{},NQc);_.Ge=function OQc(a){return hQc(),BD(a,128).v+1};var $Z=mdb(Pqe,'SplineEdgeRouter/lambda$1$Type',1455);bcb(1456,1,qie,PQc);_.td=function QQc(a){sQc(this.a,this.b,BD(a,46))};var _Z=mdb(Pqe,'SplineEdgeRouter/lambda$2$Type',1456);bcb(1457,1,qie,RQc);_.td=function SQc(a){tQc(this.a,this.b,BD(a,46))};var a$=mdb(Pqe,'SplineEdgeRouter/lambda$3$Type',1457);bcb(128,1,{35:1,128:1},YQc,ZQc);_.wd=function $Qc(a){return WQc(this,BD(a,128))};_.b=0;_.e=false;_.f=0;_.g=0;_.j=false;_.k=false;_.n=0;_.o=false;_.p=false;_.q=false;_.s=0;_.u=0;_.v=0;_.F=0;var d$=mdb(Pqe,'SplineSegment',128);bcb(459,1,{459:1},_Qc);_.a=0;_.b=false;_.c=false;_.d=false;_.e=false;_.f=0;var c$=mdb(Pqe,'SplineSegment/EdgeInformation',459);bcb(1234,1,{},hRc);var f$=mdb(Uqe,hme,1234);bcb(1235,1,Dke,jRc);_.ue=function kRc(a,b){return iRc(BD(a,135),BD(b,135))};_.Fb=function lRc(a){return this===a};_.ve=function mRc(){return new tpb(this)};var e$=mdb(Uqe,ime,1235);bcb(1233,1,{},tRc);var g$=mdb(Uqe,'MrTree',1233);bcb(393,22,{3:1,35:1,22:1,393:1,246:1,234:1},ARc);_.Kf=function CRc(){return zRc(this)};_.Xf=function BRc(){return zRc(this)};var uRc,vRc,wRc,xRc;var h$=ndb(Uqe,'TreeLayoutPhases',393,CI,ERc,DRc);var FRc;bcb(1130,209,Mle,HRc);_.Ze=function IRc(a,b){var c,d,e,f,g,h,i;Ccb(DD(hkd(a,(JTc(),ATc))))||$Cb((c=new _Cb((Pgd(),new bhd(a))),c));g=(h=new SRc,tNb(h,a),yNb(h,(mTc(),dTc),a),i=new Lqb,pRc(a,h,i),oRc(a,h,i),h);f=gRc(this.a,g);for(e=new olb(f);e.a'+WRc(this.c):'e_'+tb(this)};var l$=mdb(Vqe,'TEdge',188);bcb(135,134,{3:1,135:1,94:1,134:1},SRc);_.Ib=function TRc(){var a,b,c,d,e;e=null;for(d=Jsb(this.b,0);d.b!=d.d.c;){c=BD(Xsb(d),86);e+=(c.c==null||c.c.length==0?'n_'+c.g:'n_'+c.c)+'\n'}for(b=Jsb(this.a,0);b.b!=b.d.c;){a=BD(Xsb(b),188);e+=(!!a.b&&!!a.c?WRc(a.b)+'->'+WRc(a.c):'e_'+tb(a))+'\n'}return e};var n$=mdb(Vqe,'TGraph',135);bcb(633,502,{3:1,502:1,633:1,94:1,134:1});var r$=mdb(Vqe,'TShape',633);bcb(86,633,{3:1,502:1,86:1,633:1,94:1,134:1},XRc);_.Ib=function YRc(){return WRc(this)};var q$=mdb(Vqe,'TNode',86);bcb(255,1,vie,ZRc);_.Jc=function $Rc(a){reb(this,a)};_.Kc=function _Rc(){var a;return a=Jsb(this.a.d,0),new aSc(a)};var p$=mdb(Vqe,'TNode/2',255);bcb(358,1,aie,aSc);_.Nb=function bSc(a){Rrb(this,a)};_.Pb=function dSc(){return BD(Xsb(this.a),188).c};_.Ob=function cSc(){return Wsb(this.a)};_.Qb=function eSc(){Zsb(this.a)};var o$=mdb(Vqe,'TNode/2/1',358);bcb(1840,1,ene,hSc);_.pf=function jSc(a,b){gSc(this,BD(a,135),b)};var s$=mdb(Wqe,'FanProcessor',1840);bcb(327,22,{3:1,35:1,22:1,327:1,234:1},rSc);_.Kf=function sSc(){switch(this.g){case 0:return new QSc;case 1:return new hSc;case 2:return new GSc;case 3:return new zSc;case 4:return new NSc;case 5:return new TSc;default:throw vbb(new Wdb(Dne+(this.f!=null?this.f:''+this.g)));}};var kSc,lSc,mSc,nSc,oSc,pSc;var t$=ndb(Wqe,Ene,327,CI,uSc,tSc);var vSc;bcb(1843,1,ene,zSc);_.pf=function ASc(a,b){xSc(this,BD(a,135),b)};_.a=0;var v$=mdb(Wqe,'LevelHeightProcessor',1843);bcb(1844,1,vie,BSc);_.Jc=function CSc(a){reb(this,a)};_.Kc=function DSc(){return mmb(),Emb(),Dmb};var u$=mdb(Wqe,'LevelHeightProcessor/1',1844);bcb(1841,1,ene,GSc);_.pf=function HSc(a,b){ESc(this,BD(a,135),b)};_.a=0;var x$=mdb(Wqe,'NeighborsProcessor',1841);bcb(1842,1,vie,ISc);_.Jc=function JSc(a){reb(this,a)};_.Kc=function KSc(){return mmb(),Emb(),Dmb};var w$=mdb(Wqe,'NeighborsProcessor/1',1842);bcb(1845,1,ene,NSc);_.pf=function OSc(a,b){LSc(this,BD(a,135),b)};_.a=0;var y$=mdb(Wqe,'NodePositionProcessor',1845);bcb(1839,1,ene,QSc);_.pf=function RSc(a,b){PSc(this,BD(a,135))};var z$=mdb(Wqe,'RootProcessor',1839);bcb(1846,1,ene,TSc);_.pf=function USc(a,b){SSc(BD(a,135))};var A$=mdb(Wqe,'Untreeifyer',1846);var VSc,WSc,XSc,YSc,ZSc,$Sc,_Sc,aTc,bTc,cTc,dTc,eTc,fTc,gTc,hTc,iTc,jTc,kTc,lTc;bcb(851,1,ale,sTc);_.Qe=function tTc(a){t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Zqe),''),'Weighting of Nodes'),'Which weighting to use when computing a node order.'),qTc),(_5c(),V5c)),E$),pqb((N5c(),L5c)))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,$qe),''),'Search Order'),'Which search order to use when computing a spanning tree.'),oTc),V5c),F$),pqb(L5c))));KTc((new LTc,a))};var nTc,oTc,pTc,qTc;var B$=mdb(_qe,'MrTreeMetaDataProvider',851);bcb(994,1,ale,LTc);_.Qe=function MTc(a){KTc(a)};var uTc,vTc,wTc,xTc,yTc,zTc,ATc,BTc,CTc,DTc,ETc,FTc,GTc,HTc,ITc;var D$=mdb(_qe,'MrTreeOptions',994);bcb(995,1,{},NTc);_.$e=function OTc(){var a;return a=new HRc,a};_._e=function PTc(a){};var C$=mdb(_qe,'MrTreeOptions/MrtreeFactory',995);bcb(480,22,{3:1,35:1,22:1,480:1},TTc);var QTc,RTc;var E$=ndb(_qe,'OrderWeighting',480,CI,VTc,UTc);var WTc;bcb(425,22,{3:1,35:1,22:1,425:1},_Tc);var YTc,ZTc;var F$=ndb(_qe,'TreeifyingOrder',425,CI,bUc,aUc);var cUc;bcb(1459,1,Bqe,lUc);_.Yf=function mUc(a){return BD(a,135),eUc};_.pf=function nUc(a,b){kUc(this,BD(a,135),b)};var eUc;var G$=mdb('org.eclipse.elk.alg.mrtree.p1treeify','DFSTreeifyer',1459);bcb(1460,1,Bqe,sUc);_.Yf=function tUc(a){return BD(a,135),oUc};_.pf=function uUc(a,b){rUc(this,BD(a,135),b)};var oUc;var H$=mdb('org.eclipse.elk.alg.mrtree.p2order','NodeOrderer',1460);bcb(1461,1,Bqe,CUc);_.Yf=function DUc(a){return BD(a,135),vUc};_.pf=function EUc(a,b){AUc(this,BD(a,135),b)};_.a=0;var vUc;var I$=mdb('org.eclipse.elk.alg.mrtree.p3place','NodePlacer',1461);bcb(1462,1,Bqe,IUc);_.Yf=function JUc(a){return BD(a,135),FUc};_.pf=function KUc(a,b){HUc(BD(a,135),b)};var FUc;var J$=mdb('org.eclipse.elk.alg.mrtree.p4route','EdgeRouter',1462);var LUc;bcb(495,22,{3:1,35:1,22:1,495:1,246:1,234:1},RUc);_.Kf=function TUc(){return QUc(this)};_.Xf=function SUc(){return QUc(this)};var NUc,OUc;var K$=ndb(cre,'RadialLayoutPhases',495,CI,VUc,UUc);var WUc;bcb(1131,209,Mle,ZUc);_.Ze=function $Uc(a,b){var c,d,e,f,g,h;c=YUc(this,a);Odd(b,'Radial layout',c.c.length);Ccb(DD(hkd(a,(ZWc(),QWc))))||$Cb((d=new _Cb((Pgd(),new bhd(a))),d));h=aVc(a);jkd(a,(MUc(),LUc),h);if(!h){throw vbb(new Wdb('The given graph is not a tree!'))}e=Edb(ED(hkd(a,VWc)));e==0&&(e=_Uc(a));jkd(a,VWc,e);for(g=new olb(YUc(this,a));g.a0&&j7c((BCb(c-1,b.length),b.charCodeAt(c-1)),nne)){--c}if(e>=c){throw vbb(new Wdb('The given string does not contain any numbers.'))}f=mfb(b.substr(e,c-e),',|;|\r|\n');if(f.length!=2){throw vbb(new Wdb('Exactly two numbers are expected, '+f.length+' were found.'))}try{this.a=Hcb(ufb(f[0]));this.b=Hcb(ufb(f[1]))}catch(a){a=ubb(a);if(JD(a,127)){d=a;throw vbb(new Wdb(one+d))}else throw vbb(a)}};_.Ib=function m7c(){return '('+this.a+','+this.b+')'};_.a=0;_.b=0;var m1=mdb(pne,'KVector',8);bcb(74,68,{3:1,4:1,20:1,28:1,52:1,14:1,68:1,15:1,74:1,414:1},s7c,t7c,u7c);_.Pc=function x7c(){return r7c(this)};_.Jf=function v7c(b){var c,d,e,f,g,h;e=mfb(b,',|;|\\(|\\)|\\[|\\]|\\{|\\}| |\t|\n');Osb(this);try{d=0;g=0;f=0;h=0;while(d0){g%2==0?(f=Hcb(e[d])):(h=Hcb(e[d]));g>0&&g%2!=0&&Dsb(this,new f7c(f,h));++g}++d}}catch(a){a=ubb(a);if(JD(a,127)){c=a;throw vbb(new Wdb('The given string does not match the expected format for vectors.'+c))}else throw vbb(a)}};_.Ib=function y7c(){var a,b,c;a=new Wfb('(');b=Jsb(this,0);while(b.b!=b.d.c){c=BD(Xsb(b),8);Qfb(a,c.a+','+c.b);b.b!=b.d.c&&(a.a+='; ',a)}return (a.a+=')',a).a};var l1=mdb(pne,'KVectorChain',74);bcb(248,22,{3:1,35:1,22:1,248:1},G7c);var z7c,A7c,B7c,C7c,D7c,E7c;var o1=ndb(ose,'Alignment',248,CI,I7c,H7c);var J7c;bcb(979,1,ale,Z7c);_.Qe=function $7c(a){Y7c(a)};var L7c,M7c,N7c,O7c,P7c,Q7c,R7c,S7c,T7c,U7c,V7c,W7c;var q1=mdb(ose,'BoxLayouterOptions',979);bcb(980,1,{},_7c);_.$e=function a8c(){var a;return a=new ged,a};_._e=function b8c(a){};var p1=mdb(ose,'BoxLayouterOptions/BoxFactory',980);bcb(291,22,{3:1,35:1,22:1,291:1},j8c);var c8c,d8c,e8c,f8c,g8c,h8c;var r1=ndb(ose,'ContentAlignment',291,CI,l8c,k8c);var m8c;bcb(684,1,ale,Z9c);_.Qe=function $9c(a){t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,sse),''),'Layout Algorithm'),'Select a specific layout algorithm.'),(_5c(),Z5c)),ZI),pqb((N5c(),L5c)))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,tse),''),'Resolved Layout Algorithm'),'Meta data associated with the selected algorithm.'),Y5c),E0),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,$pe),''),'Alignment'),'Alignment of the selected node relative to other nodes; the exact meaning depends on the used algorithm.'),q8c),V5c),o1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,_le),''),'Aspect Ratio'),'The desired aspect ratio of the drawing, that is the quotient of width by height.'),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,use),''),'Bend Points'),"A fixed list of bend points for the edge. This is used by the 'Fixed Layout' algorithm to specify a pre-defined routing for an edge. The vector chain must include the source point, any bend points, and the target point, so it must have at least two points."),Y5c),l1),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,lqe),''),'Content Alignment'),'Specifies how the content of a node are aligned. Each node can individually control the alignment of its contents. I.e. if a node should be aligned top left in its parent node, the parent node should specify that option.'),x8c),W5c),r1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Zpe),''),'Debug Mode'),'Whether additional debug information shall be generated.'),(Bcb(),false)),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,cqe),''),Cle),'Overall direction of edges: horizontal (right / left) or vertical (down / up).'),A8c),V5c),t1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ype),''),'Edge Routing'),'What kind of edge routing style should be applied for the content of a parent node. Algorithms may also set this option to single edges in order to mark them as splines. The bend point list of edges with this option set to SPLINES must be interpreted as control points for a piecewise cubic spline.'),F8c),V5c),v1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Jre),''),'Expand Nodes'),'If active, nodes are expanded to fill the area of their parent.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,tpe),''),'Hierarchy Handling'),"Determines whether separate layout runs are triggered for different compound nodes in a hierarchical graph. Setting a node's hierarchy handling to `INCLUDE_CHILDREN` will lay out that node and all of its descendants in a single layout run, until a descendant is encountered which has its hierarchy handling set to `SEPARATE_CHILDREN`. In general, `SEPARATE_CHILDREN` will ensure that a new layout run is triggered for a node with that setting. Including multiple levels of hierarchy in a single layout run may allow cross-hierarchical edges to be laid out properly. If the root node is set to `INHERIT` (or not set at all), the default behavior is `SEPARATE_CHILDREN`."),K8c),V5c),z1),qqb(L5c,OC(GC(e1,1),Kie,175,0,[K5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ame),''),'Padding'),"The padding to be left to a parent element's border when placing child elements. This can also serve as an output option of a layout algorithm if node size calculation is setup appropriately."),g9c),Y5c),j1),qqb(L5c,OC(GC(e1,1),Kie,175,0,[K5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ame),''),'Interactive'),'Whether the algorithm should be run in interactive mode for the content of a parent node. What this means exactly depends on how the specific algorithm interprets this option. Usually in the interactive mode algorithms try to modify the current layout as little as possible.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,xqe),''),'interactive Layout'),'Whether the graph should be changeable interactively and by setting constraints'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Dme),''),'Omit Node Micro Layout'),"Node micro layout comprises the computation of node dimensions (if requested), the placement of ports and their labels, and the placement of node labels. The functionality is implemented independent of any specific layout algorithm and shouldn't have any negative impact on the layout algorithm's performance itself. Yet, if any unforeseen behavior occurs, this option allows to deactivate the micro layout."),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Bme),''),'Port Constraints'),'Defines constraints of the position of the ports of a node.'),u9c),V5c),D1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,uqe),''),'Position'),"The position of a node, port, or label. This is used by the 'Fixed Layout' algorithm to specify a pre-defined position."),Y5c),m1),qqb(K5c,OC(GC(e1,1),Kie,175,0,[M5c,J5c])))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,vme),''),'Priority'),'Defines the priority of an object; its meaning depends on the specific layout algorithm and the context where it is used.'),X5c),JI),qqb(K5c,OC(GC(e1,1),Kie,175,0,[I5c])))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,yme),''),'Randomization Seed'),'Seed used for pseudo-random number generators to control the layout algorithm. If the value is 0, the seed shall be determined pseudo-randomly (e.g. from the system time).'),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,zme),''),'Separate Connected Components'),'Whether each connected component should be processed separately.'),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,mqe),''),'Junction Points'),'This option is not used as option, but as output of the layout algorithms. It is attached to edges and determines the points where junction symbols should be drawn in order to represent hyperedges with orthogonal routing. Whether such points are computed depends on the chosen layout algorithm and edge routing style. The points are put into the vector chain with no specific order.'),R8c),Y5c),l1),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,pqe),''),'Comment Box'),'Whether the node should be regarded as a comment box instead of a regular node. In that case its placement should be similar to how labels are handled. Any edges incident to a comment box specify to which graph elements the comment is related.'),false),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,qqe),''),'Hypernode'),'Whether the node should be handled as a hypernode.'),false),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,vse),''),'Label Manager'),"Label managers can shorten labels upon a layout algorithm's request."),Y5c),h1),qqb(L5c,OC(GC(e1,1),Kie,175,0,[J5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,vqe),''),'Margins'),"Margins define additional space around the actual bounds of a graph element. For instance, ports or labels being placed on the outside of a node's border might introduce such a margin. The margin is used to guarantee non-overlap of other graph elements with those ports or labels."),T8c),Y5c),i1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Xpe),''),'No Layout'),"No layout is done for the associated element. This is used to mark parts of a diagram to avoid their inclusion in the layout graph, or to mark parts of the layout graph to prevent layout engines from processing them. If you wish to exclude the contents of a compound node from automatic layout, while the node itself is still considered on its own layer, use the 'Fixed Layout' algorithm for that node."),false),T5c),wI),qqb(K5c,OC(GC(e1,1),Kie,175,0,[I5c,M5c,J5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,wse),''),'Scale Factor'),"The scaling factor to be applied to the corresponding node in recursive layout. It causes the corresponding node's size to be adjusted, and its ports and labels to be sized and placed accordingly after the layout of that node has been determined (and before the node itself and its siblings are arranged). The scaling is not reverted afterwards, so the resulting layout graph contains the adjusted size and position data. This option is currently not supported if 'Layout Hierarchy' is set."),1),U5c),BI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,xse),''),'Animate'),'Whether the shift from the old layout to the new computed layout shall be animated.'),true),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,yse),''),'Animation Time Factor'),"Factor for computation of animation time. The higher the value, the longer the animation time. If the value is 0, the resulting time is always equal to the minimum defined by 'Minimal Animation Time'."),meb(100)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,zse),''),'Layout Ancestors'),'Whether the hierarchy levels on the path from the selected element to the root of the diagram shall be included in the layout process.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ase),''),'Maximal Animation Time'),'The maximal time for animations, in milliseconds.'),meb(4000)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Bse),''),'Minimal Animation Time'),'The minimal time for animations, in milliseconds.'),meb(400)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Cse),''),'Progress Bar'),'Whether a progress bar shall be displayed during layout computations.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Dse),''),'Validate Graph'),'Whether the graph shall be validated before any layout algorithm is applied. If this option is enabled and at least one error is found, the layout process is aborted and a message is shown to the user.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ese),''),'Validate Options'),'Whether layout options shall be validated before any layout algorithm is applied. If this option is enabled and at least one error is found, the layout process is aborted and a message is shown to the user.'),true),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Fse),''),'Zoom to Fit'),'Whether the zoom level shall be set to view the whole diagram after layout.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,rse),'box'),'Box Layout Mode'),'Configures the packing mode used by the {@link BoxLayoutProvider}. If SIMPLE is not required (neither priorities are used nor the interactive mode), GROUP_DEC can improve the packing and decrease the area. GROUP_MIXED and GROUP_INC may, in very specific scenarios, work better.'),u8c),V5c),O1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Lpe),zpe),'Comment Comment Spacing'),'Spacing to be preserved between a comment box and other comment boxes connected to the same node. The space left between comment boxes of different nodes is controlled by the node-node spacing.'),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Mpe),zpe),'Comment Node Spacing'),'Spacing to be preserved between a node and its connected comment boxes. The space left between a node and the comments of another node is controlled by the node-node spacing.'),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Zle),zpe),'Components Spacing'),"Spacing to be preserved between pairs of connected components. This option is only relevant if 'separateConnectedComponents' is activated."),20),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Npe),zpe),'Edge Spacing'),'Spacing to be preserved between any two edges. Note that while this can somewhat easily be satisfied for the segments of orthogonally drawn edges, it is harder for general polylines or splines.'),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,xme),zpe),'Edge Label Spacing'),"The minimal distance to be preserved between a label and the edge it is associated with. Note that the placement of a label is influenced by the 'edgelabels.placement' option."),2),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ope),zpe),'Edge Node Spacing'),'Spacing to be preserved between nodes and edges.'),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ppe),zpe),'Label Spacing'),'Determines the amount of space to be left between two labels of the same graph element.'),0),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Spe),zpe),'Label Node Spacing'),"Spacing to be preserved between labels and the border of node they are associated with. Note that the placement of a label is influenced by the 'nodelabels.placement' option."),5),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Qpe),zpe),'Horizontal spacing between Label and Port'),"Horizontal spacing to be preserved between labels and the ports they are associated with. Note that the placement of a label is influenced by the 'portlabels.placement' option."),1),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Rpe),zpe),'Vertical spacing between Label and Port'),"Vertical spacing to be preserved between labels and the ports they are associated with. Note that the placement of a label is influenced by the 'portlabels.placement' option."),1),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,wme),zpe),'Node Spacing'),'The minimal distance to be preserved between each two nodes.'),20),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Tpe),zpe),'Node Self Loop Spacing'),'Spacing to be preserved between a node and its self loops.'),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Upe),zpe),'Port Spacing'),'Spacing between pairs of ports of the same node.'),10),U5c),BI),qqb(L5c,OC(GC(e1,1),Kie,175,0,[K5c])))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Vpe),zpe),'Individual Spacing'),"Allows to specify individual spacing values for graph elements that shall be different from the value specified for the element's parent."),Y5c),i2),qqb(K5c,OC(GC(e1,1),Kie,175,0,[I5c,M5c,J5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,wqe),zpe),'Additional Port Space'),'Additional space around the sets of ports on each node side. For each side of a node, this option can reserve additional space before and after the ports on each side. For example, a top spacing of 20 makes sure that the first port on the western and eastern side is 20 units away from the northern border.'),W9c),Y5c),i1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,tqe),Jse),'Layout Partition'),'Partition to which the node belongs. This requires Layout Partitioning to be active. Nodes with lower partition IDs will appear to the left of nodes with higher partition IDs (assuming a left-to-right layout direction).'),X5c),JI),qqb(L5c,OC(GC(e1,1),Kie,175,0,[K5c])))));o4c(a,tqe,sqe,k9c);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,sqe),Jse),'Layout Partitioning'),'Whether to activate partitioned layout. This will allow to group nodes through the Layout Partition option. a pair of nodes with different partition indices is then placed such that the node with lower index is placed to the left of the other node (with left-to-right layout direction). Depending on the layout algorithm, this may only be guaranteed to work if all nodes have a layout partition configured, or at least if edges that cross partitions are not part of a partition-crossing cycle.'),i9c),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,dqe),Kse),'Node Label Padding'),'Define padding for node labels that are placed inside of a node.'),V8c),Y5c),j1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Gme),Kse),'Node Label Placement'),"Hints for where node labels are to be placed; if empty, the node label's position is not modified."),X8c),W5c),B1),qqb(K5c,OC(GC(e1,1),Kie,175,0,[J5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,gqe),Lse),'Port Alignment'),'Defines the default port distribution for a node. May be overridden for each side individually.'),m9c),V5c),C1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,hqe),Lse),'Port Alignment (North)'),"Defines how ports on the northern side are placed, overriding the node's general port alignment."),V5c),C1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,iqe),Lse),'Port Alignment (South)'),"Defines how ports on the southern side are placed, overriding the node's general port alignment."),V5c),C1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,jqe),Lse),'Port Alignment (West)'),"Defines how ports on the western side are placed, overriding the node's general port alignment."),V5c),C1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,kqe),Lse),'Port Alignment (East)'),"Defines how ports on the eastern side are placed, overriding the node's general port alignment."),V5c),C1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Fme),Mse),'Node Size Constraints'),"What should be taken into account when calculating a node's size. Empty size constraints specify that a node's size is already fixed and should not be changed."),Z8c),W5c),I1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Eme),Mse),'Node Size Options'),'Options modifying the behavior of the size constraints set on a node. Each member of the set specifies something that should be taken into account when calculating node sizes. The empty set corresponds to no further modifications.'),c9c),W5c),J1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Tme),Mse),'Node Size Minimum'),'The minimal size to which a node can be reduced.'),a9c),Y5c),m1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,bqe),Mse),'Fixed Graph Size'),"By default, the fixed layout provider will enlarge a graph until it is large enough to contain its children. If this option is set, it won't do so."),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,nqe),Jpe),'Edge Label Placement'),'Gives a hint on where to put edge labels.'),D8c),V5c),u1),pqb(J5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Cme),Jpe),'Inline Edge Labels'),"If true, an edge label is placed directly on its edge. May only apply to center edge labels. This kind of label placement is only advisable if the label's rendering is such that it is not crossed by its edge and thus stays legible."),false),T5c),wI),pqb(J5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Gse),'font'),'Font Name'),'Font name used for a label.'),Z5c),ZI),pqb(J5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Hse),'font'),'Font Size'),'Font size used for a label.'),X5c),JI),pqb(J5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,rqe),Nse),'Port Anchor Offset'),'The offset to the port position where connections shall be attached.'),Y5c),m1),pqb(M5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,oqe),Nse),'Port Index'),"The index of a port in the fixed order around a node. The order is assumed as clockwise, starting with the leftmost port on the top side. This option must be set if 'Port Constraints' is set to FIXED_ORDER and no specific positions are given for the ports. Additionally, the option 'Port Side' must be defined in this case."),X5c),JI),pqb(M5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ype),Nse),'Port Side'),"The side of a node on which a port is situated. This option must be set if 'Port Constraints' is set to FIXED_SIDE or FIXED_ORDER and no specific positions are given for the ports."),B9c),V5c),F1),pqb(M5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Wpe),Nse),'Port Border Offset'),"The offset of ports on the node border. With a positive offset the port is moved outside of the node, while with a negative offset the port is moved towards the inside. An offset of 0 means that the port is placed directly on the node border, i.e. if the port side is north, the port's south border touches the nodes's north border; if the port side is east, the port's west border touches the nodes's east border; if the port side is south, the port's north border touches the node's south border; if the port side is west, the port's east border touches the node's west border."),U5c),BI),pqb(M5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Hme),Ose),'Port Label Placement'),"Decides on a placement method for port labels; if empty, the node label's position is not modified."),y9c),W5c),E1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,eqe),Ose),'Port Labels Next to Port'),"Use 'portLabels.placement': NEXT_TO_PORT_OF_POSSIBLE."),false),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,fqe),Ose),'Treat Port Labels as Group'),'If this option is true (default), the labels of a port will be treated as a group when it comes to centering them next to their port. If this option is false, only the first label will be centered next to the port, with the others being placed below. This only applies to labels of eastern and western ports and will have no effect if labels are not placed next to their port.'),true),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,_pe),Pse),'Activate Inside Self Loops'),"Whether this node allows to route self loops inside of it instead of around it. If set to true, this will make the node a compound node if it isn't already, and will require the layout algorithm to support compound nodes with hierarchical ports."),false),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,aqe),Pse),'Inside Self Loop'),'Whether a self loop should be routed inside a node instead of around that node.'),false),T5c),wI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,$le),'edge'),'Edge Thickness'),'The thickness of an edge. This is a hint on the line width used to draw an edge, possibly requiring more space to be reserved for it.'),1),U5c),BI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ise),'edge'),'Edge Type'),'The type of an edge. This is usually used for UML class diagrams, where associations must be handled differently from generalizations.'),H8c),V5c),w1),pqb(I5c))));s4c(a,new W3c(b4c(d4c(c4c(new e4c,sne),'Layered'),'The layer-based method was introduced by Sugiyama, Tagawa and Toda in 1981. It emphasizes the direction of edges by pointing as many edges as possible into the same direction. The nodes are arranged in layers, which are sometimes called "hierarchies", and then reordered such that the number of edge crossings is minimized. Afterwards, concrete coordinates are computed for the nodes and edge bend points.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,'org.eclipse.elk.orthogonal'),'Orthogonal'),'Orthogonal methods that follow the "topology-shape-metrics" approach by Batini, Nardelli and Tamassia \'86. The first phase determines the topology of the drawing by applying a planarization technique, which results in a planar representation of the graph. The orthogonal shape is computed in the second phase, which aims at minimizing the number of edge bends, and is called orthogonalization. The third phase leads to concrete coordinates for nodes and edge bend points by applying a compaction method, thus defining the metrics.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,ume),'Force'),'Layout algorithms that follow physical analogies by simulating a system of attractive and repulsive forces. The first successful method of this kind was proposed by Eades in 1984.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,'org.eclipse.elk.circle'),'Circle'),'Circular layout algorithms emphasize cycles or biconnected components of a graph by arranging them in circles. This is useful if a drawing is desired where such components are clearly grouped, or where cycles are shown as prominent OPTIONS of the graph.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,bre),'Tree'),'Specialized layout methods for trees, i.e. acyclic graphs. The regular structure of graphs that have no undirected cycles can be emphasized using an algorithm of this type.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,'org.eclipse.elk.planar'),'Planar'),'Algorithms that require a planar or upward planar graph. Most of these algorithms are theoretically interesting, but not practically usable.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,sre),'Radial'),'Radial layout algorithms usually position the nodes of the graph on concentric circles.')));$ad((new _ad,a));Y7c((new Z7c,a));jdd((new kdd,a))};var o8c,p8c,q8c,r8c,s8c,t8c,u8c,v8c,w8c,x8c,y8c,z8c,A8c,B8c,C8c,D8c,E8c,F8c,G8c,H8c,I8c,J8c,K8c,L8c,M8c,N8c,O8c,P8c,Q8c,R8c,S8c,T8c,U8c,V8c,W8c,X8c,Y8c,Z8c,$8c,_8c,a9c,b9c,c9c,d9c,e9c,f9c,g9c,h9c,i9c,j9c,k9c,l9c,m9c,n9c,o9c,p9c,q9c,r9c,s9c,t9c,u9c,v9c,w9c,x9c,y9c,z9c,A9c,B9c,C9c,D9c,E9c,F9c,G9c,H9c,I9c,J9c,K9c,L9c,M9c,N9c,O9c,P9c,Q9c,R9c,S9c,T9c,U9c,V9c,W9c,X9c;var s1=mdb(ose,'CoreOptions',684);bcb(103,22,{3:1,35:1,22:1,103:1},iad);var _9c,aad,bad,cad,dad;var t1=ndb(ose,Cle,103,CI,kad,jad);var lad;bcb(272,22,{3:1,35:1,22:1,272:1},rad);var nad,oad,pad;var u1=ndb(ose,'EdgeLabelPlacement',272,CI,tad,sad);var uad;bcb(218,22,{3:1,35:1,22:1,218:1},Bad);var wad,xad,yad,zad;var v1=ndb(ose,'EdgeRouting',218,CI,Dad,Cad);var Ead;bcb(312,22,{3:1,35:1,22:1,312:1},Nad);var Gad,Had,Iad,Jad,Kad,Lad;var w1=ndb(ose,'EdgeType',312,CI,Pad,Oad);var Qad;bcb(977,1,ale,_ad);_.Qe=function abd(a){$ad(a)};var Sad,Tad,Uad,Vad,Wad,Xad,Yad;var y1=mdb(ose,'FixedLayouterOptions',977);bcb(978,1,{},bbd);_.$e=function cbd(){var a;return a=new Zfd,a};_._e=function dbd(a){};var x1=mdb(ose,'FixedLayouterOptions/FixedFactory',978);bcb(334,22,{3:1,35:1,22:1,334:1},ibd);var ebd,fbd,gbd;var z1=ndb(ose,'HierarchyHandling',334,CI,kbd,jbd);var lbd;bcb(285,22,{3:1,35:1,22:1,285:1},tbd);var nbd,obd,pbd,qbd;var A1=ndb(ose,'LabelSide',285,CI,vbd,ubd);var wbd;bcb(93,22,{3:1,35:1,22:1,93:1},Ibd);var ybd,zbd,Abd,Bbd,Cbd,Dbd,Ebd,Fbd,Gbd;var B1=ndb(ose,'NodeLabelPlacement',93,CI,Lbd,Kbd);var Mbd;bcb(249,22,{3:1,35:1,22:1,249:1},Ubd);var Obd,Pbd,Qbd,Rbd,Sbd;var C1=ndb(ose,'PortAlignment',249,CI,Wbd,Vbd);var Xbd;bcb(98,22,{3:1,35:1,22:1,98:1},gcd);var Zbd,$bd,_bd,acd,bcd,ccd;var D1=ndb(ose,'PortConstraints',98,CI,icd,hcd);var jcd;bcb(273,22,{3:1,35:1,22:1,273:1},scd);var lcd,mcd,ncd,ocd,pcd,qcd;var E1=ndb(ose,'PortLabelPlacement',273,CI,wcd,vcd);var xcd;bcb(61,22,{3:1,35:1,22:1,61:1},Ycd);var zcd,Acd,Bcd,Ccd,Dcd,Ecd,Fcd,Gcd,Hcd,Icd,Jcd,Kcd,Lcd,Mcd,Ncd,Ocd,Pcd,Qcd,Rcd,Scd,Tcd;var F1=ndb(ose,'PortSide',61,CI,_cd,$cd);var bdd;bcb(981,1,ale,kdd);_.Qe=function ldd(a){jdd(a)};var ddd,edd,fdd,gdd,hdd;var H1=mdb(ose,'RandomLayouterOptions',981);bcb(982,1,{},mdd);_.$e=function ndd(){var a;return a=new Mgd,a};_._e=function odd(a){};var G1=mdb(ose,'RandomLayouterOptions/RandomFactory',982);bcb(374,22,{3:1,35:1,22:1,374:1},udd);var pdd,qdd,rdd,sdd;var I1=ndb(ose,'SizeConstraint',374,CI,wdd,vdd);var xdd;bcb(259,22,{3:1,35:1,22:1,259:1},Jdd);var zdd,Add,Bdd,Cdd,Ddd,Edd,Fdd,Gdd,Hdd;var J1=ndb(ose,'SizeOptions',259,CI,Ldd,Kdd);var Mdd;bcb(370,1,{1949:1},Zdd);_.b=false;_.c=0;_.d=-1;_.e=null;_.f=null;_.g=-1;_.j=false;_.k=false;_.n=false;_.o=0;_.q=0;_.r=0;var L1=mdb(yqe,'BasicProgressMonitor',370);bcb(972,209,Mle,ged);_.Ze=function ked(a,b){var c,d,e,f,g,h,i,j,k;Odd(b,'Box layout',2);e=Gdb(ED(hkd(a,(X7c(),W7c))));f=BD(hkd(a,T7c),116);c=Ccb(DD(hkd(a,O7c)));d=Ccb(DD(hkd(a,P7c)));switch(BD(hkd(a,M7c),311).g){case 0:g=(h=new Tkb((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a)),mmb(),Okb(h,new med(d)),h);i=rfd(a);j=ED(hkd(a,L7c));(j==null||(uCb(j),j)<=0)&&(j=1.3);k=ded(g,e,f,i.a,i.b,c,(uCb(j),j));Afd(a,k.a,k.b,false,true);break;default:eed(a,e,f,c);}Qdd(b)};var S1=mdb(yqe,'BoxLayoutProvider',972);bcb(973,1,Dke,med);_.ue=function ned(a,b){return led(this,BD(a,33),BD(b,33))};_.Fb=function oed(a){return this===a};_.ve=function ped(){return new tpb(this)};_.a=false;var M1=mdb(yqe,'BoxLayoutProvider/1',973);bcb(157,1,{157:1},wed,xed);_.Ib=function yed(){return this.c?_od(this.c):Fe(this.b)};var N1=mdb(yqe,'BoxLayoutProvider/Group',157);bcb(311,22,{3:1,35:1,22:1,311:1},Eed);var zed,Aed,Bed,Ced;var O1=ndb(yqe,'BoxLayoutProvider/PackingMode',311,CI,Ged,Fed);var Hed;bcb(974,1,Dke,Jed);_.ue=function Ked(a,b){return hed(BD(a,157),BD(b,157))};_.Fb=function Led(a){return this===a};_.ve=function Med(){return new tpb(this)};var P1=mdb(yqe,'BoxLayoutProvider/lambda$0$Type',974);bcb(975,1,Dke,Ned);_.ue=function Oed(a,b){return ied(BD(a,157),BD(b,157))};_.Fb=function Ped(a){return this===a};_.ve=function Qed(){return new tpb(this)};var Q1=mdb(yqe,'BoxLayoutProvider/lambda$1$Type',975);bcb(976,1,Dke,Red);_.ue=function Sed(a,b){return jed(BD(a,157),BD(b,157))};_.Fb=function Ted(a){return this===a};_.ve=function Ued(){return new tpb(this)};var R1=mdb(yqe,'BoxLayoutProvider/lambda$2$Type',976);bcb(1365,1,{831:1},Ved);_.qg=function Wed(a,b){return Vyc(),!JD(b,160)||h2c((Y1c(),X1c,BD(a,160)),b)};var T1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$0$Type',1365);bcb(1366,1,qie,Xed);_.td=function Yed(a){Yyc(this.a,BD(a,146))};var U1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$1$Type',1366);bcb(1367,1,qie,Zed);_.td=function $ed(a){BD(a,94);Vyc()};var V1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$2$Type',1367);bcb(1371,1,qie,_ed);_.td=function afd(a){Zyc(this.a,BD(a,94))};var W1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$3$Type',1371);bcb(1369,1,Oie,bfd);_.Mb=function cfd(a){return $yc(this.a,this.b,BD(a,146))};var X1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$4$Type',1369);bcb(1368,1,Oie,dfd);_.Mb=function efd(a){return azc(this.a,this.b,BD(a,831))};var Y1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$5$Type',1368);bcb(1370,1,qie,ffd);_.td=function gfd(a){_yc(this.a,this.b,BD(a,146))};var Z1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$6$Type',1370);bcb(935,1,{},Hfd);_.Kb=function Ifd(a){return Gfd(a)};_.Fb=function Jfd(a){return this===a};var _1=mdb(yqe,'ElkUtil/lambda$0$Type',935);bcb(936,1,qie,Kfd);_.td=function Lfd(a){ufd(this.a,this.b,BD(a,79))};_.a=0;_.b=0;var a2=mdb(yqe,'ElkUtil/lambda$1$Type',936);bcb(937,1,qie,Mfd);_.td=function Nfd(a){vfd(this.a,this.b,BD(a,202))};_.a=0;_.b=0;var b2=mdb(yqe,'ElkUtil/lambda$2$Type',937);bcb(938,1,qie,Ofd);_.td=function Pfd(a){wfd(this.a,this.b,BD(a,137))};_.a=0;_.b=0;var c2=mdb(yqe,'ElkUtil/lambda$3$Type',938);bcb(939,1,qie,Qfd);_.td=function Rfd(a){xfd(this.a,BD(a,469))};var d2=mdb(yqe,'ElkUtil/lambda$4$Type',939);bcb(342,1,{35:1,342:1},Tfd);_.wd=function Ufd(a){return Sfd(this,BD(a,236))};_.Fb=function Vfd(a){var b;if(JD(a,342)){b=BD(a,342);return this.a==b.a}return false};_.Hb=function Wfd(){return QD(this.a)};_.Ib=function Xfd(){return this.a+' (exclusive)'};_.a=0;var e2=mdb(yqe,'ExclusiveBounds/ExclusiveLowerBound',342);bcb(1138,209,Mle,Zfd);_.Ze=function $fd(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B;Odd(b,'Fixed Layout',1);f=BD(hkd(a,(Y9c(),E8c)),218);l=0;m=0;for(s=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));s.e!=s.i.gc();){q=BD(Dyd(s),33);B=BD(hkd(q,(Zad(),Yad)),8);if(B){bld(q,B.a,B.b);if(BD(hkd(q,Tad),174).Hc((tdd(),pdd))){n=BD(hkd(q,Vad),8);n.a>0&&n.b>0&&Afd(q,n.a,n.b,true,true)}}l=$wnd.Math.max(l,q.i+q.g);m=$wnd.Math.max(m,q.j+q.f);for(j=new Fyd((!q.n&&(q.n=new cUd(D2,q,1,7)),q.n));j.e!=j.i.gc();){h=BD(Dyd(j),137);B=BD(hkd(h,Yad),8);!!B&&bld(h,B.a,B.b);l=$wnd.Math.max(l,q.i+h.i+h.g);m=$wnd.Math.max(m,q.j+h.j+h.f)}for(v=new Fyd((!q.c&&(q.c=new cUd(F2,q,9,9)),q.c));v.e!=v.i.gc();){u=BD(Dyd(v),118);B=BD(hkd(u,Yad),8);!!B&&bld(u,B.a,B.b);w=q.i+u.i;A=q.j+u.j;l=$wnd.Math.max(l,w+u.g);m=$wnd.Math.max(m,A+u.f);for(i=new Fyd((!u.n&&(u.n=new cUd(D2,u,1,7)),u.n));i.e!=i.i.gc();){h=BD(Dyd(i),137);B=BD(hkd(h,Yad),8);!!B&&bld(h,B.a,B.b);l=$wnd.Math.max(l,w+h.i+h.g);m=$wnd.Math.max(m,A+h.j+h.f)}}for(e=new Sr(ur(_sd(q).a.Kc(),new Sq));Qr(e);){c=BD(Rr(e),79);k=Yfd(c);l=$wnd.Math.max(l,k.a);m=$wnd.Math.max(m,k.b)}for(d=new Sr(ur($sd(q).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),79);if(Xod(jtd(c))!=a){k=Yfd(c);l=$wnd.Math.max(l,k.a);m=$wnd.Math.max(m,k.b)}}}if(f==(Aad(),wad)){for(r=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));r.e!=r.i.gc();){q=BD(Dyd(r),33);for(d=new Sr(ur(_sd(q).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),79);g=pfd(c);g.b==0?jkd(c,Q8c,null):jkd(c,Q8c,g)}}}if(!Ccb(DD(hkd(a,(Zad(),Uad))))){t=BD(hkd(a,Wad),116);p=l+t.b+t.c;o=m+t.d+t.a;Afd(a,p,o,true,true)}Qdd(b)};var f2=mdb(yqe,'FixedLayoutProvider',1138);bcb(373,134,{3:1,414:1,373:1,94:1,134:1},_fd,agd);_.Jf=function dgd(b){var c,d,e,f,g,h,i,j,k;if(!b){return}try{j=mfb(b,';,;');for(g=j,h=0,i=g.length;h>16&aje|b^d<<16};_.Kc=function zgd(){return new Bgd(this)};_.Ib=function Agd(){return this.a==null&&this.b==null?'pair(null,null)':this.a==null?'pair(null,'+fcb(this.b)+')':this.b==null?'pair('+fcb(this.a)+',null)':'pair('+fcb(this.a)+','+fcb(this.b)+')'};var n2=mdb(yqe,'Pair',46);bcb(983,1,aie,Bgd);_.Nb=function Cgd(a){Rrb(this,a)};_.Ob=function Dgd(){return !this.c&&(!this.b&&this.a.a!=null||this.a.b!=null)};_.Pb=function Egd(){if(!this.c&&!this.b&&this.a.a!=null){this.b=true;return this.a.a}else if(!this.c&&this.a.b!=null){this.c=true;return this.a.b}throw vbb(new utb)};_.Qb=function Fgd(){this.c&&this.a.b!=null?(this.a.b=null):this.b&&this.a.a!=null&&(this.a.a=null);throw vbb(new Ydb)};_.b=false;_.c=false;var m2=mdb(yqe,'Pair/1',983);bcb(448,1,{448:1},Ggd);_.Fb=function Hgd(a){return wtb(this.a,BD(a,448).a)&&wtb(this.c,BD(a,448).c)&&wtb(this.d,BD(a,448).d)&&wtb(this.b,BD(a,448).b)};_.Hb=function Igd(){return Hlb(OC(GC(SI,1),Uhe,1,5,[this.a,this.c,this.d,this.b]))};_.Ib=function Jgd(){return '('+this.a+She+this.c+She+this.d+She+this.b+')'};var o2=mdb(yqe,'Quadruple',448);bcb(1126,209,Mle,Mgd);_.Ze=function Ngd(a,b){var c,d,e,f,g;Odd(b,'Random Layout',1);if((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a).i==0){Qdd(b);return}f=BD(hkd(a,(idd(),gdd)),19);!!f&&f.a!=0?(e=new Hub(f.a)):(e=new Gub);c=Gdb(ED(hkd(a,ddd)));g=Gdb(ED(hkd(a,hdd)));d=BD(hkd(a,edd),116);Lgd(a,e,c,g,d);Qdd(b)};var p2=mdb(yqe,'RandomLayoutProvider',1126);var Ogd;bcb(553,1,{});_.qf=function Sgd(){return new f7c(this.f.i,this.f.j)};_.We=function Tgd(a){if(Jsd(a,(Y9c(),s9c))){return hkd(this.f,Qgd)}return hkd(this.f,a)};_.rf=function Ugd(){return new f7c(this.f.g,this.f.f)};_.sf=function Vgd(){return this.g};_.Xe=function Wgd(a){return ikd(this.f,a)};_.tf=function Xgd(a){dld(this.f,a.a);eld(this.f,a.b)};_.uf=function Ygd(a){cld(this.f,a.a);ald(this.f,a.b)};_.vf=function Zgd(a){this.g=a};_.g=0;var Qgd;var q2=mdb(Use,'ElkGraphAdapters/AbstractElkGraphElementAdapter',553);bcb(554,1,{839:1},$gd);_.wf=function _gd(){var a,b;if(!this.b){this.b=Qu(Kkd(this.a).i);for(b=new Fyd(Kkd(this.a));b.e!=b.i.gc();){a=BD(Dyd(b),137);Ekb(this.b,new dhd(a))}}return this.b};_.b=null;var r2=mdb(Use,'ElkGraphAdapters/ElkEdgeAdapter',554);bcb(301,553,{},bhd);_.xf=function chd(){return ahd(this)};_.a=null;var s2=mdb(Use,'ElkGraphAdapters/ElkGraphAdapter',301);bcb(630,553,{181:1},dhd);var t2=mdb(Use,'ElkGraphAdapters/ElkLabelAdapter',630);bcb(629,553,{680:1},hhd);_.wf=function khd(){return ehd(this)};_.Af=function lhd(){var a;return a=BD(hkd(this.f,(Y9c(),S8c)),142),!a&&(a=new H_b),a};_.Cf=function nhd(){return fhd(this)};_.Ef=function phd(a){var b;b=new K_b(a);jkd(this.f,(Y9c(),S8c),b)};_.Ff=function qhd(a){jkd(this.f,(Y9c(),f9c),new r0b(a))};_.yf=function ihd(){return this.d};_.zf=function jhd(){var a,b;if(!this.a){this.a=new Rkb;for(b=new Sr(ur($sd(BD(this.f,33)).a.Kc(),new Sq));Qr(b);){a=BD(Rr(b),79);Ekb(this.a,new $gd(a))}}return this.a};_.Bf=function mhd(){var a,b;if(!this.c){this.c=new Rkb;for(b=new Sr(ur(_sd(BD(this.f,33)).a.Kc(),new Sq));Qr(b);){a=BD(Rr(b),79);Ekb(this.c,new $gd(a))}}return this.c};_.Df=function ohd(){return Vod(BD(this.f,33)).i!=0||Ccb(DD(BD(this.f,33).We((Y9c(),M8c))))};_.Gf=function rhd(){ghd(this,(Pgd(),Ogd))};_.a=null;_.b=null;_.c=null;_.d=null;_.e=null;var u2=mdb(Use,'ElkGraphAdapters/ElkNodeAdapter',629);bcb(1266,553,{838:1},thd);_.wf=function vhd(){return shd(this)};_.zf=function uhd(){var a,b;if(!this.a){this.a=Pu(BD(this.f,118).xg().i);for(b=new Fyd(BD(this.f,118).xg());b.e!=b.i.gc();){a=BD(Dyd(b),79);Ekb(this.a,new $gd(a))}}return this.a};_.Bf=function whd(){var a,b;if(!this.c){this.c=Pu(BD(this.f,118).yg().i);for(b=new Fyd(BD(this.f,118).yg());b.e!=b.i.gc();){a=BD(Dyd(b),79);Ekb(this.c,new $gd(a))}}return this.c};_.Hf=function xhd(){return BD(BD(this.f,118).We((Y9c(),A9c)),61)};_.If=function yhd(){var a,b,c,d,e,f,g,h;d=mpd(BD(this.f,118));for(c=new Fyd(BD(this.f,118).yg());c.e!=c.i.gc();){a=BD(Dyd(c),79);for(h=new Fyd((!a.c&&(a.c=new y5d(z2,a,5,8)),a.c));h.e!=h.i.gc();){g=BD(Dyd(h),82);if(ntd(atd(g),d)){return true}else if(atd(g)==d&&Ccb(DD(hkd(a,(Y9c(),N8c))))){return true}}}for(b=new Fyd(BD(this.f,118).xg());b.e!=b.i.gc();){a=BD(Dyd(b),79);for(f=new Fyd((!a.b&&(a.b=new y5d(z2,a,4,7)),a.b));f.e!=f.i.gc();){e=BD(Dyd(f),82);if(ntd(atd(e),d)){return true}}}return false};_.a=null;_.b=null;_.c=null;var v2=mdb(Use,'ElkGraphAdapters/ElkPortAdapter',1266);bcb(1267,1,Dke,Ahd);_.ue=function Bhd(a,b){return zhd(BD(a,118),BD(b,118))};_.Fb=function Chd(a){return this===a};_.ve=function Dhd(){return new tpb(this)};var w2=mdb(Use,'ElkGraphAdapters/PortComparator',1267);var m5=odb(Vse,'EObject');var x2=odb(Wse,Xse);var y2=odb(Wse,Yse);var C2=odb(Wse,Zse);var G2=odb(Wse,'ElkShape');var z2=odb(Wse,$se);var B2=odb(Wse,_se);var A2=odb(Wse,ate);var k5=odb(Vse,bte);var i5=odb(Vse,'EFactory');var Ehd;var l5=odb(Vse,cte);var o5=odb(Vse,'EPackage');var Ghd;var Ihd,Jhd,Khd,Lhd,Mhd,Nhd,Ohd,Phd,Qhd,Rhd,Shd;var D2=odb(Wse,dte);var E2=odb(Wse,ete);var F2=odb(Wse,fte);bcb(90,1,gte);_.Jg=function Vhd(){this.Kg();return null};_.Kg=function Whd(){return null};_.Lg=function Xhd(){return this.Kg(),false};_.Mg=function Yhd(){return false};_.Ng=function Zhd(a){Uhd(this,a)};var b4=mdb(hte,'BasicNotifierImpl',90);bcb(97,90,pte);_.nh=function fjd(){return oid(this)};_.Og=function Fid(a,b){return a};_.Pg=function Gid(){throw vbb(new bgb)};_.Qg=function Hid(a){var b;return b=zUd(BD(XKd(this.Tg(),this.Vg()),18)),this.eh().ih(this,b.n,b.f,a)};_.Rg=function Iid(a,b){throw vbb(new bgb)};_.Sg=function Jid(a,b,c){return _hd(this,a,b,c)};_.Tg=function Kid(){var a;if(this.Pg()){a=this.Pg().ck();if(a){return a}}return this.zh()};_.Ug=function Lid(){return aid(this)};_.Vg=function Mid(){throw vbb(new bgb)};_.Wg=function Oid(){var a,b;b=this.ph().dk();!b&&this.Pg().ik(b=(nRd(),a=pNd(TKd(this.Tg())),a==null?mRd:new qRd(this,a)));return b};_.Xg=function Qid(a,b){return a};_.Yg=function Rid(a){var b;b=a.Gj();return !b?bLd(this.Tg(),a):a.aj()};_.Zg=function Sid(){var a;a=this.Pg();return !a?null:a.fk()};_.$g=function Tid(){return !this.Pg()?null:this.Pg().ck()};_._g=function Uid(a,b,c){return fid(this,a,b,c)};_.ah=function Vid(a){return gid(this,a)};_.bh=function Wid(a,b){return hid(this,a,b)};_.dh=function Xid(){var a;a=this.Pg();return !!a&&a.gk()};_.eh=function Yid(){throw vbb(new bgb)};_.fh=function Zid(){return jid(this)};_.gh=function $id(a,b,c,d){return kid(this,a,b,d)};_.hh=function _id(a,b,c){var d;return d=BD(XKd(this.Tg(),b),66),d.Nj().Qj(this,this.yh(),b-this.Ah(),a,c)};_.ih=function ajd(a,b,c,d){return lid(this,a,b,d)};_.jh=function bjd(a,b,c){var d;return d=BD(XKd(this.Tg(),b),66),d.Nj().Rj(this,this.yh(),b-this.Ah(),a,c)};_.kh=function cjd(){return !!this.Pg()&&!!this.Pg().ek()};_.lh=function djd(a){return mid(this,a)};_.mh=function ejd(a){return nid(this,a)};_.oh=function gjd(a){return rid(this,a)};_.ph=function hjd(){throw vbb(new bgb)};_.qh=function ijd(){return !this.Pg()?null:this.Pg().ek()};_.rh=function jjd(){return jid(this)};_.sh=function kjd(a,b){yid(this,a,b)};_.th=function ljd(a){this.ph().hk(a)};_.uh=function mjd(a){this.ph().kk(a)};_.vh=function njd(a){this.ph().jk(a)};_.wh=function ojd(a,b){var c,d,e,f;f=this.Zg();if(!!f&&!!a){b=Txd(f.Vk(),this,b);f.Zk(this)}d=this.eh();if(d){if((Nid(this,this.eh(),this.Vg()).Bb&Tje)!=0){e=d.fh();!!e&&(!a?e.Yk(this):!f&&e.Zk(this))}else{b=(c=this.Vg(),c>=0?this.Qg(b):this.eh().ih(this,-1-c,null,b));b=this.Sg(null,-1,b)}}this.uh(a);return b};_.xh=function pjd(a){var b,c,d,e,f,g,h,i;c=this.Tg();f=bLd(c,a);b=this.Ah();if(f>=b){return BD(a,66).Nj().Uj(this,this.yh(),f-b)}else if(f<=-1){g=e1d((O6d(),M6d),c,a);if(g){Q6d();BD(g,66).Oj()||(g=_1d(q1d(M6d,g)));e=(d=this.Yg(g),BD(d>=0?this._g(d,true,true):sid(this,g,true),153));i=g.Zj();if(i>1||i==-1){return BD(BD(e,215).hl(a,false),76)}}else{throw vbb(new Wdb(ite+a.ne()+lte))}}else if(a.$j()){return d=this.Yg(a),BD(d>=0?this._g(d,false,true):sid(this,a,false),76)}h=new nGd(this,a);return h};_.yh=function qjd(){return Aid(this)};_.zh=function rjd(){return (NFd(),MFd).S};_.Ah=function sjd(){return aLd(this.zh())};_.Bh=function tjd(a){Cid(this,a)};_.Ib=function ujd(){return Eid(this)};var B5=mdb(qte,'BasicEObjectImpl',97);var zFd;bcb(114,97,{105:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1});_.Ch=function Djd(a){var b;b=xjd(this);return b[a]};_.Dh=function Ejd(a,b){var c;c=xjd(this);NC(c,a,b)};_.Eh=function Fjd(a){var b;b=xjd(this);NC(b,a,null)};_.Jg=function Gjd(){return BD(Ajd(this,4),126)};_.Kg=function Hjd(){throw vbb(new bgb)};_.Lg=function Ijd(){return (this.Db&4)!=0};_.Pg=function Jjd(){throw vbb(new bgb)};_.Fh=function Kjd(a){Cjd(this,2,a)};_.Rg=function Ljd(a,b){this.Db=b<<16|this.Db&255;this.Fh(a)};_.Tg=function Mjd(){return wjd(this)};_.Vg=function Njd(){return this.Db>>16};_.Wg=function Ojd(){var a,b;return nRd(),b=pNd(TKd((a=BD(Ajd(this,16),26),!a?this.zh():a))),b==null?(null,mRd):new qRd(this,b)};_.Mg=function Pjd(){return (this.Db&1)==0};_.Zg=function Qjd(){return BD(Ajd(this,128),1935)};_.$g=function Rjd(){return BD(Ajd(this,16),26)};_.dh=function Sjd(){return (this.Db&32)!=0};_.eh=function Tjd(){return BD(Ajd(this,2),49)};_.kh=function Ujd(){return (this.Db&64)!=0};_.ph=function Vjd(){throw vbb(new bgb)};_.qh=function Wjd(){return BD(Ajd(this,64),281)};_.th=function Xjd(a){Cjd(this,16,a)};_.uh=function Yjd(a){Cjd(this,128,a)};_.vh=function Zjd(a){Cjd(this,64,a)};_.yh=function $jd(){return yjd(this)};_.Db=0;var s8=mdb(qte,'MinimalEObjectImpl',114);bcb(115,114,{105:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1});_.Fh=function _jd(a){this.Cb=a};_.eh=function akd(){return this.Cb};var r8=mdb(qte,'MinimalEObjectImpl/Container',115);bcb(1985,115,{105:1,413:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1});_._g=function kkd(a,b,c){return bkd(this,a,b,c)};_.jh=function lkd(a,b,c){return ckd(this,a,b,c)};_.lh=function mkd(a){return dkd(this,a)};_.sh=function nkd(a,b){ekd(this,a,b)};_.zh=function okd(){return Thd(),Shd};_.Bh=function pkd(a){fkd(this,a)};_.Ve=function qkd(){return gkd(this)};_.We=function rkd(a){return hkd(this,a)};_.Xe=function skd(a){return ikd(this,a)};_.Ye=function tkd(a,b){return jkd(this,a,b)};var H2=mdb(rte,'EMapPropertyHolderImpl',1985);bcb(567,115,{105:1,469:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},xkd);_._g=function ykd(a,b,c){switch(a){case 0:return this.a;case 1:return this.b;}return fid(this,a,b,c)};_.lh=function zkd(a){switch(a){case 0:return this.a!=0;case 1:return this.b!=0;}return mid(this,a)};_.sh=function Akd(a,b){switch(a){case 0:vkd(this,Edb(ED(b)));return;case 1:wkd(this,Edb(ED(b)));return;}yid(this,a,b)};_.zh=function Bkd(){return Thd(),Ihd};_.Bh=function Ckd(a){switch(a){case 0:vkd(this,0);return;case 1:wkd(this,0);return;}Cid(this,a)};_.Ib=function Dkd(){var a;if((this.Db&64)!=0)return Eid(this);a=new Jfb(Eid(this));a.a+=' (x: ';Bfb(a,this.a);a.a+=', y: ';Bfb(a,this.b);a.a+=')';return a.a};_.a=0;_.b=0;var I2=mdb(rte,'ElkBendPointImpl',567);bcb(723,1985,{105:1,413:1,160:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1});_._g=function Nkd(a,b,c){return Ekd(this,a,b,c)};_.hh=function Okd(a,b,c){return Fkd(this,a,b,c)};_.jh=function Pkd(a,b,c){return Gkd(this,a,b,c)};_.lh=function Qkd(a){return Hkd(this,a)};_.sh=function Rkd(a,b){Ikd(this,a,b)};_.zh=function Skd(){return Thd(),Mhd};_.Bh=function Tkd(a){Jkd(this,a)};_.zg=function Ukd(){return this.k};_.Ag=function Vkd(){return Kkd(this)};_.Ib=function Wkd(){return Mkd(this)};_.k=null;var M2=mdb(rte,'ElkGraphElementImpl',723);bcb(724,723,{105:1,413:1,160:1,470:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1});_._g=function gld(a,b,c){return Xkd(this,a,b,c)};_.lh=function hld(a){return Ykd(this,a)};_.sh=function ild(a,b){Zkd(this,a,b)};_.zh=function jld(){return Thd(),Rhd};_.Bh=function kld(a){$kd(this,a)};_.Bg=function lld(){return this.f};_.Cg=function mld(){return this.g};_.Dg=function nld(){return this.i};_.Eg=function old(){return this.j};_.Fg=function pld(a,b){_kd(this,a,b)};_.Gg=function qld(a,b){bld(this,a,b)};_.Hg=function rld(a){dld(this,a)};_.Ig=function sld(a){eld(this,a)};_.Ib=function tld(){return fld(this)};_.f=0;_.g=0;_.i=0;_.j=0;var T2=mdb(rte,'ElkShapeImpl',724);bcb(725,724,{105:1,413:1,82:1,160:1,470:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1});_._g=function Bld(a,b,c){return uld(this,a,b,c)};_.hh=function Cld(a,b,c){return vld(this,a,b,c)};_.jh=function Dld(a,b,c){return wld(this,a,b,c)};_.lh=function Eld(a){return xld(this,a)};_.sh=function Fld(a,b){yld(this,a,b)};_.zh=function Gld(){return Thd(),Jhd};_.Bh=function Hld(a){zld(this,a)};_.xg=function Ild(){return !this.d&&(this.d=new y5d(B2,this,8,5)),this.d};_.yg=function Jld(){return !this.e&&(this.e=new y5d(B2,this,7,4)),this.e};var J2=mdb(rte,'ElkConnectableShapeImpl',725);bcb(352,723,{105:1,413:1,79:1,160:1,352:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},Tld);_.Qg=function Uld(a){return Lld(this,a)};_._g=function Vld(a,b,c){switch(a){case 3:return Mld(this);case 4:return !this.b&&(this.b=new y5d(z2,this,4,7)),this.b;case 5:return !this.c&&(this.c=new y5d(z2,this,5,8)),this.c;case 6:return !this.a&&(this.a=new cUd(A2,this,6,6)),this.a;case 7:return Bcb(),!this.b&&(this.b=new y5d(z2,this,4,7)),this.b.i<=1&&(!this.c&&(this.c=new y5d(z2,this,5,8)),this.c.i<=1)?false:true;case 8:return Bcb(),Pld(this)?true:false;case 9:return Bcb(),Qld(this)?true:false;case 10:return Bcb(),!this.b&&(this.b=new y5d(z2,this,4,7)),this.b.i!=0&&(!this.c&&(this.c=new y5d(z2,this,5,8)),this.c.i!=0)?true:false;}return Ekd(this,a,b,c)};_.hh=function Wld(a,b,c){var d;switch(b){case 3:!!this.Cb&&(c=(d=this.Db>>16,d>=0?Lld(this,c):this.Cb.ih(this,-1-d,null,c)));return Kld(this,BD(a,33),c);case 4:return !this.b&&(this.b=new y5d(z2,this,4,7)),Sxd(this.b,a,c);case 5:return !this.c&&(this.c=new y5d(z2,this,5,8)),Sxd(this.c,a,c);case 6:return !this.a&&(this.a=new cUd(A2,this,6,6)),Sxd(this.a,a,c);}return Fkd(this,a,b,c)};_.jh=function Xld(a,b,c){switch(b){case 3:return Kld(this,null,c);case 4:return !this.b&&(this.b=new y5d(z2,this,4,7)),Txd(this.b,a,c);case 5:return !this.c&&(this.c=new y5d(z2,this,5,8)),Txd(this.c,a,c);case 6:return !this.a&&(this.a=new cUd(A2,this,6,6)),Txd(this.a,a,c);}return Gkd(this,a,b,c)};_.lh=function Yld(a){switch(a){case 3:return !!Mld(this);case 4:return !!this.b&&this.b.i!=0;case 5:return !!this.c&&this.c.i!=0;case 6:return !!this.a&&this.a.i!=0;case 7:return !this.b&&(this.b=new y5d(z2,this,4,7)),!(this.b.i<=1&&(!this.c&&(this.c=new y5d(z2,this,5,8)),this.c.i<=1));case 8:return Pld(this);case 9:return Qld(this);case 10:return !this.b&&(this.b=new y5d(z2,this,4,7)),this.b.i!=0&&(!this.c&&(this.c=new y5d(z2,this,5,8)),this.c.i!=0);}return Hkd(this,a)};_.sh=function Zld(a,b){switch(a){case 3:Rld(this,BD(b,33));return;case 4:!this.b&&(this.b=new y5d(z2,this,4,7));Uxd(this.b);!this.b&&(this.b=new y5d(z2,this,4,7));ytd(this.b,BD(b,14));return;case 5:!this.c&&(this.c=new y5d(z2,this,5,8));Uxd(this.c);!this.c&&(this.c=new y5d(z2,this,5,8));ytd(this.c,BD(b,14));return;case 6:!this.a&&(this.a=new cUd(A2,this,6,6));Uxd(this.a);!this.a&&(this.a=new cUd(A2,this,6,6));ytd(this.a,BD(b,14));return;}Ikd(this,a,b)};_.zh=function $ld(){return Thd(),Khd};_.Bh=function _ld(a){switch(a){case 3:Rld(this,null);return;case 4:!this.b&&(this.b=new y5d(z2,this,4,7));Uxd(this.b);return;case 5:!this.c&&(this.c=new y5d(z2,this,5,8));Uxd(this.c);return;case 6:!this.a&&(this.a=new cUd(A2,this,6,6));Uxd(this.a);return;}Jkd(this,a)};_.Ib=function amd(){return Sld(this)};var K2=mdb(rte,'ElkEdgeImpl',352);bcb(439,1985,{105:1,413:1,202:1,439:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},rmd);_.Qg=function smd(a){return cmd(this,a)};_._g=function tmd(a,b,c){switch(a){case 1:return this.j;case 2:return this.k;case 3:return this.b;case 4:return this.c;case 5:return !this.a&&(this.a=new xMd(y2,this,5)),this.a;case 6:return fmd(this);case 7:if(b)return emd(this);return this.i;case 8:if(b)return dmd(this);return this.f;case 9:return !this.g&&(this.g=new y5d(A2,this,9,10)),this.g;case 10:return !this.e&&(this.e=new y5d(A2,this,10,9)),this.e;case 11:return this.d;}return bkd(this,a,b,c)};_.hh=function umd(a,b,c){var d,e,f;switch(b){case 6:!!this.Cb&&(c=(e=this.Db>>16,e>=0?cmd(this,c):this.Cb.ih(this,-1-e,null,c)));return bmd(this,BD(a,79),c);case 9:return !this.g&&(this.g=new y5d(A2,this,9,10)),Sxd(this.g,a,c);case 10:return !this.e&&(this.e=new y5d(A2,this,10,9)),Sxd(this.e,a,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(Thd(),Lhd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((Thd(),Lhd)),a,c)};_.jh=function vmd(a,b,c){switch(b){case 5:return !this.a&&(this.a=new xMd(y2,this,5)),Txd(this.a,a,c);case 6:return bmd(this,null,c);case 9:return !this.g&&(this.g=new y5d(A2,this,9,10)),Txd(this.g,a,c);case 10:return !this.e&&(this.e=new y5d(A2,this,10,9)),Txd(this.e,a,c);}return ckd(this,a,b,c)};_.lh=function wmd(a){switch(a){case 1:return this.j!=0;case 2:return this.k!=0;case 3:return this.b!=0;case 4:return this.c!=0;case 5:return !!this.a&&this.a.i!=0;case 6:return !!fmd(this);case 7:return !!this.i;case 8:return !!this.f;case 9:return !!this.g&&this.g.i!=0;case 10:return !!this.e&&this.e.i!=0;case 11:return this.d!=null;}return dkd(this,a)};_.sh=function xmd(a,b){switch(a){case 1:omd(this,Edb(ED(b)));return;case 2:pmd(this,Edb(ED(b)));return;case 3:hmd(this,Edb(ED(b)));return;case 4:imd(this,Edb(ED(b)));return;case 5:!this.a&&(this.a=new xMd(y2,this,5));Uxd(this.a);!this.a&&(this.a=new xMd(y2,this,5));ytd(this.a,BD(b,14));return;case 6:mmd(this,BD(b,79));return;case 7:lmd(this,BD(b,82));return;case 8:kmd(this,BD(b,82));return;case 9:!this.g&&(this.g=new y5d(A2,this,9,10));Uxd(this.g);!this.g&&(this.g=new y5d(A2,this,9,10));ytd(this.g,BD(b,14));return;case 10:!this.e&&(this.e=new y5d(A2,this,10,9));Uxd(this.e);!this.e&&(this.e=new y5d(A2,this,10,9));ytd(this.e,BD(b,14));return;case 11:jmd(this,GD(b));return;}ekd(this,a,b)};_.zh=function ymd(){return Thd(),Lhd};_.Bh=function zmd(a){switch(a){case 1:omd(this,0);return;case 2:pmd(this,0);return;case 3:hmd(this,0);return;case 4:imd(this,0);return;case 5:!this.a&&(this.a=new xMd(y2,this,5));Uxd(this.a);return;case 6:mmd(this,null);return;case 7:lmd(this,null);return;case 8:kmd(this,null);return;case 9:!this.g&&(this.g=new y5d(A2,this,9,10));Uxd(this.g);return;case 10:!this.e&&(this.e=new y5d(A2,this,10,9));Uxd(this.e);return;case 11:jmd(this,null);return;}fkd(this,a)};_.Ib=function Amd(){return qmd(this)};_.b=0;_.c=0;_.d=null;_.j=0;_.k=0;var L2=mdb(rte,'ElkEdgeSectionImpl',439);bcb(150,115,{105:1,92:1,90:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1});_._g=function Emd(a,b,c){var d;if(a==0){return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab}return bid(this,a-aLd(this.zh()),XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),a),b,c)};_.hh=function Fmd(a,b,c){var d,e;if(b==0){return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c)}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),e.Nj().Qj(this,yjd(this),b-aLd(this.zh()),a,c)};_.jh=function Gmd(a,b,c){var d,e;if(b==0){return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c)}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),e.Nj().Rj(this,yjd(this),b-aLd(this.zh()),a,c)};_.lh=function Hmd(a){var b;if(a==0){return !!this.Ab&&this.Ab.i!=0}return cid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.oh=function Imd(a){return Bmd(this,a)};_.sh=function Jmd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;}did(this,a-aLd(this.zh()),XKd((c=BD(Ajd(this,16),26),!c?this.zh():c),a),b)};_.uh=function Kmd(a){Cjd(this,128,a)};_.zh=function Lmd(){return jGd(),ZFd};_.Bh=function Mmd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;}eid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.Gh=function Nmd(){this.Bb|=1};_.Hh=function Omd(a){return Dmd(this,a)};_.Bb=0;var f6=mdb(qte,'EModelElementImpl',150);bcb(704,150,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1},$md);_.Ih=function _md(a,b){return Vmd(this,a,b)};_.Jh=function and(a){var b,c,d,e,f;if(this.a!=bKd(a)||(a.Bb&256)!=0){throw vbb(new Wdb(xte+a.zb+ute))}for(d=_Kd(a);VKd(d.a).i!=0;){c=BD(nOd(d,0,(b=BD(qud(VKd(d.a),0),87),f=b.c,JD(f,88)?BD(f,26):(jGd(),_Fd))),26);if(dKd(c)){e=bKd(c).Nh().Jh(c);BD(e,49).th(a);return e}d=_Kd(c)}return (a.D!=null?a.D:a.B)=='java.util.Map$Entry'?new lHd(a):new _Gd(a)};_.Kh=function bnd(a,b){return Wmd(this,a,b)};_._g=function cnd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.a;}return bid(this,a-aLd((jGd(),WFd)),XKd((d=BD(Ajd(this,16),26),!d?WFd:d),a),b,c)};_.hh=function dnd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 1:!!this.a&&(c=BD(this.a,49).ih(this,4,o5,c));return Tmd(this,BD(a,235),c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),WFd):d),b),66),e.Nj().Qj(this,yjd(this),b-aLd((jGd(),WFd)),a,c)};_.jh=function end(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 1:return Tmd(this,null,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),WFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),WFd)),a,c)};_.lh=function fnd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return !!this.a;}return cid(this,a-aLd((jGd(),WFd)),XKd((b=BD(Ajd(this,16),26),!b?WFd:b),a))};_.sh=function gnd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:Ymd(this,BD(b,235));return;}did(this,a-aLd((jGd(),WFd)),XKd((c=BD(Ajd(this,16),26),!c?WFd:c),a),b)};_.zh=function hnd(){return jGd(),WFd};_.Bh=function ind(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:Ymd(this,null);return;}eid(this,a-aLd((jGd(),WFd)),XKd((b=BD(Ajd(this,16),26),!b?WFd:b),a))};var Pmd,Qmd,Rmd;var d6=mdb(qte,'EFactoryImpl',704);bcb(zte,704,{105:1,2014:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1},knd);_.Ih=function lnd(a,b){switch(a.yj()){case 12:return BD(b,146).tg();case 13:return fcb(b);default:throw vbb(new Wdb(tte+a.ne()+ute));}};_.Jh=function mnd(a){var b,c,d,e,f,g,h,i;switch(a.G==-1&&(a.G=(b=bKd(a),b?HLd(b.Mh(),a):-1)),a.G){case 4:return f=new Jod,f;case 6:return g=new apd,g;case 7:return h=new ppd,h;case 8:return d=new Tld,d;case 9:return c=new xkd,c;case 10:return e=new rmd,e;case 11:return i=new Bpd,i;default:throw vbb(new Wdb(xte+a.zb+ute));}};_.Kh=function nnd(a,b){switch(a.yj()){case 13:case 12:return null;default:throw vbb(new Wdb(tte+a.ne()+ute));}};var N2=mdb(rte,'ElkGraphFactoryImpl',zte);bcb(438,150,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1});_.Wg=function rnd(){var a,b;b=(a=BD(Ajd(this,16),26),pNd(TKd(!a?this.zh():a)));return b==null?(nRd(),nRd(),mRd):new GRd(this,b)};_._g=function snd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.ne();}return bid(this,a-aLd(this.zh()),XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),a),b,c)};_.lh=function tnd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;}return cid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.sh=function und(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:this.Lh(GD(b));return;}did(this,a-aLd(this.zh()),XKd((c=BD(Ajd(this,16),26),!c?this.zh():c),a),b)};_.zh=function vnd(){return jGd(),$Fd};_.Bh=function wnd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:this.Lh(null);return;}eid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.ne=function xnd(){return this.zb};_.Lh=function ynd(a){pnd(this,a)};_.Ib=function znd(){return qnd(this)};_.zb=null;var j6=mdb(qte,'ENamedElementImpl',438);bcb(179,438,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1},eod);_.Qg=function god(a){return Snd(this,a)};_._g=function hod(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return this.yb;case 3:return this.xb;case 4:return this.sb;case 5:return !this.rb&&(this.rb=new jUd(this,d5,this)),this.rb;case 6:return !this.vb&&(this.vb=new gUd(o5,this,6,7)),this.vb;case 7:if(b)return this.Db>>16==7?BD(this.Cb,235):null;return Ind(this);}return bid(this,a-aLd((jGd(),cGd)),XKd((d=BD(Ajd(this,16),26),!d?cGd:d),a),b,c)};_.hh=function iod(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 4:!!this.sb&&(c=BD(this.sb,49).ih(this,1,i5,c));return Jnd(this,BD(a,471),c);case 5:return !this.rb&&(this.rb=new jUd(this,d5,this)),Sxd(this.rb,a,c);case 6:return !this.vb&&(this.vb=new gUd(o5,this,6,7)),Sxd(this.vb,a,c);case 7:!!this.Cb&&(c=(e=this.Db>>16,e>=0?Snd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,7,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),cGd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),cGd)),a,c)};_.jh=function jod(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 4:return Jnd(this,null,c);case 5:return !this.rb&&(this.rb=new jUd(this,d5,this)),Txd(this.rb,a,c);case 6:return !this.vb&&(this.vb=new gUd(o5,this,6,7)),Txd(this.vb,a,c);case 7:return _hd(this,null,7,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),cGd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),cGd)),a,c)};_.lh=function kod(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.yb!=null;case 3:return this.xb!=null;case 4:return !!this.sb;case 5:return !!this.rb&&this.rb.i!=0;case 6:return !!this.vb&&this.vb.i!=0;case 7:return !!Ind(this);}return cid(this,a-aLd((jGd(),cGd)),XKd((b=BD(Ajd(this,16),26),!b?cGd:b),a))};_.oh=function lod(a){var b;b=Und(this,a);return b?b:Bmd(this,a)};_.sh=function mod(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:pnd(this,GD(b));return;case 2:dod(this,GD(b));return;case 3:cod(this,GD(b));return;case 4:bod(this,BD(b,471));return;case 5:!this.rb&&(this.rb=new jUd(this,d5,this));Uxd(this.rb);!this.rb&&(this.rb=new jUd(this,d5,this));ytd(this.rb,BD(b,14));return;case 6:!this.vb&&(this.vb=new gUd(o5,this,6,7));Uxd(this.vb);!this.vb&&(this.vb=new gUd(o5,this,6,7));ytd(this.vb,BD(b,14));return;}did(this,a-aLd((jGd(),cGd)),XKd((c=BD(Ajd(this,16),26),!c?cGd:c),a),b)};_.vh=function nod(a){var b,c;if(!!a&&!!this.rb){for(c=new Fyd(this.rb);c.e!=c.i.gc();){b=Dyd(c);JD(b,351)&&(BD(b,351).w=null)}}Cjd(this,64,a)};_.zh=function ood(){return jGd(),cGd};_.Bh=function pod(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:pnd(this,null);return;case 2:dod(this,null);return;case 3:cod(this,null);return;case 4:bod(this,null);return;case 5:!this.rb&&(this.rb=new jUd(this,d5,this));Uxd(this.rb);return;case 6:!this.vb&&(this.vb=new gUd(o5,this,6,7));Uxd(this.vb);return;}eid(this,a-aLd((jGd(),cGd)),XKd((b=BD(Ajd(this,16),26),!b?cGd:b),a))};_.Gh=function qod(){Tnd(this)};_.Mh=function rod(){return !this.rb&&(this.rb=new jUd(this,d5,this)),this.rb};_.Nh=function sod(){return this.sb};_.Oh=function tod(){return this.ub};_.Ph=function uod(){return this.xb};_.Qh=function vod(){return this.yb};_.Rh=function wod(a){this.ub=a};_.Ib=function xod(){var a;if((this.Db&64)!=0)return qnd(this);a=new Jfb(qnd(this));a.a+=' (nsURI: ';Efb(a,this.yb);a.a+=', nsPrefix: ';Efb(a,this.xb);a.a+=')';return a.a};_.xb=null;_.yb=null;var And;var t6=mdb(qte,'EPackageImpl',179);bcb(555,179,{105:1,2016:1,555:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1},Bod);_.q=false;_.r=false;var yod=false;var O2=mdb(rte,'ElkGraphPackageImpl',555);bcb(354,724,{105:1,413:1,160:1,137:1,470:1,354:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},Jod);_.Qg=function Kod(a){return Eod(this,a)};_._g=function Lod(a,b,c){switch(a){case 7:return Fod(this);case 8:return this.a;}return Xkd(this,a,b,c)};_.hh=function Mod(a,b,c){var d;switch(b){case 7:!!this.Cb&&(c=(d=this.Db>>16,d>=0?Eod(this,c):this.Cb.ih(this,-1-d,null,c)));return Dod(this,BD(a,160),c);}return Fkd(this,a,b,c)};_.jh=function Nod(a,b,c){if(b==7){return Dod(this,null,c)}return Gkd(this,a,b,c)};_.lh=function Ood(a){switch(a){case 7:return !!Fod(this);case 8:return !dfb('',this.a);}return Ykd(this,a)};_.sh=function Pod(a,b){switch(a){case 7:God(this,BD(b,160));return;case 8:Hod(this,GD(b));return;}Zkd(this,a,b)};_.zh=function Qod(){return Thd(),Nhd};_.Bh=function Rod(a){switch(a){case 7:God(this,null);return;case 8:Hod(this,'');return;}$kd(this,a)};_.Ib=function Sod(){return Iod(this)};_.a='';var P2=mdb(rte,'ElkLabelImpl',354);bcb(239,725,{105:1,413:1,82:1,160:1,33:1,470:1,239:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},apd);_.Qg=function bpd(a){return Uod(this,a)};_._g=function cpd(a,b,c){switch(a){case 9:return !this.c&&(this.c=new cUd(F2,this,9,9)),this.c;case 10:return !this.a&&(this.a=new cUd(E2,this,10,11)),this.a;case 11:return Xod(this);case 12:return !this.b&&(this.b=new cUd(B2,this,12,3)),this.b;case 13:return Bcb(),!this.a&&(this.a=new cUd(E2,this,10,11)),this.a.i>0?true:false;}return uld(this,a,b,c)};_.hh=function dpd(a,b,c){var d;switch(b){case 9:return !this.c&&(this.c=new cUd(F2,this,9,9)),Sxd(this.c,a,c);case 10:return !this.a&&(this.a=new cUd(E2,this,10,11)),Sxd(this.a,a,c);case 11:!!this.Cb&&(c=(d=this.Db>>16,d>=0?Uod(this,c):this.Cb.ih(this,-1-d,null,c)));return Tod(this,BD(a,33),c);case 12:return !this.b&&(this.b=new cUd(B2,this,12,3)),Sxd(this.b,a,c);}return vld(this,a,b,c)};_.jh=function epd(a,b,c){switch(b){case 9:return !this.c&&(this.c=new cUd(F2,this,9,9)),Txd(this.c,a,c);case 10:return !this.a&&(this.a=new cUd(E2,this,10,11)),Txd(this.a,a,c);case 11:return Tod(this,null,c);case 12:return !this.b&&(this.b=new cUd(B2,this,12,3)),Txd(this.b,a,c);}return wld(this,a,b,c)};_.lh=function fpd(a){switch(a){case 9:return !!this.c&&this.c.i!=0;case 10:return !!this.a&&this.a.i!=0;case 11:return !!Xod(this);case 12:return !!this.b&&this.b.i!=0;case 13:return !this.a&&(this.a=new cUd(E2,this,10,11)),this.a.i>0;}return xld(this,a)};_.sh=function gpd(a,b){switch(a){case 9:!this.c&&(this.c=new cUd(F2,this,9,9));Uxd(this.c);!this.c&&(this.c=new cUd(F2,this,9,9));ytd(this.c,BD(b,14));return;case 10:!this.a&&(this.a=new cUd(E2,this,10,11));Uxd(this.a);!this.a&&(this.a=new cUd(E2,this,10,11));ytd(this.a,BD(b,14));return;case 11:$od(this,BD(b,33));return;case 12:!this.b&&(this.b=new cUd(B2,this,12,3));Uxd(this.b);!this.b&&(this.b=new cUd(B2,this,12,3));ytd(this.b,BD(b,14));return;}yld(this,a,b)};_.zh=function hpd(){return Thd(),Ohd};_.Bh=function ipd(a){switch(a){case 9:!this.c&&(this.c=new cUd(F2,this,9,9));Uxd(this.c);return;case 10:!this.a&&(this.a=new cUd(E2,this,10,11));Uxd(this.a);return;case 11:$od(this,null);return;case 12:!this.b&&(this.b=new cUd(B2,this,12,3));Uxd(this.b);return;}zld(this,a)};_.Ib=function jpd(){return _od(this)};var Q2=mdb(rte,'ElkNodeImpl',239);bcb(186,725,{105:1,413:1,82:1,160:1,118:1,470:1,186:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},ppd);_.Qg=function qpd(a){return lpd(this,a)};_._g=function rpd(a,b,c){if(a==9){return mpd(this)}return uld(this,a,b,c)};_.hh=function spd(a,b,c){var d;switch(b){case 9:!!this.Cb&&(c=(d=this.Db>>16,d>=0?lpd(this,c):this.Cb.ih(this,-1-d,null,c)));return kpd(this,BD(a,33),c);}return vld(this,a,b,c)};_.jh=function tpd(a,b,c){if(b==9){return kpd(this,null,c)}return wld(this,a,b,c)};_.lh=function upd(a){if(a==9){return !!mpd(this)}return xld(this,a)};_.sh=function vpd(a,b){switch(a){case 9:npd(this,BD(b,33));return;}yld(this,a,b)};_.zh=function wpd(){return Thd(),Phd};_.Bh=function xpd(a){switch(a){case 9:npd(this,null);return;}zld(this,a)};_.Ib=function ypd(){return opd(this)};var R2=mdb(rte,'ElkPortImpl',186);var J4=odb(Tte,'BasicEMap/Entry');bcb(1092,115,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1,114:1,115:1},Bpd);_.Fb=function Hpd(a){return this===a};_.cd=function Jpd(){return this.b};_.Hb=function Lpd(){return FCb(this)};_.Uh=function Npd(a){zpd(this,BD(a,146))};_._g=function Cpd(a,b,c){switch(a){case 0:return this.b;case 1:return this.c;}return fid(this,a,b,c)};_.lh=function Dpd(a){switch(a){case 0:return !!this.b;case 1:return this.c!=null;}return mid(this,a)};_.sh=function Epd(a,b){switch(a){case 0:zpd(this,BD(b,146));return;case 1:Apd(this,b);return;}yid(this,a,b)};_.zh=function Fpd(){return Thd(),Qhd};_.Bh=function Gpd(a){switch(a){case 0:zpd(this,null);return;case 1:Apd(this,null);return;}Cid(this,a)};_.Sh=function Ipd(){var a;if(this.a==-1){a=this.b;this.a=!a?0:tb(a)}return this.a};_.dd=function Kpd(){return this.c};_.Th=function Mpd(a){this.a=a};_.ed=function Opd(a){var b;b=this.c;Apd(this,a);return b};_.Ib=function Ppd(){var a;if((this.Db&64)!=0)return Eid(this);a=new Ufb;Qfb(Qfb(Qfb(a,this.b?this.b.tg():Xhe),gne),xfb(this.c));return a.a};_.a=-1;_.c=null;var S2=mdb(rte,'ElkPropertyToValueMapEntryImpl',1092);bcb(984,1,{},bqd);var U2=mdb(Wte,'JsonAdapter',984);bcb(210,60,Tie,cqd);var V2=mdb(Wte,'JsonImportException',210);bcb(857,1,{},ird);var J3=mdb(Wte,'JsonImporter',857);bcb(891,1,{},jrd);var W2=mdb(Wte,'JsonImporter/lambda$0$Type',891);bcb(892,1,{},krd);var X2=mdb(Wte,'JsonImporter/lambda$1$Type',892);bcb(900,1,{},lrd);var Y2=mdb(Wte,'JsonImporter/lambda$10$Type',900);bcb(902,1,{},mrd);var Z2=mdb(Wte,'JsonImporter/lambda$11$Type',902);bcb(903,1,{},nrd);var $2=mdb(Wte,'JsonImporter/lambda$12$Type',903);bcb(909,1,{},ord);var _2=mdb(Wte,'JsonImporter/lambda$13$Type',909);bcb(908,1,{},prd);var a3=mdb(Wte,'JsonImporter/lambda$14$Type',908);bcb(904,1,{},qrd);var b3=mdb(Wte,'JsonImporter/lambda$15$Type',904);bcb(905,1,{},rrd);var c3=mdb(Wte,'JsonImporter/lambda$16$Type',905);bcb(906,1,{},srd);var d3=mdb(Wte,'JsonImporter/lambda$17$Type',906);bcb(907,1,{},trd);var e3=mdb(Wte,'JsonImporter/lambda$18$Type',907);bcb(912,1,{},urd);var f3=mdb(Wte,'JsonImporter/lambda$19$Type',912);bcb(893,1,{},vrd);var g3=mdb(Wte,'JsonImporter/lambda$2$Type',893);bcb(910,1,{},wrd);var h3=mdb(Wte,'JsonImporter/lambda$20$Type',910);bcb(911,1,{},xrd);var i3=mdb(Wte,'JsonImporter/lambda$21$Type',911);bcb(915,1,{},yrd);var j3=mdb(Wte,'JsonImporter/lambda$22$Type',915);bcb(913,1,{},zrd);var k3=mdb(Wte,'JsonImporter/lambda$23$Type',913);bcb(914,1,{},Ard);var l3=mdb(Wte,'JsonImporter/lambda$24$Type',914);bcb(917,1,{},Brd);var m3=mdb(Wte,'JsonImporter/lambda$25$Type',917);bcb(916,1,{},Crd);var n3=mdb(Wte,'JsonImporter/lambda$26$Type',916);bcb(918,1,qie,Drd);_.td=function Erd(a){Bqd(this.b,this.a,GD(a))};var o3=mdb(Wte,'JsonImporter/lambda$27$Type',918);bcb(919,1,qie,Frd);_.td=function Grd(a){Cqd(this.b,this.a,GD(a))};var p3=mdb(Wte,'JsonImporter/lambda$28$Type',919);bcb(920,1,{},Hrd);var q3=mdb(Wte,'JsonImporter/lambda$29$Type',920);bcb(896,1,{},Ird);var r3=mdb(Wte,'JsonImporter/lambda$3$Type',896);bcb(921,1,{},Jrd);var s3=mdb(Wte,'JsonImporter/lambda$30$Type',921);bcb(922,1,{},Krd);var t3=mdb(Wte,'JsonImporter/lambda$31$Type',922);bcb(923,1,{},Lrd);var u3=mdb(Wte,'JsonImporter/lambda$32$Type',923);bcb(924,1,{},Mrd);var v3=mdb(Wte,'JsonImporter/lambda$33$Type',924);bcb(925,1,{},Nrd);var w3=mdb(Wte,'JsonImporter/lambda$34$Type',925);bcb(859,1,{},Prd);var x3=mdb(Wte,'JsonImporter/lambda$35$Type',859);bcb(929,1,{},Rrd);var y3=mdb(Wte,'JsonImporter/lambda$36$Type',929);bcb(926,1,qie,Srd);_.td=function Trd(a){Lqd(this.a,BD(a,469))};var z3=mdb(Wte,'JsonImporter/lambda$37$Type',926);bcb(927,1,qie,Urd);_.td=function Vrd(a){Mqd(this.a,this.b,BD(a,202))};var A3=mdb(Wte,'JsonImporter/lambda$38$Type',927);bcb(928,1,qie,Wrd);_.td=function Xrd(a){Nqd(this.a,this.b,BD(a,202))};var B3=mdb(Wte,'JsonImporter/lambda$39$Type',928);bcb(894,1,{},Yrd);var C3=mdb(Wte,'JsonImporter/lambda$4$Type',894);bcb(930,1,qie,Zrd);_.td=function $rd(a){Oqd(this.a,BD(a,8))};var D3=mdb(Wte,'JsonImporter/lambda$40$Type',930);bcb(895,1,{},_rd);var E3=mdb(Wte,'JsonImporter/lambda$5$Type',895);bcb(899,1,{},asd);var F3=mdb(Wte,'JsonImporter/lambda$6$Type',899);bcb(897,1,{},bsd);var G3=mdb(Wte,'JsonImporter/lambda$7$Type',897);bcb(898,1,{},csd);var H3=mdb(Wte,'JsonImporter/lambda$8$Type',898);bcb(901,1,{},dsd);var I3=mdb(Wte,'JsonImporter/lambda$9$Type',901);bcb(948,1,qie,msd);_.td=function nsd(a){Qpd(this.a,new yC(GD(a)))};var K3=mdb(Wte,'JsonMetaDataConverter/lambda$0$Type',948);bcb(949,1,qie,osd);_.td=function psd(a){isd(this.a,BD(a,237))};var L3=mdb(Wte,'JsonMetaDataConverter/lambda$1$Type',949);bcb(950,1,qie,qsd);_.td=function rsd(a){jsd(this.a,BD(a,149))};var M3=mdb(Wte,'JsonMetaDataConverter/lambda$2$Type',950);bcb(951,1,qie,ssd);_.td=function tsd(a){ksd(this.a,BD(a,175))};var N3=mdb(Wte,'JsonMetaDataConverter/lambda$3$Type',951);bcb(237,22,{3:1,35:1,22:1,237:1},Dsd);var usd,vsd,wsd,xsd,ysd,zsd,Asd,Bsd;var O3=ndb(Hle,'GraphFeature',237,CI,Fsd,Esd);var Gsd;bcb(13,1,{35:1,146:1},Lsd,Msd,Nsd,Osd);_.wd=function Psd(a){return Isd(this,BD(a,146))};_.Fb=function Qsd(a){return Jsd(this,a)};_.wg=function Rsd(){return Ksd(this)};_.tg=function Ssd(){return this.b};_.Hb=function Tsd(){return LCb(this.b)};_.Ib=function Usd(){return this.b};var T3=mdb(Hle,'Property',13);bcb(818,1,Dke,Wsd);_.ue=function Xsd(a,b){return Vsd(this,BD(a,94),BD(b,94))};_.Fb=function Ysd(a){return this===a};_.ve=function Zsd(){return new tpb(this)};var S3=mdb(Hle,'PropertyHolderComparator',818);bcb(695,1,aie,qtd);_.Nb=function rtd(a){Rrb(this,a)};_.Pb=function ttd(){return ptd(this)};_.Qb=function utd(){Srb()};_.Ob=function std(){return !!this.a};var U3=mdb(jue,'ElkGraphUtil/AncestorIterator',695);var T4=odb(Tte,'EList');bcb(67,52,{20:1,28:1,52:1,14:1,15:1,67:1,58:1});_.Vc=function Jtd(a,b){vtd(this,a,b)};_.Fc=function Ktd(a){return wtd(this,a)};_.Wc=function Ltd(a,b){return xtd(this,a,b)};_.Gc=function Mtd(a){return ytd(this,a)};_.Zh=function Ntd(){return new $yd(this)};_.$h=function Otd(){return new bzd(this)};_._h=function Ptd(a){return ztd(this,a)};_.ai=function Qtd(){return true};_.bi=function Rtd(a,b){};_.ci=function Std(){};_.di=function Ttd(a,b){Atd(this,a,b)};_.ei=function Utd(a,b,c){};_.fi=function Vtd(a,b){};_.gi=function Wtd(a,b,c){};_.Fb=function Xtd(a){return Btd(this,a)};_.Hb=function Ytd(){return Etd(this)};_.hi=function Ztd(){return false};_.Kc=function $td(){return new Fyd(this)};_.Yc=function _td(){return new Oyd(this)};_.Zc=function aud(a){var b;b=this.gc();if(a<0||a>b)throw vbb(new Cyd(a,b));return new Pyd(this,a)};_.ji=function bud(a,b){this.ii(a,this.Xc(b))};_.Mc=function cud(a){return Ftd(this,a)};_.li=function dud(a,b){return b};_._c=function eud(a,b){return Gtd(this,a,b)};_.Ib=function fud(){return Htd(this)};_.ni=function gud(){return true};_.oi=function hud(a,b){return Itd(this,b)};var p4=mdb(Tte,'AbstractEList',67);bcb(63,67,oue,yud,zud,Aud);_.Vh=function Bud(a,b){return iud(this,a,b)};_.Wh=function Cud(a){return jud(this,a)};_.Xh=function Dud(a,b){kud(this,a,b)};_.Yh=function Eud(a){lud(this,a)};_.pi=function Fud(a){return nud(this,a)};_.$b=function Gud(){oud(this)};_.Hc=function Hud(a){return pud(this,a)};_.Xb=function Iud(a){return qud(this,a)};_.qi=function Jud(a){var b,c,d;++this.j;c=this.g==null?0:this.g.length;if(a>c){d=this.g;b=c+(c/2|0)+4;b=0){this.$c(b);return true}else{return false}};_.mi=function lwd(a,b){return this.Ui(a,this.oi(a,b))};_.gc=function mwd(){return this.Vi()};_.Pc=function nwd(){return this.Wi()};_.Qc=function owd(a){return this.Xi(a)};_.Ib=function pwd(){return this.Yi()};var M4=mdb(Tte,'DelegatingEList',1995);bcb(1996,1995,eve);_.Vh=function xwd(a,b){return qwd(this,a,b)};_.Wh=function ywd(a){return this.Vh(this.Vi(),a)};_.Xh=function zwd(a,b){rwd(this,a,b)};_.Yh=function Awd(a){swd(this,a)};_.ai=function Bwd(){return !this.bj()};_.$b=function Cwd(){vwd(this)};_.Zi=function Dwd(a,b,c,d,e){return new Cxd(this,a,b,c,d,e)};_.$i=function Ewd(a){Uhd(this.Ai(),a)};_._i=function Fwd(){return null};_.aj=function Gwd(){return -1};_.Ai=function Hwd(){return null};_.bj=function Iwd(){return false};_.cj=function Jwd(a,b){return b};_.dj=function Kwd(a,b){return b};_.ej=function Lwd(){return false};_.fj=function Mwd(){return !this.Ri()};_.ii=function Nwd(a,b){var c,d;if(this.ej()){d=this.fj();c=Dvd(this,a,b);this.$i(this.Zi(7,meb(b),c,a,d));return c}else{return Dvd(this,a,b)}};_.$c=function Owd(a){var b,c,d,e;if(this.ej()){c=null;d=this.fj();b=this.Zi(4,e=Evd(this,a),null,a,d);if(this.bj()&&!!e){c=this.dj(e,c);if(!c){this.$i(b)}else{c.Ei(b);c.Fi()}}else{if(!c){this.$i(b)}else{c.Ei(b);c.Fi()}}return e}else{e=Evd(this,a);if(this.bj()&&!!e){c=this.dj(e,null);!!c&&c.Fi()}return e}};_.mi=function Pwd(a,b){return wwd(this,a,b)};var d4=mdb(hte,'DelegatingNotifyingListImpl',1996);bcb(143,1,fve);_.Ei=function pxd(a){return Qwd(this,a)};_.Fi=function qxd(){Rwd(this)};_.xi=function rxd(){return this.d};_._i=function sxd(){return null};_.gj=function txd(){return null};_.yi=function uxd(a){return -1};_.zi=function vxd(){return $wd(this)};_.Ai=function wxd(){return null};_.Bi=function xxd(){return hxd(this)};_.Ci=function yxd(){return this.o<0?this.o<-2?-2-this.o-1:-1:this.o};_.hj=function zxd(){return false};_.Di=function Axd(a){var b,c,d,e,f,g,h,i,j,k,l;switch(this.d){case 1:case 2:{e=a.xi();switch(e){case 1:case 2:{f=a.Ai();if(PD(f)===PD(this.Ai())&&this.yi(null)==a.yi(null)){this.g=a.zi();a.xi()==1&&(this.d=1);return true}}}}case 4:{e=a.xi();switch(e){case 4:{f=a.Ai();if(PD(f)===PD(this.Ai())&&this.yi(null)==a.yi(null)){j=jxd(this);i=this.o<0?this.o<-2?-2-this.o-1:-1:this.o;g=a.Ci();this.d=6;l=new zud(2);if(i<=g){wtd(l,this.n);wtd(l,a.Bi());this.g=OC(GC(WD,1),oje,25,15,[this.o=i,g+1])}else{wtd(l,a.Bi());wtd(l,this.n);this.g=OC(GC(WD,1),oje,25,15,[this.o=g,i])}this.n=l;j||(this.o=-2-this.o-1);return true}break}}break}case 6:{e=a.xi();switch(e){case 4:{f=a.Ai();if(PD(f)===PD(this.Ai())&&this.yi(null)==a.yi(null)){j=jxd(this);g=a.Ci();k=BD(this.g,48);d=KC(WD,oje,25,k.length+1,15,1);b=0;while(b>>0,b.toString(16)));d.a+=' (eventType: ';switch(this.d){case 1:{d.a+='SET';break}case 2:{d.a+='UNSET';break}case 3:{d.a+='ADD';break}case 5:{d.a+='ADD_MANY';break}case 4:{d.a+='REMOVE';break}case 6:{d.a+='REMOVE_MANY';break}case 7:{d.a+='MOVE';break}case 8:{d.a+='REMOVING_ADAPTER';break}case 9:{d.a+='RESOLVE';break}default:{Cfb(d,this.d);break}}ixd(this)&&(d.a+=', touch: true',d);d.a+=', position: ';Cfb(d,this.o<0?this.o<-2?-2-this.o-1:-1:this.o);d.a+=', notifier: ';Dfb(d,this.Ai());d.a+=', feature: ';Dfb(d,this._i());d.a+=', oldValue: ';Dfb(d,hxd(this));d.a+=', newValue: ';if(this.d==6&&JD(this.g,48)){c=BD(this.g,48);d.a+='[';for(a=0;a10){if(!this.b||this.c.j!=this.a){this.b=new Vqb(this);this.a=this.j}return Rqb(this.b,a)}else{return pud(this,a)}};_.ni=function Byd(){return true};_.a=0;var j4=mdb(Tte,'AbstractEList/1',953);bcb(295,73,Mje,Cyd);var k4=mdb(Tte,'AbstractEList/BasicIndexOutOfBoundsException',295);bcb(40,1,aie,Fyd);_.Nb=function Iyd(a){Rrb(this,a)};_.mj=function Gyd(){if(this.i.j!=this.f){throw vbb(new Apb)}};_.nj=function Hyd(){return Dyd(this)};_.Ob=function Jyd(){return this.e!=this.i.gc()};_.Pb=function Kyd(){return this.nj()};_.Qb=function Lyd(){Eyd(this)};_.e=0;_.f=0;_.g=-1;var l4=mdb(Tte,'AbstractEList/EIterator',40);bcb(278,40,jie,Oyd,Pyd);_.Qb=function Xyd(){Eyd(this)};_.Rb=function Qyd(a){Myd(this,a)};_.oj=function Ryd(){var b;try{b=this.d.Xb(--this.e);this.mj();this.g=this.e;return b}catch(a){a=ubb(a);if(JD(a,73)){this.mj();throw vbb(new utb)}else throw vbb(a)}};_.pj=function Syd(a){Nyd(this,a)};_.Sb=function Tyd(){return this.e!=0};_.Tb=function Uyd(){return this.e};_.Ub=function Vyd(){return this.oj()};_.Vb=function Wyd(){return this.e-1};_.Wb=function Yyd(a){this.pj(a)};var m4=mdb(Tte,'AbstractEList/EListIterator',278);bcb(341,40,aie,$yd);_.nj=function _yd(){return Zyd(this)};_.Qb=function azd(){throw vbb(new bgb)};var n4=mdb(Tte,'AbstractEList/NonResolvingEIterator',341);bcb(385,278,jie,bzd,czd);_.Rb=function dzd(a){throw vbb(new bgb)};_.nj=function ezd(){var b;try{b=this.c.ki(this.e);this.mj();this.g=this.e++;return b}catch(a){a=ubb(a);if(JD(a,73)){this.mj();throw vbb(new utb)}else throw vbb(a)}};_.oj=function fzd(){var b;try{b=this.c.ki(--this.e);this.mj();this.g=this.e;return b}catch(a){a=ubb(a);if(JD(a,73)){this.mj();throw vbb(new utb)}else throw vbb(a)}};_.Qb=function gzd(){throw vbb(new bgb)};_.Wb=function hzd(a){throw vbb(new bgb)};var o4=mdb(Tte,'AbstractEList/NonResolvingEListIterator',385);bcb(1982,67,ive);_.Vh=function pzd(a,b){var c,d,e,f,g,h,i,j,k,l,m;e=b.gc();if(e!=0){j=BD(Ajd(this.a,4),126);k=j==null?0:j.length;m=k+e;d=nzd(this,m);l=k-a;l>0&&$fb(j,a,d,a+e,l);i=b.Kc();for(g=0;gc)throw vbb(new Cyd(a,c));return new Yzd(this,a)};_.$b=function wzd(){var a,b;++this.j;a=BD(Ajd(this.a,4),126);b=a==null?0:a.length;b0d(this,null);Atd(this,b,a)};_.Hc=function xzd(a){var b,c,d,e,f;b=BD(Ajd(this.a,4),126);if(b!=null){if(a!=null){for(d=b,e=0,f=d.length;e=c)throw vbb(new Cyd(a,c));return b[a]};_.Xc=function zzd(a){var b,c,d;b=BD(Ajd(this.a,4),126);if(b!=null){if(a!=null){for(c=0,d=b.length;cc)throw vbb(new Cyd(a,c));return new Qzd(this,a)};_.ii=function Ezd(a,b){var c,d,e;c=mzd(this);e=c==null?0:c.length;if(a>=e)throw vbb(new qcb(lue+a+mue+e));if(b>=e)throw vbb(new qcb(nue+b+mue+e));d=c[b];if(a!=b){a0&&$fb(a,0,b,0,c);return b};_.Qc=function Kzd(a){var b,c,d;b=BD(Ajd(this.a,4),126);d=b==null?0:b.length;if(d>0){if(a.lengthd&&NC(a,d,null);return a};var jzd;var v4=mdb(Tte,'ArrayDelegatingEList',1982);bcb(1038,40,aie,Lzd);_.mj=function Mzd(){if(this.b.j!=this.f||PD(BD(Ajd(this.b.a,4),126))!==PD(this.a)){throw vbb(new Apb)}};_.Qb=function Nzd(){Eyd(this);this.a=BD(Ajd(this.b.a,4),126)};var r4=mdb(Tte,'ArrayDelegatingEList/EIterator',1038);bcb(706,278,jie,Pzd,Qzd);_.mj=function Rzd(){if(this.b.j!=this.f||PD(BD(Ajd(this.b.a,4),126))!==PD(this.a)){throw vbb(new Apb)}};_.pj=function Szd(a){Nyd(this,a);this.a=BD(Ajd(this.b.a,4),126)};_.Qb=function Tzd(){Eyd(this);this.a=BD(Ajd(this.b.a,4),126)};var s4=mdb(Tte,'ArrayDelegatingEList/EListIterator',706);bcb(1039,341,aie,Uzd);_.mj=function Vzd(){if(this.b.j!=this.f||PD(BD(Ajd(this.b.a,4),126))!==PD(this.a)){throw vbb(new Apb)}};var t4=mdb(Tte,'ArrayDelegatingEList/NonResolvingEIterator',1039);bcb(707,385,jie,Xzd,Yzd);_.mj=function Zzd(){if(this.b.j!=this.f||PD(BD(Ajd(this.b.a,4),126))!==PD(this.a)){throw vbb(new Apb)}};var u4=mdb(Tte,'ArrayDelegatingEList/NonResolvingEListIterator',707);bcb(606,295,Mje,$zd);var w4=mdb(Tte,'BasicEList/BasicIndexOutOfBoundsException',606);bcb(696,63,oue,_zd);_.Vc=function aAd(a,b){throw vbb(new bgb)};_.Fc=function bAd(a){throw vbb(new bgb)};_.Wc=function cAd(a,b){throw vbb(new bgb)};_.Gc=function dAd(a){throw vbb(new bgb)};_.$b=function eAd(){throw vbb(new bgb)};_.qi=function fAd(a){throw vbb(new bgb)};_.Kc=function gAd(){return this.Zh()};_.Yc=function hAd(){return this.$h()};_.Zc=function iAd(a){return this._h(a)};_.ii=function jAd(a,b){throw vbb(new bgb)};_.ji=function kAd(a,b){throw vbb(new bgb)};_.$c=function lAd(a){throw vbb(new bgb)};_.Mc=function mAd(a){throw vbb(new bgb)};_._c=function nAd(a,b){throw vbb(new bgb)};var x4=mdb(Tte,'BasicEList/UnmodifiableEList',696);bcb(705,1,{3:1,20:1,14:1,15:1,58:1,589:1});_.Vc=function OAd(a,b){oAd(this,a,BD(b,42))};_.Fc=function PAd(a){return pAd(this,BD(a,42))};_.Jc=function XAd(a){reb(this,a)};_.Xb=function YAd(a){return BD(qud(this.c,a),133)};_.ii=function fBd(a,b){return BD(this.c.ii(a,b),42)};_.ji=function gBd(a,b){GAd(this,a,BD(b,42))};_.Lc=function jBd(){return new YAb(null,new Kub(this,16))};_.$c=function kBd(a){return BD(this.c.$c(a),42)};_._c=function mBd(a,b){return MAd(this,a,BD(b,42))};_.ad=function oBd(a){ktb(this,a)};_.Nc=function pBd(){return new Kub(this,16)};_.Oc=function qBd(){return new YAb(null,new Kub(this,16))};_.Wc=function QAd(a,b){return this.c.Wc(a,b)};_.Gc=function RAd(a){return this.c.Gc(a)};_.$b=function SAd(){this.c.$b()};_.Hc=function TAd(a){return this.c.Hc(a)};_.Ic=function UAd(a){return Be(this.c,a)};_.qj=function VAd(){var a,b,c;if(this.d==null){this.d=KC(y4,jve,63,2*this.f+1,0,1);c=this.e;this.f=0;for(b=this.c.Kc();b.e!=b.i.gc();){a=BD(b.nj(),133);uAd(this,a)}this.e=c}};_.Fb=function WAd(a){return zAd(this,a)};_.Hb=function ZAd(){return Etd(this.c)};_.Xc=function $Ad(a){return this.c.Xc(a)};_.rj=function _Ad(){this.c=new yBd(this)};_.dc=function aBd(){return this.f==0};_.Kc=function bBd(){return this.c.Kc()};_.Yc=function cBd(){return this.c.Yc()};_.Zc=function dBd(a){return this.c.Zc(a)};_.sj=function eBd(){return FAd(this)};_.tj=function hBd(a,b,c){return new zCd(a,b,c)};_.uj=function iBd(){return new EBd};_.Mc=function lBd(a){return JAd(this,a)};_.gc=function nBd(){return this.f};_.bd=function rBd(a,b){return new Jib(this.c,a,b)};_.Pc=function sBd(){return this.c.Pc()};_.Qc=function tBd(a){return this.c.Qc(a)};_.Ib=function uBd(){return Htd(this.c)};_.e=0;_.f=0;var L4=mdb(Tte,'BasicEMap',705);bcb(1033,63,oue,yBd);_.bi=function zBd(a,b){vBd(this,BD(b,133))};_.ei=function BBd(a,b,c){var d;++(d=this,BD(b,133),d).a.e};_.fi=function CBd(a,b){wBd(this,BD(b,133))};_.gi=function DBd(a,b,c){xBd(this,BD(b,133),BD(c,133))};_.di=function ABd(a,b){tAd(this.a)};var z4=mdb(Tte,'BasicEMap/1',1033);bcb(1034,63,oue,EBd);_.ri=function FBd(a){return KC(I4,kve,612,a,0,1)};var A4=mdb(Tte,'BasicEMap/2',1034);bcb(1035,eie,fie,GBd);_.$b=function HBd(){this.a.c.$b()};_.Hc=function IBd(a){return qAd(this.a,a)};_.Kc=function JBd(){return this.a.f==0?(LCd(),KCd.a):new dCd(this.a)};_.Mc=function KBd(a){var b;b=this.a.f;LAd(this.a,a);return this.a.f!=b};_.gc=function LBd(){return this.a.f};var B4=mdb(Tte,'BasicEMap/3',1035);bcb(1036,28,die,MBd);_.$b=function NBd(){this.a.c.$b()};_.Hc=function OBd(a){return rAd(this.a,a)};_.Kc=function PBd(){return this.a.f==0?(LCd(),KCd.a):new fCd(this.a)};_.gc=function QBd(){return this.a.f};var C4=mdb(Tte,'BasicEMap/4',1036);bcb(1037,eie,fie,SBd);_.$b=function TBd(){this.a.c.$b()};_.Hc=function UBd(a){var b,c,d,e,f,g,h,i,j;if(this.a.f>0&&JD(a,42)){this.a.qj();i=BD(a,42);h=i.cd();e=h==null?0:tb(h);f=DAd(this.a,e);b=this.a.d[f];if(b){c=BD(b.g,367);j=b.i;for(g=0;g'+this.c};_.a=0;var I4=mdb(Tte,'BasicEMap/EntryImpl',612);bcb(536,1,{},JCd);var K4=mdb(Tte,'BasicEMap/View',536);var KCd;bcb(768,1,{});_.Fb=function ZCd(a){return At((mmb(),jmb),a)};_.Hb=function $Cd(){return qmb((mmb(),jmb))};_.Ib=function _Cd(){return Fe((mmb(),jmb))};var Q4=mdb(Tte,'ECollections/BasicEmptyUnmodifiableEList',768);bcb(1312,1,jie,aDd);_.Nb=function cDd(a){Rrb(this,a)};_.Rb=function bDd(a){throw vbb(new bgb)};_.Ob=function dDd(){return false};_.Sb=function eDd(){return false};_.Pb=function fDd(){throw vbb(new utb)};_.Tb=function gDd(){return 0};_.Ub=function hDd(){throw vbb(new utb)};_.Vb=function iDd(){return -1};_.Qb=function jDd(){throw vbb(new bgb)};_.Wb=function kDd(a){throw vbb(new bgb)};var P4=mdb(Tte,'ECollections/BasicEmptyUnmodifiableEList/1',1312);bcb(1310,768,{20:1,14:1,15:1,58:1},lDd);_.Vc=function mDd(a,b){OCd()};_.Fc=function nDd(a){return PCd()};_.Wc=function oDd(a,b){return QCd()};_.Gc=function pDd(a){return RCd()};_.$b=function qDd(){SCd()};_.Hc=function rDd(a){return false};_.Ic=function sDd(a){return false};_.Jc=function tDd(a){reb(this,a)};_.Xb=function uDd(a){return wmb((mmb(),jmb,a)),null};_.Xc=function vDd(a){return -1};_.dc=function wDd(){return true};_.Kc=function xDd(){return this.a};_.Yc=function yDd(){return this.a};_.Zc=function zDd(a){return this.a};_.ii=function ADd(a,b){return TCd()};_.ji=function BDd(a,b){UCd()};_.Lc=function CDd(){return new YAb(null,new Kub(this,16))};_.$c=function DDd(a){return VCd()};_.Mc=function EDd(a){return WCd()};_._c=function FDd(a,b){return XCd()};_.gc=function GDd(){return 0};_.ad=function HDd(a){ktb(this,a)};_.Nc=function IDd(){return new Kub(this,16)};_.Oc=function JDd(){return new YAb(null,new Kub(this,16))};_.bd=function KDd(a,b){return mmb(),new Jib(jmb,a,b)};_.Pc=function LDd(){return De((mmb(),jmb))};_.Qc=function MDd(a){return mmb(),Ee(jmb,a)};var R4=mdb(Tte,'ECollections/EmptyUnmodifiableEList',1310);bcb(1311,768,{20:1,14:1,15:1,58:1,589:1},NDd);_.Vc=function ODd(a,b){OCd()};_.Fc=function PDd(a){return PCd()};_.Wc=function QDd(a,b){return QCd()};_.Gc=function RDd(a){return RCd()};_.$b=function SDd(){SCd()};_.Hc=function TDd(a){return false};_.Ic=function UDd(a){return false};_.Jc=function VDd(a){reb(this,a)};_.Xb=function WDd(a){return wmb((mmb(),jmb,a)),null};_.Xc=function XDd(a){return -1};_.dc=function YDd(){return true};_.Kc=function ZDd(){return this.a};_.Yc=function $Dd(){return this.a};_.Zc=function _Dd(a){return this.a};_.ii=function bEd(a,b){return TCd()};_.ji=function cEd(a,b){UCd()};_.Lc=function dEd(){return new YAb(null,new Kub(this,16))};_.$c=function eEd(a){return VCd()};_.Mc=function fEd(a){return WCd()};_._c=function gEd(a,b){return XCd()};_.gc=function hEd(){return 0};_.ad=function iEd(a){ktb(this,a)};_.Nc=function jEd(){return new Kub(this,16)};_.Oc=function kEd(){return new YAb(null,new Kub(this,16))};_.bd=function lEd(a,b){return mmb(),new Jib(jmb,a,b)};_.Pc=function mEd(){return De((mmb(),jmb))};_.Qc=function nEd(a){return mmb(),Ee(jmb,a)};_.sj=function aEd(){return mmb(),mmb(),kmb};var S4=mdb(Tte,'ECollections/EmptyUnmodifiableEMap',1311);var U4=odb(Tte,'Enumerator');var oEd;bcb(281,1,{281:1},NEd);_.Fb=function REd(a){var b;if(this===a)return true;if(!JD(a,281))return false;b=BD(a,281);return this.f==b.f&&TEd(this.i,b.i)&&SEd(this.a,(this.f&256)!=0?(b.f&256)!=0?b.a:null:(b.f&256)!=0?null:b.a)&&SEd(this.d,b.d)&&SEd(this.g,b.g)&&SEd(this.e,b.e)&&KEd(this,b)};_.Hb=function WEd(){return this.f};_.Ib=function cFd(){return LEd(this)};_.f=0;var sEd=0,tEd=0,uEd=0,vEd=0,wEd=0,xEd=0,yEd=0,zEd=0,AEd=0,BEd,CEd=0,DEd=0,EEd=0,FEd=0,GEd,HEd;var Z4=mdb(Tte,'URI',281);bcb(1091,43,fke,mFd);_.zc=function nFd(a,b){return BD(Shb(this,GD(a),BD(b,281)),281)};var Y4=mdb(Tte,'URI/URICache',1091);bcb(497,63,oue,oFd,pFd);_.hi=function qFd(){return true};var $4=mdb(Tte,'UniqueEList',497);bcb(581,60,Tie,rFd);var _4=mdb(Tte,'WrappedException',581);var a5=odb(Vse,nve);var v5=odb(Vse,ove);var t5=odb(Vse,pve);var b5=odb(Vse,qve);var d5=odb(Vse,rve);var c5=odb(Vse,'EClass');var f5=odb(Vse,'EDataType');var sFd;bcb(1183,43,fke,vFd);_.xc=function wFd(a){return ND(a)?Phb(this,a):Wd(irb(this.f,a))};var e5=mdb(Vse,'EDataType/Internal/ConversionDelegate/Factory/Registry/Impl',1183);var h5=odb(Vse,'EEnum');var g5=odb(Vse,sve);var j5=odb(Vse,tve);var n5=odb(Vse,uve);var xFd;var p5=odb(Vse,vve);var q5=odb(Vse,wve);bcb(1029,1,{},BFd);_.Ib=function CFd(){return 'NIL'};var r5=mdb(Vse,'EStructuralFeature/Internal/DynamicValueHolder/1',1029);var DFd;bcb(1028,43,fke,GFd);_.xc=function HFd(a){return ND(a)?Phb(this,a):Wd(irb(this.f,a))};var s5=mdb(Vse,'EStructuralFeature/Internal/SettingDelegate/Factory/Registry/Impl',1028);var u5=odb(Vse,xve);var w5=odb(Vse,'EValidator/PatternMatcher');var IFd;var KFd;var MFd;var OFd,PFd,QFd,RFd,SFd,TFd,UFd,VFd,WFd,XFd,YFd,ZFd,$Fd,_Fd,aGd,bGd,cGd,dGd,eGd,fGd,gGd,hGd,iGd;var E9=odb(yve,'FeatureMap/Entry');bcb(535,1,{72:1},kGd);_.ak=function lGd(){return this.a};_.dd=function mGd(){return this.b};var x5=mdb(qte,'BasicEObjectImpl/1',535);bcb(1027,1,zve,nGd);_.Wj=function oGd(a){return hid(this.a,this.b,a)};_.fj=function pGd(){return nid(this.a,this.b)};_.Wb=function qGd(a){zid(this.a,this.b,a)};_.Xj=function rGd(){Did(this.a,this.b)};var y5=mdb(qte,'BasicEObjectImpl/4',1027);bcb(1983,1,{108:1});_.bk=function uGd(a){this.e=a==0?sGd:KC(SI,Uhe,1,a,5,1)};_.Ch=function vGd(a){return this.e[a]};_.Dh=function wGd(a,b){this.e[a]=b};_.Eh=function xGd(a){this.e[a]=null};_.ck=function yGd(){return this.c};_.dk=function zGd(){throw vbb(new bgb)};_.ek=function AGd(){throw vbb(new bgb)};_.fk=function BGd(){return this.d};_.gk=function CGd(){return this.e!=null};_.hk=function DGd(a){this.c=a};_.ik=function EGd(a){throw vbb(new bgb)};_.jk=function FGd(a){throw vbb(new bgb)};_.kk=function GGd(a){this.d=a};var sGd;var z5=mdb(qte,'BasicEObjectImpl/EPropertiesHolderBaseImpl',1983);bcb(185,1983,{108:1},HGd);_.dk=function IGd(){return this.a};_.ek=function JGd(){return this.b};_.ik=function KGd(a){this.a=a};_.jk=function LGd(a){this.b=a};var A5=mdb(qte,'BasicEObjectImpl/EPropertiesHolderImpl',185);bcb(506,97,pte,MGd);_.Kg=function NGd(){return this.f};_.Pg=function OGd(){return this.k};_.Rg=function PGd(a,b){this.g=a;this.i=b};_.Tg=function QGd(){return (this.j&2)==0?this.zh():this.ph().ck()};_.Vg=function RGd(){return this.i};_.Mg=function SGd(){return (this.j&1)!=0};_.eh=function TGd(){return this.g};_.kh=function UGd(){return (this.j&4)!=0};_.ph=function VGd(){return !this.k&&(this.k=new HGd),this.k};_.th=function WGd(a){this.ph().hk(a);a?(this.j|=2):(this.j&=-3)};_.vh=function XGd(a){this.ph().jk(a);a?(this.j|=4):(this.j&=-5)};_.zh=function YGd(){return (NFd(),MFd).S};_.i=0;_.j=1;var l6=mdb(qte,'EObjectImpl',506);bcb(780,506,{105:1,92:1,90:1,56:1,108:1,49:1,97:1},_Gd);_.Ch=function aHd(a){return this.e[a]};_.Dh=function bHd(a,b){this.e[a]=b};_.Eh=function cHd(a){this.e[a]=null};_.Tg=function dHd(){return this.d};_.Yg=function eHd(a){return bLd(this.d,a)};_.$g=function fHd(){return this.d};_.dh=function gHd(){return this.e!=null};_.ph=function hHd(){!this.k&&(this.k=new vHd);return this.k};_.th=function iHd(a){this.d=a};_.yh=function jHd(){var a;if(this.e==null){a=aLd(this.d);this.e=a==0?ZGd:KC(SI,Uhe,1,a,5,1)}return this};_.Ah=function kHd(){return 0};var ZGd;var E5=mdb(qte,'DynamicEObjectImpl',780);bcb(1376,780,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1},lHd);_.Fb=function nHd(a){return this===a};_.Hb=function rHd(){return FCb(this)};_.th=function mHd(a){this.d=a;this.b=YKd(a,'key');this.c=YKd(a,Bte)};_.Sh=function oHd(){var a;if(this.a==-1){a=iid(this,this.b);this.a=a==null?0:tb(a)}return this.a};_.cd=function pHd(){return iid(this,this.b)};_.dd=function qHd(){return iid(this,this.c)};_.Th=function sHd(a){this.a=a};_.Uh=function tHd(a){zid(this,this.b,a)};_.ed=function uHd(a){var b;b=iid(this,this.c);zid(this,this.c,a);return b};_.a=0;var C5=mdb(qte,'DynamicEObjectImpl/BasicEMapEntry',1376);bcb(1377,1,{108:1},vHd);_.bk=function wHd(a){throw vbb(new bgb)};_.Ch=function xHd(a){throw vbb(new bgb)};_.Dh=function yHd(a,b){throw vbb(new bgb)};_.Eh=function zHd(a){throw vbb(new bgb)};_.ck=function AHd(){throw vbb(new bgb)};_.dk=function BHd(){return this.a};_.ek=function CHd(){return this.b};_.fk=function DHd(){return this.c};_.gk=function EHd(){throw vbb(new bgb)};_.hk=function FHd(a){throw vbb(new bgb)};_.ik=function GHd(a){this.a=a};_.jk=function HHd(a){this.b=a};_.kk=function IHd(a){this.c=a};var D5=mdb(qte,'DynamicEObjectImpl/DynamicEPropertiesHolderImpl',1377);bcb(510,150,{105:1,92:1,90:1,590:1,147:1,56:1,108:1,49:1,97:1,510:1,150:1,114:1,115:1},RHd);_.Qg=function SHd(a){return KHd(this,a)};_._g=function THd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.d;case 2:return c?(!this.b&&(this.b=new sId((jGd(),fGd),x6,this)),this.b):(!this.b&&(this.b=new sId((jGd(),fGd),x6,this)),FAd(this.b));case 3:return MHd(this);case 4:return !this.a&&(this.a=new xMd(m5,this,4)),this.a;case 5:return !this.c&&(this.c=new _4d(m5,this,5)),this.c;}return bid(this,a-aLd((jGd(),OFd)),XKd((d=BD(Ajd(this,16),26),!d?OFd:d),a),b,c)};_.hh=function UHd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 3:!!this.Cb&&(c=(e=this.Db>>16,e>=0?KHd(this,c):this.Cb.ih(this,-1-e,null,c)));return JHd(this,BD(a,147),c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),OFd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),OFd)),a,c)};_.jh=function VHd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 2:return !this.b&&(this.b=new sId((jGd(),fGd),x6,this)),bId(this.b,a,c);case 3:return JHd(this,null,c);case 4:return !this.a&&(this.a=new xMd(m5,this,4)),Txd(this.a,a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),OFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),OFd)),a,c)};_.lh=function WHd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.d!=null;case 2:return !!this.b&&this.b.f!=0;case 3:return !!MHd(this);case 4:return !!this.a&&this.a.i!=0;case 5:return !!this.c&&this.c.i!=0;}return cid(this,a-aLd((jGd(),OFd)),XKd((b=BD(Ajd(this,16),26),!b?OFd:b),a))};_.sh=function XHd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:OHd(this,GD(b));return;case 2:!this.b&&(this.b=new sId((jGd(),fGd),x6,this));cId(this.b,b);return;case 3:NHd(this,BD(b,147));return;case 4:!this.a&&(this.a=new xMd(m5,this,4));Uxd(this.a);!this.a&&(this.a=new xMd(m5,this,4));ytd(this.a,BD(b,14));return;case 5:!this.c&&(this.c=new _4d(m5,this,5));Uxd(this.c);!this.c&&(this.c=new _4d(m5,this,5));ytd(this.c,BD(b,14));return;}did(this,a-aLd((jGd(),OFd)),XKd((c=BD(Ajd(this,16),26),!c?OFd:c),a),b)};_.zh=function YHd(){return jGd(),OFd};_.Bh=function ZHd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:PHd(this,null);return;case 2:!this.b&&(this.b=new sId((jGd(),fGd),x6,this));this.b.c.$b();return;case 3:NHd(this,null);return;case 4:!this.a&&(this.a=new xMd(m5,this,4));Uxd(this.a);return;case 5:!this.c&&(this.c=new _4d(m5,this,5));Uxd(this.c);return;}eid(this,a-aLd((jGd(),OFd)),XKd((b=BD(Ajd(this,16),26),!b?OFd:b),a))};_.Ib=function $Hd(){return QHd(this)};_.d=null;var G5=mdb(qte,'EAnnotationImpl',510);bcb(151,705,Ave,dId);_.Xh=function eId(a,b){_Hd(this,a,BD(b,42))};_.lk=function fId(a,b){return aId(this,BD(a,42),b)};_.pi=function gId(a){return BD(BD(this.c,69).pi(a),133)};_.Zh=function hId(){return BD(this.c,69).Zh()};_.$h=function iId(){return BD(this.c,69).$h()};_._h=function jId(a){return BD(this.c,69)._h(a)};_.mk=function kId(a,b){return bId(this,a,b)};_.Wj=function lId(a){return BD(this.c,76).Wj(a)};_.rj=function mId(){};_.fj=function nId(){return BD(this.c,76).fj()};_.tj=function oId(a,b,c){var d;d=BD(bKd(this.b).Nh().Jh(this.b),133);d.Th(a);d.Uh(b);d.ed(c);return d};_.uj=function pId(){return new W5d(this)};_.Wb=function qId(a){cId(this,a)};_.Xj=function rId(){BD(this.c,76).Xj()};var y9=mdb(yve,'EcoreEMap',151);bcb(158,151,Ave,sId);_.qj=function tId(){var a,b,c,d,e,f;if(this.d==null){f=KC(y4,jve,63,2*this.f+1,0,1);for(c=this.c.Kc();c.e!=c.i.gc();){b=BD(c.nj(),133);d=b.Sh();e=(d&Ohe)%f.length;a=f[e];!a&&(a=f[e]=new W5d(this));a.Fc(b)}this.d=f}};var F5=mdb(qte,'EAnnotationImpl/1',158);bcb(284,438,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,472:1,49:1,97:1,150:1,284:1,114:1,115:1});_._g=function GId(a,b,c){var d,e;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),this.$j()?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;}return bid(this,a-aLd(this.zh()),XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),a),b,c)};_.jh=function HId(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 9:return vId(this,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),e.Nj().Rj(this,yjd(this),b-aLd(this.zh()),a,c)};_.lh=function IId(a){var b,c;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return this.$j();case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);}return cid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.sh=function JId(a,b){var c,d;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:this.Lh(GD(b));return;case 2:BId(this,Ccb(DD(b)));return;case 3:CId(this,Ccb(DD(b)));return;case 4:AId(this,BD(b,19).a);return;case 5:this.ok(BD(b,19).a);return;case 8:yId(this,BD(b,138));return;case 9:d=xId(this,BD(b,87),null);!!d&&d.Fi();return;}did(this,a-aLd(this.zh()),XKd((c=BD(Ajd(this,16),26),!c?this.zh():c),a),b)};_.zh=function KId(){return jGd(),hGd};_.Bh=function LId(a){var b,c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:this.Lh(null);return;case 2:BId(this,true);return;case 3:CId(this,true);return;case 4:AId(this,0);return;case 5:this.ok(1);return;case 8:yId(this,null);return;case 9:c=xId(this,null,null);!!c&&c.Fi();return;}eid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.Gh=function MId(){wId(this);this.Bb|=1};_.Yj=function NId(){return wId(this)};_.Zj=function OId(){return this.t};_.$j=function PId(){var a;return a=this.t,a>1||a==-1};_.hi=function QId(){return (this.Bb&512)!=0};_.nk=function RId(a,b){return zId(this,a,b)};_.ok=function SId(a){DId(this,a)};_.Ib=function TId(){return EId(this)};_.s=0;_.t=1;var v7=mdb(qte,'ETypedElementImpl',284);bcb(449,284,{105:1,92:1,90:1,147:1,191:1,56:1,170:1,66:1,108:1,472:1,49:1,97:1,150:1,449:1,284:1,114:1,115:1,677:1});_.Qg=function iJd(a){return UId(this,a)};_._g=function jJd(a,b,c){var d,e;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),this.$j()?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;case 10:return Bcb(),(this.Bb&zte)!=0?true:false;case 11:return Bcb(),(this.Bb&Dve)!=0?true:false;case 12:return Bcb(),(this.Bb&Rje)!=0?true:false;case 13:return this.j;case 14:return VId(this);case 15:return Bcb(),(this.Bb&Cve)!=0?true:false;case 16:return Bcb(),(this.Bb&oie)!=0?true:false;case 17:return WId(this);}return bid(this,a-aLd(this.zh()),XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),a),b,c)};_.hh=function kJd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 17:!!this.Cb&&(c=(e=this.Db>>16,e>=0?UId(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,17,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),f.Nj().Qj(this,yjd(this),b-aLd(this.zh()),a,c)};_.jh=function lJd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 9:return vId(this,c);case 17:return _hd(this,null,17,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),e.Nj().Rj(this,yjd(this),b-aLd(this.zh()),a,c)};_.lh=function mJd(a){var b,c;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return this.$j();case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);case 10:return (this.Bb&zte)==0;case 11:return (this.Bb&Dve)!=0;case 12:return (this.Bb&Rje)!=0;case 13:return this.j!=null;case 14:return VId(this)!=null;case 15:return (this.Bb&Cve)!=0;case 16:return (this.Bb&oie)!=0;case 17:return !!WId(this);}return cid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.sh=function nJd(a,b){var c,d;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:cJd(this,GD(b));return;case 2:BId(this,Ccb(DD(b)));return;case 3:CId(this,Ccb(DD(b)));return;case 4:AId(this,BD(b,19).a);return;case 5:this.ok(BD(b,19).a);return;case 8:yId(this,BD(b,138));return;case 9:d=xId(this,BD(b,87),null);!!d&&d.Fi();return;case 10:ZId(this,Ccb(DD(b)));return;case 11:fJd(this,Ccb(DD(b)));return;case 12:dJd(this,Ccb(DD(b)));return;case 13:$Id(this,GD(b));return;case 15:eJd(this,Ccb(DD(b)));return;case 16:aJd(this,Ccb(DD(b)));return;}did(this,a-aLd(this.zh()),XKd((c=BD(Ajd(this,16),26),!c?this.zh():c),a),b)};_.zh=function oJd(){return jGd(),gGd};_.Bh=function pJd(a){var b,c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,88)&&XMd($Kd(BD(this.Cb,88)),4);pnd(this,null);return;case 2:BId(this,true);return;case 3:CId(this,true);return;case 4:AId(this,0);return;case 5:this.ok(1);return;case 8:yId(this,null);return;case 9:c=xId(this,null,null);!!c&&c.Fi();return;case 10:ZId(this,true);return;case 11:fJd(this,false);return;case 12:dJd(this,false);return;case 13:this.i=null;_Id(this,null);return;case 15:eJd(this,false);return;case 16:aJd(this,false);return;}eid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.Gh=function qJd(){a2d(q1d((O6d(),M6d),this));wId(this);this.Bb|=1};_.Gj=function rJd(){return this.f};_.zj=function sJd(){return VId(this)};_.Hj=function tJd(){return WId(this)};_.Lj=function uJd(){return null};_.pk=function vJd(){return this.k};_.aj=function wJd(){return this.n};_.Mj=function xJd(){return XId(this)};_.Nj=function yJd(){var a,b,c,d,e,f,g,h,i;if(!this.p){c=WId(this);(c.i==null&&TKd(c),c.i).length;d=this.Lj();!!d&&aLd(WId(d));e=wId(this);g=e.Bj();a=!g?null:(g.i&1)!=0?g==sbb?wI:g==WD?JI:g==VD?FI:g==UD?BI:g==XD?MI:g==rbb?UI:g==SD?xI:yI:g;b=VId(this);h=e.zj();n6d(this);(this.Bb&oie)!=0&&(!!(f=t1d((O6d(),M6d),c))&&f!=this||!!(f=_1d(q1d(M6d,this))))?(this.p=new zVd(this,f)):this.$j()?this.rk()?!d?(this.Bb&Cve)!=0?!a?this.sk()?(this.p=new KVd(42,this)):(this.p=new KVd(0,this)):a==CK?(this.p=new IVd(50,J4,this)):this.sk()?(this.p=new IVd(43,a,this)):(this.p=new IVd(1,a,this)):!a?this.sk()?(this.p=new KVd(44,this)):(this.p=new KVd(2,this)):a==CK?(this.p=new IVd(41,J4,this)):this.sk()?(this.p=new IVd(45,a,this)):(this.p=new IVd(3,a,this)):(this.Bb&Cve)!=0?!a?this.sk()?(this.p=new LVd(46,this,d)):(this.p=new LVd(4,this,d)):this.sk()?(this.p=new JVd(47,a,this,d)):(this.p=new JVd(5,a,this,d)):!a?this.sk()?(this.p=new LVd(48,this,d)):(this.p=new LVd(6,this,d)):this.sk()?(this.p=new JVd(49,a,this,d)):(this.p=new JVd(7,a,this,d)):JD(e,148)?a==E9?(this.p=new KVd(40,this)):(this.Bb&512)!=0?(this.Bb&Cve)!=0?!a?(this.p=new KVd(8,this)):(this.p=new IVd(9,a,this)):!a?(this.p=new KVd(10,this)):(this.p=new IVd(11,a,this)):(this.Bb&Cve)!=0?!a?(this.p=new KVd(12,this)):(this.p=new IVd(13,a,this)):!a?(this.p=new KVd(14,this)):(this.p=new IVd(15,a,this)):!d?this.sk()?(this.Bb&Cve)!=0?!a?(this.p=new KVd(16,this)):(this.p=new IVd(17,a,this)):!a?(this.p=new KVd(18,this)):(this.p=new IVd(19,a,this)):(this.Bb&Cve)!=0?!a?(this.p=new KVd(20,this)):(this.p=new IVd(21,a,this)):!a?(this.p=new KVd(22,this)):(this.p=new IVd(23,a,this)):(i=d.t,i>1||i==-1?this.sk()?(this.Bb&Cve)!=0?!a?(this.p=new LVd(24,this,d)):(this.p=new JVd(25,a,this,d)):!a?(this.p=new LVd(26,this,d)):(this.p=new JVd(27,a,this,d)):(this.Bb&Cve)!=0?!a?(this.p=new LVd(28,this,d)):(this.p=new JVd(29,a,this,d)):!a?(this.p=new LVd(30,this,d)):(this.p=new JVd(31,a,this,d)):this.sk()?(this.Bb&Cve)!=0?!a?(this.p=new LVd(32,this,d)):(this.p=new JVd(33,a,this,d)):!a?(this.p=new LVd(34,this,d)):(this.p=new JVd(35,a,this,d)):(this.Bb&Cve)!=0?!a?(this.p=new LVd(36,this,d)):(this.p=new JVd(37,a,this,d)):!a?(this.p=new LVd(38,this,d)):(this.p=new JVd(39,a,this,d))):this.qk()?this.sk()?(this.p=new kWd(BD(e,26),this,d)):(this.p=new cWd(BD(e,26),this,d)):JD(e,148)?a==E9?(this.p=new KVd(40,this)):(this.Bb&Cve)!=0?!a?(this.p=new jXd(BD(e,148),b,h,this)):(this.p=new lXd(b,h,this,(CWd(),g==WD?yWd:g==sbb?tWd:g==XD?zWd:g==VD?xWd:g==UD?wWd:g==rbb?BWd:g==SD?uWd:g==TD?vWd:AWd))):!a?(this.p=new cXd(BD(e,148),b,h,this)):(this.p=new eXd(b,h,this,(CWd(),g==WD?yWd:g==sbb?tWd:g==XD?zWd:g==VD?xWd:g==UD?wWd:g==rbb?BWd:g==SD?uWd:g==TD?vWd:AWd))):this.rk()?!d?(this.Bb&Cve)!=0?this.sk()?(this.p=new FXd(BD(e,26),this)):(this.p=new DXd(BD(e,26),this)):this.sk()?(this.p=new BXd(BD(e,26),this)):(this.p=new zXd(BD(e,26),this)):(this.Bb&Cve)!=0?this.sk()?(this.p=new NXd(BD(e,26),this,d)):(this.p=new LXd(BD(e,26),this,d)):this.sk()?(this.p=new JXd(BD(e,26),this,d)):(this.p=new HXd(BD(e,26),this,d)):this.sk()?!d?(this.Bb&Cve)!=0?(this.p=new RXd(BD(e,26),this)):(this.p=new PXd(BD(e,26),this)):(this.Bb&Cve)!=0?(this.p=new VXd(BD(e,26),this,d)):(this.p=new TXd(BD(e,26),this,d)):!d?(this.Bb&Cve)!=0?(this.p=new XXd(BD(e,26),this)):(this.p=new nXd(BD(e,26),this)):(this.Bb&Cve)!=0?(this.p=new _Xd(BD(e,26),this,d)):(this.p=new ZXd(BD(e,26),this,d))}return this.p};_.Ij=function zJd(){return (this.Bb&zte)!=0};_.qk=function AJd(){return false};_.rk=function BJd(){return false};_.Jj=function CJd(){return (this.Bb&oie)!=0};_.Oj=function DJd(){return YId(this)};_.sk=function EJd(){return false};_.Kj=function FJd(){return (this.Bb&Cve)!=0};_.tk=function GJd(a){this.k=a};_.Lh=function HJd(a){cJd(this,a)};_.Ib=function IJd(){return gJd(this)};_.e=false;_.n=0;var n7=mdb(qte,'EStructuralFeatureImpl',449);bcb(322,449,{105:1,92:1,90:1,34:1,147:1,191:1,56:1,170:1,66:1,108:1,472:1,49:1,97:1,322:1,150:1,449:1,284:1,114:1,115:1,677:1},OJd);_._g=function PJd(a,b,c){var d,e;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),LJd(this)?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;case 10:return Bcb(),(this.Bb&zte)!=0?true:false;case 11:return Bcb(),(this.Bb&Dve)!=0?true:false;case 12:return Bcb(),(this.Bb&Rje)!=0?true:false;case 13:return this.j;case 14:return VId(this);case 15:return Bcb(),(this.Bb&Cve)!=0?true:false;case 16:return Bcb(),(this.Bb&oie)!=0?true:false;case 17:return WId(this);case 18:return Bcb(),(this.Bb&ote)!=0?true:false;case 19:if(b)return KJd(this);return JJd(this);}return bid(this,a-aLd((jGd(),PFd)),XKd((d=BD(Ajd(this,16),26),!d?PFd:d),a),b,c)};_.lh=function QJd(a){var b,c;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return LJd(this);case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);case 10:return (this.Bb&zte)==0;case 11:return (this.Bb&Dve)!=0;case 12:return (this.Bb&Rje)!=0;case 13:return this.j!=null;case 14:return VId(this)!=null;case 15:return (this.Bb&Cve)!=0;case 16:return (this.Bb&oie)!=0;case 17:return !!WId(this);case 18:return (this.Bb&ote)!=0;case 19:return !!JJd(this);}return cid(this,a-aLd((jGd(),PFd)),XKd((b=BD(Ajd(this,16),26),!b?PFd:b),a))};_.sh=function RJd(a,b){var c,d;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:cJd(this,GD(b));return;case 2:BId(this,Ccb(DD(b)));return;case 3:CId(this,Ccb(DD(b)));return;case 4:AId(this,BD(b,19).a);return;case 5:NJd(this,BD(b,19).a);return;case 8:yId(this,BD(b,138));return;case 9:d=xId(this,BD(b,87),null);!!d&&d.Fi();return;case 10:ZId(this,Ccb(DD(b)));return;case 11:fJd(this,Ccb(DD(b)));return;case 12:dJd(this,Ccb(DD(b)));return;case 13:$Id(this,GD(b));return;case 15:eJd(this,Ccb(DD(b)));return;case 16:aJd(this,Ccb(DD(b)));return;case 18:MJd(this,Ccb(DD(b)));return;}did(this,a-aLd((jGd(),PFd)),XKd((c=BD(Ajd(this,16),26),!c?PFd:c),a),b)};_.zh=function SJd(){return jGd(),PFd};_.Bh=function TJd(a){var b,c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,88)&&XMd($Kd(BD(this.Cb,88)),4);pnd(this,null);return;case 2:BId(this,true);return;case 3:CId(this,true);return;case 4:AId(this,0);return;case 5:this.b=0;DId(this,1);return;case 8:yId(this,null);return;case 9:c=xId(this,null,null);!!c&&c.Fi();return;case 10:ZId(this,true);return;case 11:fJd(this,false);return;case 12:dJd(this,false);return;case 13:this.i=null;_Id(this,null);return;case 15:eJd(this,false);return;case 16:aJd(this,false);return;case 18:MJd(this,false);return;}eid(this,a-aLd((jGd(),PFd)),XKd((b=BD(Ajd(this,16),26),!b?PFd:b),a))};_.Gh=function UJd(){KJd(this);a2d(q1d((O6d(),M6d),this));wId(this);this.Bb|=1};_.$j=function VJd(){return LJd(this)};_.nk=function WJd(a,b){this.b=0;this.a=null;return zId(this,a,b)};_.ok=function XJd(a){NJd(this,a)};_.Ib=function YJd(){var a;if((this.Db&64)!=0)return gJd(this);a=new Jfb(gJd(this));a.a+=' (iD: ';Ffb(a,(this.Bb&ote)!=0);a.a+=')';return a.a};_.b=0;var H5=mdb(qte,'EAttributeImpl',322);bcb(351,438,{105:1,92:1,90:1,138:1,147:1,191:1,56:1,108:1,49:1,97:1,351:1,150:1,114:1,115:1,676:1});_.uk=function nKd(a){return a.Tg()==this};_.Qg=function oKd(a){return aKd(this,a)};_.Rg=function pKd(a,b){this.w=null;this.Db=b<<16|this.Db&255;this.Cb=a};_._g=function qKd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return this.D!=null?this.D:this.B;case 3:return dKd(this);case 4:return this.zj();case 5:return this.F;case 6:if(b)return bKd(this);return ZJd(this);case 7:return !this.A&&(this.A=new K4d(u5,this,7)),this.A;}return bid(this,a-aLd(this.zh()),XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),a),b,c)};_.hh=function rKd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 6:!!this.Cb&&(c=(e=this.Db>>16,e>=0?aKd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,6,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),f.Nj().Qj(this,yjd(this),b-aLd(this.zh()),a,c)};_.jh=function sKd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 6:return _hd(this,null,6,c);case 7:return !this.A&&(this.A=new K4d(u5,this,7)),Txd(this.A,a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),e.Nj().Rj(this,yjd(this),b-aLd(this.zh()),a,c)};_.lh=function tKd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.D!=null&&this.D==this.F;case 3:return !!dKd(this);case 4:return this.zj()!=null;case 5:return this.F!=null&&this.F!=this.D&&this.F!=this.B;case 6:return !!ZJd(this);case 7:return !!this.A&&this.A.i!=0;}return cid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.sh=function uKd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:lKd(this,GD(b));return;case 2:iKd(this,GD(b));return;case 5:kKd(this,GD(b));return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);!this.A&&(this.A=new K4d(u5,this,7));ytd(this.A,BD(b,14));return;}did(this,a-aLd(this.zh()),XKd((c=BD(Ajd(this,16),26),!c?this.zh():c),a),b)};_.zh=function vKd(){return jGd(),RFd};_.Bh=function wKd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,179)&&(BD(this.Cb,179).tb=null);pnd(this,null);return;case 2:$Jd(this,null);_Jd(this,this.D);return;case 5:kKd(this,null);return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);return;}eid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.yj=function xKd(){var a;return this.G==-1&&(this.G=(a=bKd(this),a?HLd(a.Mh(),this):-1)),this.G};_.zj=function yKd(){return null};_.Aj=function zKd(){return bKd(this)};_.vk=function AKd(){return this.v};_.Bj=function BKd(){return dKd(this)};_.Cj=function CKd(){return this.D!=null?this.D:this.B};_.Dj=function DKd(){return this.F};_.wj=function EKd(a){return fKd(this,a)};_.wk=function FKd(a){this.v=a};_.xk=function GKd(a){gKd(this,a)};_.yk=function HKd(a){this.C=a};_.Lh=function IKd(a){lKd(this,a)};_.Ib=function JKd(){return mKd(this)};_.C=null;_.D=null;_.G=-1;var Z5=mdb(qte,'EClassifierImpl',351);bcb(88,351,{105:1,92:1,90:1,26:1,138:1,147:1,191:1,56:1,108:1,49:1,97:1,88:1,351:1,150:1,473:1,114:1,115:1,676:1},hLd);_.uk=function iLd(a){return dLd(this,a.Tg())};_._g=function jLd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return this.D!=null?this.D:this.B;case 3:return dKd(this);case 4:return null;case 5:return this.F;case 6:if(b)return bKd(this);return ZJd(this);case 7:return !this.A&&(this.A=new K4d(u5,this,7)),this.A;case 8:return Bcb(),(this.Bb&256)!=0?true:false;case 9:return Bcb(),(this.Bb&512)!=0?true:false;case 10:return _Kd(this);case 11:return !this.q&&(this.q=new cUd(n5,this,11,10)),this.q;case 12:return OKd(this);case 13:return SKd(this);case 14:return SKd(this),this.r;case 15:return OKd(this),this.k;case 16:return PKd(this);case 17:return RKd(this);case 18:return TKd(this);case 19:return UKd(this);case 20:return OKd(this),this.o;case 21:return !this.s&&(this.s=new cUd(t5,this,21,17)),this.s;case 22:return VKd(this);case 23:return QKd(this);}return bid(this,a-aLd((jGd(),QFd)),XKd((d=BD(Ajd(this,16),26),!d?QFd:d),a),b,c)};_.hh=function kLd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 6:!!this.Cb&&(c=(e=this.Db>>16,e>=0?aKd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,6,c);case 11:return !this.q&&(this.q=new cUd(n5,this,11,10)),Sxd(this.q,a,c);case 21:return !this.s&&(this.s=new cUd(t5,this,21,17)),Sxd(this.s,a,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),QFd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),QFd)),a,c)};_.jh=function lLd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 6:return _hd(this,null,6,c);case 7:return !this.A&&(this.A=new K4d(u5,this,7)),Txd(this.A,a,c);case 11:return !this.q&&(this.q=new cUd(n5,this,11,10)),Txd(this.q,a,c);case 21:return !this.s&&(this.s=new cUd(t5,this,21,17)),Txd(this.s,a,c);case 22:return Txd(VKd(this),a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),QFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),QFd)),a,c)};_.lh=function mLd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.D!=null&&this.D==this.F;case 3:return !!dKd(this);case 4:return false;case 5:return this.F!=null&&this.F!=this.D&&this.F!=this.B;case 6:return !!ZJd(this);case 7:return !!this.A&&this.A.i!=0;case 8:return (this.Bb&256)!=0;case 9:return (this.Bb&512)!=0;case 10:return !!this.u&&VKd(this.u.a).i!=0&&!(!!this.n&&FMd(this.n));case 11:return !!this.q&&this.q.i!=0;case 12:return OKd(this).i!=0;case 13:return SKd(this).i!=0;case 14:return SKd(this),this.r.i!=0;case 15:return OKd(this),this.k.i!=0;case 16:return PKd(this).i!=0;case 17:return RKd(this).i!=0;case 18:return TKd(this).i!=0;case 19:return UKd(this).i!=0;case 20:return OKd(this),!!this.o;case 21:return !!this.s&&this.s.i!=0;case 22:return !!this.n&&FMd(this.n);case 23:return QKd(this).i!=0;}return cid(this,a-aLd((jGd(),QFd)),XKd((b=BD(Ajd(this,16),26),!b?QFd:b),a))};_.oh=function nLd(a){var b;b=this.i==null||!!this.q&&this.q.i!=0?null:YKd(this,a);return b?b:Bmd(this,a)};_.sh=function oLd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:lKd(this,GD(b));return;case 2:iKd(this,GD(b));return;case 5:kKd(this,GD(b));return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);!this.A&&(this.A=new K4d(u5,this,7));ytd(this.A,BD(b,14));return;case 8:eLd(this,Ccb(DD(b)));return;case 9:fLd(this,Ccb(DD(b)));return;case 10:vwd(_Kd(this));ytd(_Kd(this),BD(b,14));return;case 11:!this.q&&(this.q=new cUd(n5,this,11,10));Uxd(this.q);!this.q&&(this.q=new cUd(n5,this,11,10));ytd(this.q,BD(b,14));return;case 21:!this.s&&(this.s=new cUd(t5,this,21,17));Uxd(this.s);!this.s&&(this.s=new cUd(t5,this,21,17));ytd(this.s,BD(b,14));return;case 22:Uxd(VKd(this));ytd(VKd(this),BD(b,14));return;}did(this,a-aLd((jGd(),QFd)),XKd((c=BD(Ajd(this,16),26),!c?QFd:c),a),b)};_.zh=function pLd(){return jGd(),QFd};_.Bh=function qLd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,179)&&(BD(this.Cb,179).tb=null);pnd(this,null);return;case 2:$Jd(this,null);_Jd(this,this.D);return;case 5:kKd(this,null);return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);return;case 8:eLd(this,false);return;case 9:fLd(this,false);return;case 10:!!this.u&&vwd(this.u);return;case 11:!this.q&&(this.q=new cUd(n5,this,11,10));Uxd(this.q);return;case 21:!this.s&&(this.s=new cUd(t5,this,21,17));Uxd(this.s);return;case 22:!!this.n&&Uxd(this.n);return;}eid(this,a-aLd((jGd(),QFd)),XKd((b=BD(Ajd(this,16),26),!b?QFd:b),a))};_.Gh=function rLd(){var a,b;OKd(this);SKd(this);PKd(this);RKd(this);TKd(this);UKd(this);QKd(this);oud(SMd($Kd(this)));if(this.s){for(a=0,b=this.s.i;a=0;--b){qud(this,b)}}return xud(this,a)};_.Xj=function nMd(){Uxd(this)};_.oi=function oMd(a,b){return LLd(this,a,b)};var t9=mdb(yve,'EcoreEList',622);bcb(496,622,Pve,pMd);_.ai=function qMd(){return false};_.aj=function rMd(){return this.c};_.bj=function sMd(){return false};_.Fk=function tMd(){return true};_.hi=function uMd(){return true};_.li=function vMd(a,b){return b};_.ni=function wMd(){return false};_.c=0;var d9=mdb(yve,'EObjectEList',496);bcb(85,496,Pve,xMd);_.bj=function yMd(){return true};_.Dk=function zMd(){return false};_.rk=function AMd(){return true};var Z8=mdb(yve,'EObjectContainmentEList',85);bcb(545,85,Pve,BMd);_.ci=function CMd(){this.b=true};_.fj=function DMd(){return this.b};_.Xj=function EMd(){var a;Uxd(this);if(oid(this.e)){a=this.b;this.b=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.b=false}};_.b=false;var Y8=mdb(yve,'EObjectContainmentEList/Unsettable',545);bcb(1140,545,Pve,JMd);_.ii=function NMd(a,b){var c,d;return c=BD(Wxd(this,a,b),87),oid(this.e)&&GLd(this,new ESd(this.a,7,(jGd(),SFd),meb(b),(d=c.c,JD(d,88)?BD(d,26):_Fd),a)),c};_.jj=function OMd(a,b){return GMd(this,BD(a,87),b)};_.kj=function PMd(a,b){return HMd(this,BD(a,87),b)};_.lj=function QMd(a,b,c){return IMd(this,BD(a,87),BD(b,87),c)};_.Zi=function KMd(a,b,c,d,e){switch(a){case 3:{return FLd(this,a,b,c,d,this.i>1)}case 5:{return FLd(this,a,b,c,d,this.i-BD(c,15).gc()>0)}default:{return new pSd(this.e,a,this.c,b,c,d,true)}}};_.ij=function LMd(){return true};_.fj=function MMd(){return FMd(this)};_.Xj=function RMd(){Uxd(this)};var N5=mdb(qte,'EClassImpl/1',1140);bcb(1154,1153,dve);_.ui=function VMd(a){var b,c,d,e,f,g,h;c=a.xi();if(c!=8){d=UMd(a);if(d==0){switch(c){case 1:case 9:{h=a.Bi();if(h!=null){b=$Kd(BD(h,473));!b.c&&(b.c=new xYd);Ftd(b.c,a.Ai())}g=a.zi();if(g!=null){e=BD(g,473);if((e.Bb&1)==0){b=$Kd(e);!b.c&&(b.c=new xYd);wtd(b.c,BD(a.Ai(),26))}}break}case 3:{g=a.zi();if(g!=null){e=BD(g,473);if((e.Bb&1)==0){b=$Kd(e);!b.c&&(b.c=new xYd);wtd(b.c,BD(a.Ai(),26))}}break}case 5:{g=a.zi();if(g!=null){for(f=BD(g,14).Kc();f.Ob();){e=BD(f.Pb(),473);if((e.Bb&1)==0){b=$Kd(e);!b.c&&(b.c=new xYd);wtd(b.c,BD(a.Ai(),26))}}}break}case 4:{h=a.Bi();if(h!=null){e=BD(h,473);if((e.Bb&1)==0){b=$Kd(e);!b.c&&(b.c=new xYd);Ftd(b.c,a.Ai())}}break}case 6:{h=a.Bi();if(h!=null){for(f=BD(h,14).Kc();f.Ob();){e=BD(f.Pb(),473);if((e.Bb&1)==0){b=$Kd(e);!b.c&&(b.c=new xYd);Ftd(b.c,a.Ai())}}}break}}}this.Hk(d)}};_.Hk=function WMd(a){TMd(this,a)};_.b=63;var p7=mdb(qte,'ESuperAdapter',1154);bcb(1155,1154,dve,YMd);_.Hk=function ZMd(a){XMd(this,a)};var I5=mdb(qte,'EClassImpl/10',1155);bcb(1144,696,Pve);_.Vh=function $Md(a,b){return iud(this,a,b)};_.Wh=function _Md(a){return jud(this,a)};_.Xh=function aNd(a,b){kud(this,a,b)};_.Yh=function bNd(a){lud(this,a)};_.pi=function dNd(a){return nud(this,a)};_.mi=function lNd(a,b){return uud(this,a,b)};_.lk=function cNd(a,b){throw vbb(new bgb)};_.Zh=function eNd(){return new $yd(this)};_.$h=function fNd(){return new bzd(this)};_._h=function gNd(a){return ztd(this,a)};_.mk=function hNd(a,b){throw vbb(new bgb)};_.Wj=function iNd(a){return this};_.fj=function jNd(){return this.i!=0};_.Wb=function kNd(a){throw vbb(new bgb)};_.Xj=function mNd(){throw vbb(new bgb)};var s9=mdb(yve,'EcoreEList/UnmodifiableEList',1144);bcb(319,1144,Pve,nNd);_.ni=function oNd(){return false};var r9=mdb(yve,'EcoreEList/UnmodifiableEList/FastCompare',319);bcb(1147,319,Pve,rNd);_.Xc=function sNd(a){var b,c,d;if(JD(a,170)){b=BD(a,170);c=b.aj();if(c!=-1){for(d=this.i;c4){if(this.wj(a)){if(this.rk()){d=BD(a,49);c=d.Ug();h=c==this.b&&(this.Dk()?d.Og(d.Vg(),BD(XKd(wjd(this.b),this.aj()).Yj(),26).Bj())==zUd(BD(XKd(wjd(this.b),this.aj()),18)).n:-1-d.Vg()==this.aj());if(this.Ek()&&!h&&!c&&!!d.Zg()){for(e=0;e1||d==-1)}else{return false}};_.Dk=function COd(){var a,b,c;b=XKd(wjd(this.b),this.aj());if(JD(b,99)){a=BD(b,18);c=zUd(a);return !!c}else{return false}};_.Ek=function DOd(){var a,b;b=XKd(wjd(this.b),this.aj());if(JD(b,99)){a=BD(b,18);return (a.Bb&Tje)!=0}else{return false}};_.Xc=function EOd(a){var b,c,d,e;d=this.Qi(a);if(d>=0)return d;if(this.Fk()){for(c=0,e=this.Vi();c=0;--a){nOd(this,a,this.Oi(a))}}return this.Wi()};_.Qc=function QOd(a){var b;if(this.Ek()){for(b=this.Vi()-1;b>=0;--b){nOd(this,b,this.Oi(b))}}return this.Xi(a)};_.Xj=function ROd(){vwd(this)};_.oi=function SOd(a,b){return pOd(this,a,b)};var K8=mdb(yve,'DelegatingEcoreEList',742);bcb(1150,742,Uve,YOd);_.Hi=function _Od(a,b){TOd(this,a,BD(b,26))};_.Ii=function aPd(a){UOd(this,BD(a,26))};_.Oi=function gPd(a){var b,c;return b=BD(qud(VKd(this.a),a),87),c=b.c,JD(c,88)?BD(c,26):(jGd(),_Fd)};_.Ti=function lPd(a){var b,c;return b=BD(Xxd(VKd(this.a),a),87),c=b.c,JD(c,88)?BD(c,26):(jGd(),_Fd)};_.Ui=function mPd(a,b){return WOd(this,a,BD(b,26))};_.ai=function ZOd(){return false};_.Zi=function $Od(a,b,c,d,e){return null};_.Ji=function bPd(){return new EPd(this)};_.Ki=function cPd(){Uxd(VKd(this.a))};_.Li=function dPd(a){return VOd(this,a)};_.Mi=function ePd(a){var b,c;for(c=a.Kc();c.Ob();){b=c.Pb();if(!VOd(this,b)){return false}}return true};_.Ni=function fPd(a){var b,c,d;if(JD(a,15)){d=BD(a,15);if(d.gc()==VKd(this.a).i){for(b=d.Kc(),c=new Fyd(this);b.Ob();){if(PD(b.Pb())!==PD(Dyd(c))){return false}}return true}}return false};_.Pi=function hPd(){var a,b,c,d,e;c=1;for(b=new Fyd(VKd(this.a));b.e!=b.i.gc();){a=BD(Dyd(b),87);d=(e=a.c,JD(e,88)?BD(e,26):(jGd(),_Fd));c=31*c+(!d?0:FCb(d))}return c};_.Qi=function iPd(a){var b,c,d,e;d=0;for(c=new Fyd(VKd(this.a));c.e!=c.i.gc();){b=BD(Dyd(c),87);if(PD(a)===PD((e=b.c,JD(e,88)?BD(e,26):(jGd(),_Fd)))){return d}++d}return -1};_.Ri=function jPd(){return VKd(this.a).i==0};_.Si=function kPd(){return null};_.Vi=function nPd(){return VKd(this.a).i};_.Wi=function oPd(){var a,b,c,d,e,f;f=VKd(this.a).i;e=KC(SI,Uhe,1,f,5,1);c=0;for(b=new Fyd(VKd(this.a));b.e!=b.i.gc();){a=BD(Dyd(b),87);e[c++]=(d=a.c,JD(d,88)?BD(d,26):(jGd(),_Fd))}return e};_.Xi=function pPd(a){var b,c,d,e,f,g,h;h=VKd(this.a).i;if(a.lengthh&&NC(a,h,null);d=0;for(c=new Fyd(VKd(this.a));c.e!=c.i.gc();){b=BD(Dyd(c),87);f=(g=b.c,JD(g,88)?BD(g,26):(jGd(),_Fd));NC(a,d++,f)}return a};_.Yi=function qPd(){var a,b,c,d,e;e=new Hfb;e.a+='[';a=VKd(this.a);for(b=0,d=VKd(this.a).i;b>16,e>=0?aKd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,6,c);case 9:return !this.a&&(this.a=new cUd(g5,this,9,5)),Sxd(this.a,a,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),UFd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),UFd)),a,c)};_.jh=function dQd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 6:return _hd(this,null,6,c);case 7:return !this.A&&(this.A=new K4d(u5,this,7)),Txd(this.A,a,c);case 9:return !this.a&&(this.a=new cUd(g5,this,9,5)),Txd(this.a,a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),UFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),UFd)),a,c)};_.lh=function eQd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.D!=null&&this.D==this.F;case 3:return !!dKd(this);case 4:return !!$Pd(this);case 5:return this.F!=null&&this.F!=this.D&&this.F!=this.B;case 6:return !!ZJd(this);case 7:return !!this.A&&this.A.i!=0;case 8:return (this.Bb&256)==0;case 9:return !!this.a&&this.a.i!=0;}return cid(this,a-aLd((jGd(),UFd)),XKd((b=BD(Ajd(this,16),26),!b?UFd:b),a))};_.sh=function fQd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:lKd(this,GD(b));return;case 2:iKd(this,GD(b));return;case 5:kKd(this,GD(b));return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);!this.A&&(this.A=new K4d(u5,this,7));ytd(this.A,BD(b,14));return;case 8:LPd(this,Ccb(DD(b)));return;case 9:!this.a&&(this.a=new cUd(g5,this,9,5));Uxd(this.a);!this.a&&(this.a=new cUd(g5,this,9,5));ytd(this.a,BD(b,14));return;}did(this,a-aLd((jGd(),UFd)),XKd((c=BD(Ajd(this,16),26),!c?UFd:c),a),b)};_.zh=function gQd(){return jGd(),UFd};_.Bh=function hQd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,179)&&(BD(this.Cb,179).tb=null);pnd(this,null);return;case 2:$Jd(this,null);_Jd(this,this.D);return;case 5:kKd(this,null);return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);return;case 8:LPd(this,true);return;case 9:!this.a&&(this.a=new cUd(g5,this,9,5));Uxd(this.a);return;}eid(this,a-aLd((jGd(),UFd)),XKd((b=BD(Ajd(this,16),26),!b?UFd:b),a))};_.Gh=function iQd(){var a,b;if(this.a){for(a=0,b=this.a.i;a>16==5?BD(this.Cb,671):null;}return bid(this,a-aLd((jGd(),VFd)),XKd((d=BD(Ajd(this,16),26),!d?VFd:d),a),b,c)};_.hh=function uQd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 5:!!this.Cb&&(c=(e=this.Db>>16,e>=0?mQd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,5,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),VFd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),VFd)),a,c)};_.jh=function vQd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 5:return _hd(this,null,5,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),VFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),VFd)),a,c)};_.lh=function wQd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.d!=0;case 3:return !!this.b;case 4:return this.c!=null;case 5:return !!(this.Db>>16==5?BD(this.Cb,671):null);}return cid(this,a-aLd((jGd(),VFd)),XKd((b=BD(Ajd(this,16),26),!b?VFd:b),a))};_.sh=function xQd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:pnd(this,GD(b));return;case 2:qQd(this,BD(b,19).a);return;case 3:oQd(this,BD(b,1940));return;case 4:pQd(this,GD(b));return;}did(this,a-aLd((jGd(),VFd)),XKd((c=BD(Ajd(this,16),26),!c?VFd:c),a),b)};_.zh=function yQd(){return jGd(),VFd};_.Bh=function zQd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:pnd(this,null);return;case 2:qQd(this,0);return;case 3:oQd(this,null);return;case 4:pQd(this,null);return;}eid(this,a-aLd((jGd(),VFd)),XKd((b=BD(Ajd(this,16),26),!b?VFd:b),a))};_.Ib=function BQd(){var a;return a=this.c,a==null?this.zb:a};_.b=null;_.c=null;_.d=0;var a6=mdb(qte,'EEnumLiteralImpl',573);var c6=odb(qte,'EFactoryImpl/InternalEDateTimeFormat');bcb(489,1,{2015:1},EQd);var b6=mdb(qte,'EFactoryImpl/1ClientInternalEDateTimeFormat',489);bcb(241,115,{105:1,92:1,90:1,87:1,56:1,108:1,49:1,97:1,241:1,114:1,115:1},UQd);_.Sg=function VQd(a,b,c){var d;c=_hd(this,a,b,c);if(!!this.e&&JD(a,170)){d=MQd(this,this.e);d!=this.c&&(c=QQd(this,d,c))}return c};_._g=function WQd(a,b,c){var d;switch(a){case 0:return this.f;case 1:return !this.d&&(this.d=new xMd(j5,this,1)),this.d;case 2:if(b)return KQd(this);return this.c;case 3:return this.b;case 4:return this.e;case 5:if(b)return JQd(this);return this.a;}return bid(this,a-aLd((jGd(),XFd)),XKd((d=BD(Ajd(this,16),26),!d?XFd:d),a),b,c)};_.jh=function XQd(a,b,c){var d,e;switch(b){case 0:return IQd(this,null,c);case 1:return !this.d&&(this.d=new xMd(j5,this,1)),Txd(this.d,a,c);case 3:return GQd(this,null,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),XFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),XFd)),a,c)};_.lh=function YQd(a){var b;switch(a){case 0:return !!this.f;case 1:return !!this.d&&this.d.i!=0;case 2:return !!this.c;case 3:return !!this.b;case 4:return !!this.e;case 5:return !!this.a;}return cid(this,a-aLd((jGd(),XFd)),XKd((b=BD(Ajd(this,16),26),!b?XFd:b),a))};_.sh=function ZQd(a,b){var c;switch(a){case 0:SQd(this,BD(b,87));return;case 1:!this.d&&(this.d=new xMd(j5,this,1));Uxd(this.d);!this.d&&(this.d=new xMd(j5,this,1));ytd(this.d,BD(b,14));return;case 3:PQd(this,BD(b,87));return;case 4:RQd(this,BD(b,836));return;case 5:NQd(this,BD(b,138));return;}did(this,a-aLd((jGd(),XFd)),XKd((c=BD(Ajd(this,16),26),!c?XFd:c),a),b)};_.zh=function $Qd(){return jGd(),XFd};_.Bh=function _Qd(a){var b;switch(a){case 0:SQd(this,null);return;case 1:!this.d&&(this.d=new xMd(j5,this,1));Uxd(this.d);return;case 3:PQd(this,null);return;case 4:RQd(this,null);return;case 5:NQd(this,null);return;}eid(this,a-aLd((jGd(),XFd)),XKd((b=BD(Ajd(this,16),26),!b?XFd:b),a))};_.Ib=function aRd(){var a;a=new Wfb(Eid(this));a.a+=' (expression: ';TQd(this,a);a.a+=')';return a.a};var FQd;var e6=mdb(qte,'EGenericTypeImpl',241);bcb(1969,1964,Vve);_.Xh=function cRd(a,b){bRd(this,a,b)};_.lk=function dRd(a,b){bRd(this,this.gc(),a);return b};_.pi=function eRd(a){return Ut(this.Gi(),a)};_.Zh=function fRd(){return this.$h()};_.Gi=function gRd(){return new O0d(this)};_.$h=function hRd(){return this._h(0)};_._h=function iRd(a){return this.Gi().Zc(a)};_.mk=function jRd(a,b){ze(this,a,true);return b};_.ii=function kRd(a,b){var c,d;d=Vt(this,b);c=this.Zc(a);c.Rb(d);return d};_.ji=function lRd(a,b){var c;ze(this,b,true);c=this.Zc(a);c.Rb(b)};var B8=mdb(yve,'AbstractSequentialInternalEList',1969);bcb(486,1969,Vve,qRd);_.pi=function rRd(a){return Ut(this.Gi(),a)};_.Zh=function sRd(){if(this.b==null){return LRd(),LRd(),KRd}return this.Jk()};_.Gi=function tRd(){return new w4d(this.a,this.b)};_.$h=function uRd(){if(this.b==null){return LRd(),LRd(),KRd}return this.Jk()};_._h=function vRd(a){var b,c;if(this.b==null){if(a<0||a>1){throw vbb(new qcb(gve+a+', size=0'))}return LRd(),LRd(),KRd}c=this.Jk();for(b=0;b0){b=this.c[--this.d];if((!this.e||b.Gj()!=x2||b.aj()!=0)&&(!this.Mk()||this.b.mh(b))){f=this.b.bh(b,this.Lk());this.f=(Q6d(),BD(b,66).Oj());if(this.f||b.$j()){if(this.Lk()){d=BD(f,15);this.k=d}else{d=BD(f,69);this.k=this.j=d}if(JD(this.k,54)){this.o=this.k.gc();this.n=this.o}else{this.p=!this.j?this.k.Zc(this.k.gc()):this.j._h(this.k.gc())}if(!this.p?PRd(this):QRd(this,this.p)){e=!this.p?!this.j?this.k.Xb(--this.n):this.j.pi(--this.n):this.p.Ub();if(this.f){a=BD(e,72);a.ak();c=a.dd();this.i=c}else{c=e;this.i=c}this.g=-3;return true}}else if(f!=null){this.k=null;this.p=null;c=f;this.i=c;this.g=-2;return true}}}this.k=null;this.p=null;this.g=-1;return false}else{e=!this.p?!this.j?this.k.Xb(--this.n):this.j.pi(--this.n):this.p.Ub();if(this.f){a=BD(e,72);a.ak();c=a.dd();this.i=c}else{c=e;this.i=c}this.g=-3;return true}}}};_.Pb=function XRd(){return MRd(this)};_.Tb=function YRd(){return this.a};_.Ub=function ZRd(){var a;if(this.g<-1||this.Sb()){--this.a;this.g=0;a=this.i;this.Sb();return a}else{throw vbb(new utb)}};_.Vb=function $Rd(){return this.a-1};_.Qb=function _Rd(){throw vbb(new bgb)};_.Lk=function aSd(){return false};_.Wb=function bSd(a){throw vbb(new bgb)};_.Mk=function cSd(){return true};_.a=0;_.d=0;_.f=false;_.g=0;_.n=0;_.o=0;var KRd;var P8=mdb(yve,'EContentsEList/FeatureIteratorImpl',279);bcb(697,279,Wve,dSd);_.Lk=function eSd(){return true};var Q8=mdb(yve,'EContentsEList/ResolvingFeatureIteratorImpl',697);bcb(1157,697,Wve,fSd);_.Mk=function gSd(){return false};var g6=mdb(qte,'ENamedElementImpl/1/1',1157);bcb(1158,279,Wve,hSd);_.Mk=function iSd(){return false};var h6=mdb(qte,'ENamedElementImpl/1/2',1158);bcb(36,143,fve,lSd,mSd,nSd,oSd,pSd,qSd,rSd,sSd,tSd,uSd,vSd,wSd,xSd,ySd,zSd,ASd,BSd,CSd,DSd,ESd,FSd,GSd,HSd,ISd,JSd);_._i=function KSd(){return kSd(this)};_.gj=function LSd(){var a;a=kSd(this);if(a){return a.zj()}return null};_.yi=function MSd(a){this.b==-1&&!!this.a&&(this.b=this.c.Xg(this.a.aj(),this.a.Gj()));return this.c.Og(this.b,a)};_.Ai=function NSd(){return this.c};_.hj=function OSd(){var a;a=kSd(this);if(a){return a.Kj()}return false};_.b=-1;var k6=mdb(qte,'ENotificationImpl',36);bcb(399,284,{105:1,92:1,90:1,147:1,191:1,56:1,59:1,108:1,472:1,49:1,97:1,150:1,399:1,284:1,114:1,115:1},SSd);_.Qg=function TSd(a){return PSd(this,a)};_._g=function USd(a,b,c){var d,e,f;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),f=this.t,f>1||f==-1?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;case 10:return this.Db>>16==10?BD(this.Cb,26):null;case 11:return !this.d&&(this.d=new K4d(u5,this,11)),this.d;case 12:return !this.c&&(this.c=new cUd(p5,this,12,10)),this.c;case 13:return !this.a&&(this.a=new fTd(this,this)),this.a;case 14:return QSd(this);}return bid(this,a-aLd((jGd(),aGd)),XKd((d=BD(Ajd(this,16),26),!d?aGd:d),a),b,c)};_.hh=function VSd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 10:!!this.Cb&&(c=(e=this.Db>>16,e>=0?PSd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,10,c);case 12:return !this.c&&(this.c=new cUd(p5,this,12,10)),Sxd(this.c,a,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),aGd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),aGd)),a,c)};_.jh=function WSd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 9:return vId(this,c);case 10:return _hd(this,null,10,c);case 11:return !this.d&&(this.d=new K4d(u5,this,11)),Txd(this.d,a,c);case 12:return !this.c&&(this.c=new cUd(p5,this,12,10)),Txd(this.c,a,c);case 14:return Txd(QSd(this),a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),aGd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),aGd)),a,c)};_.lh=function XSd(a){var b,c,d;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return d=this.t,d>1||d==-1;case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);case 10:return !!(this.Db>>16==10?BD(this.Cb,26):null);case 11:return !!this.d&&this.d.i!=0;case 12:return !!this.c&&this.c.i!=0;case 13:return !!this.a&&QSd(this.a.a).i!=0&&!(!!this.b&&QTd(this.b));case 14:return !!this.b&&QTd(this.b);}return cid(this,a-aLd((jGd(),aGd)),XKd((b=BD(Ajd(this,16),26),!b?aGd:b),a))};_.sh=function YSd(a,b){var c,d;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:pnd(this,GD(b));return;case 2:BId(this,Ccb(DD(b)));return;case 3:CId(this,Ccb(DD(b)));return;case 4:AId(this,BD(b,19).a);return;case 5:DId(this,BD(b,19).a);return;case 8:yId(this,BD(b,138));return;case 9:d=xId(this,BD(b,87),null);!!d&&d.Fi();return;case 11:!this.d&&(this.d=new K4d(u5,this,11));Uxd(this.d);!this.d&&(this.d=new K4d(u5,this,11));ytd(this.d,BD(b,14));return;case 12:!this.c&&(this.c=new cUd(p5,this,12,10));Uxd(this.c);!this.c&&(this.c=new cUd(p5,this,12,10));ytd(this.c,BD(b,14));return;case 13:!this.a&&(this.a=new fTd(this,this));vwd(this.a);!this.a&&(this.a=new fTd(this,this));ytd(this.a,BD(b,14));return;case 14:Uxd(QSd(this));ytd(QSd(this),BD(b,14));return;}did(this,a-aLd((jGd(),aGd)),XKd((c=BD(Ajd(this,16),26),!c?aGd:c),a),b)};_.zh=function ZSd(){return jGd(),aGd};_.Bh=function $Sd(a){var b,c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:pnd(this,null);return;case 2:BId(this,true);return;case 3:CId(this,true);return;case 4:AId(this,0);return;case 5:DId(this,1);return;case 8:yId(this,null);return;case 9:c=xId(this,null,null);!!c&&c.Fi();return;case 11:!this.d&&(this.d=new K4d(u5,this,11));Uxd(this.d);return;case 12:!this.c&&(this.c=new cUd(p5,this,12,10));Uxd(this.c);return;case 13:!!this.a&&vwd(this.a);return;case 14:!!this.b&&Uxd(this.b);return;}eid(this,a-aLd((jGd(),aGd)),XKd((b=BD(Ajd(this,16),26),!b?aGd:b),a))};_.Gh=function _Sd(){var a,b;if(this.c){for(a=0,b=this.c.i;ah&&NC(a,h,null);d=0;for(c=new Fyd(QSd(this.a));c.e!=c.i.gc();){b=BD(Dyd(c),87);f=(g=b.c,g?g:(jGd(),YFd));NC(a,d++,f)}return a};_.Yi=function zTd(){var a,b,c,d,e;e=new Hfb;e.a+='[';a=QSd(this.a);for(b=0,d=QSd(this.a).i;b1)}case 5:{return FLd(this,a,b,c,d,this.i-BD(c,15).gc()>0)}default:{return new pSd(this.e,a,this.c,b,c,d,true)}}};_.ij=function WTd(){return true};_.fj=function XTd(){return QTd(this)};_.Xj=function aUd(){Uxd(this)};var o6=mdb(qte,'EOperationImpl/2',1341);bcb(498,1,{1938:1,498:1},bUd);var q6=mdb(qte,'EPackageImpl/1',498);bcb(16,85,Pve,cUd);_.zk=function dUd(){return this.d};_.Ak=function eUd(){return this.b};_.Dk=function fUd(){return true};_.b=0;var b9=mdb(yve,'EObjectContainmentWithInverseEList',16);bcb(353,16,Pve,gUd);_.Ek=function hUd(){return true};_.li=function iUd(a,b){return ILd(this,a,BD(b,56))};var $8=mdb(yve,'EObjectContainmentWithInverseEList/Resolving',353);bcb(298,353,Pve,jUd);_.ci=function kUd(){this.a.tb=null};var r6=mdb(qte,'EPackageImpl/2',298);bcb(1228,1,{},lUd);var s6=mdb(qte,'EPackageImpl/3',1228);bcb(718,43,fke,oUd);_._b=function pUd(a){return ND(a)?Qhb(this,a):!!irb(this.f,a)};var u6=mdb(qte,'EPackageRegistryImpl',718);bcb(509,284,{105:1,92:1,90:1,147:1,191:1,56:1,2017:1,108:1,472:1,49:1,97:1,150:1,509:1,284:1,114:1,115:1},rUd);_.Qg=function sUd(a){return qUd(this,a)};_._g=function tUd(a,b,c){var d,e,f;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),f=this.t,f>1||f==-1?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;case 10:return this.Db>>16==10?BD(this.Cb,59):null;}return bid(this,a-aLd((jGd(),dGd)),XKd((d=BD(Ajd(this,16),26),!d?dGd:d),a),b,c)};_.hh=function uUd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 10:!!this.Cb&&(c=(e=this.Db>>16,e>=0?qUd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,10,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),dGd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),dGd)),a,c)};_.jh=function vUd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 9:return vId(this,c);case 10:return _hd(this,null,10,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),dGd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),dGd)),a,c)};_.lh=function wUd(a){var b,c,d;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return d=this.t,d>1||d==-1;case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);case 10:return !!(this.Db>>16==10?BD(this.Cb,59):null);}return cid(this,a-aLd((jGd(),dGd)),XKd((b=BD(Ajd(this,16),26),!b?dGd:b),a))};_.zh=function xUd(){return jGd(),dGd};var v6=mdb(qte,'EParameterImpl',509);bcb(99,449,{105:1,92:1,90:1,147:1,191:1,56:1,18:1,170:1,66:1,108:1,472:1,49:1,97:1,150:1,99:1,449:1,284:1,114:1,115:1,677:1},FUd);_._g=function GUd(a,b,c){var d,e,f,g;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),g=this.t,g>1||g==-1?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;case 10:return Bcb(),(this.Bb&zte)!=0?true:false;case 11:return Bcb(),(this.Bb&Dve)!=0?true:false;case 12:return Bcb(),(this.Bb&Rje)!=0?true:false;case 13:return this.j;case 14:return VId(this);case 15:return Bcb(),(this.Bb&Cve)!=0?true:false;case 16:return Bcb(),(this.Bb&oie)!=0?true:false;case 17:return WId(this);case 18:return Bcb(),(this.Bb&ote)!=0?true:false;case 19:return Bcb(),f=zUd(this),!!f&&(f.Bb&ote)!=0?true:false;case 20:return Bcb(),(this.Bb&Tje)!=0?true:false;case 21:if(b)return zUd(this);return this.b;case 22:if(b)return AUd(this);return yUd(this);case 23:return !this.a&&(this.a=new _4d(b5,this,23)),this.a;}return bid(this,a-aLd((jGd(),eGd)),XKd((d=BD(Ajd(this,16),26),!d?eGd:d),a),b,c)};_.lh=function HUd(a){var b,c,d,e;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return e=this.t,e>1||e==-1;case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);case 10:return (this.Bb&zte)==0;case 11:return (this.Bb&Dve)!=0;case 12:return (this.Bb&Rje)!=0;case 13:return this.j!=null;case 14:return VId(this)!=null;case 15:return (this.Bb&Cve)!=0;case 16:return (this.Bb&oie)!=0;case 17:return !!WId(this);case 18:return (this.Bb&ote)!=0;case 19:return d=zUd(this),!!d&&(d.Bb&ote)!=0;case 20:return (this.Bb&Tje)==0;case 21:return !!this.b;case 22:return !!yUd(this);case 23:return !!this.a&&this.a.i!=0;}return cid(this,a-aLd((jGd(),eGd)),XKd((b=BD(Ajd(this,16),26),!b?eGd:b),a))};_.sh=function IUd(a,b){var c,d;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:cJd(this,GD(b));return;case 2:BId(this,Ccb(DD(b)));return;case 3:CId(this,Ccb(DD(b)));return;case 4:AId(this,BD(b,19).a);return;case 5:DId(this,BD(b,19).a);return;case 8:yId(this,BD(b,138));return;case 9:d=xId(this,BD(b,87),null);!!d&&d.Fi();return;case 10:ZId(this,Ccb(DD(b)));return;case 11:fJd(this,Ccb(DD(b)));return;case 12:dJd(this,Ccb(DD(b)));return;case 13:$Id(this,GD(b));return;case 15:eJd(this,Ccb(DD(b)));return;case 16:aJd(this,Ccb(DD(b)));return;case 18:BUd(this,Ccb(DD(b)));return;case 20:EUd(this,Ccb(DD(b)));return;case 21:DUd(this,BD(b,18));return;case 23:!this.a&&(this.a=new _4d(b5,this,23));Uxd(this.a);!this.a&&(this.a=new _4d(b5,this,23));ytd(this.a,BD(b,14));return;}did(this,a-aLd((jGd(),eGd)),XKd((c=BD(Ajd(this,16),26),!c?eGd:c),a),b)};_.zh=function JUd(){return jGd(),eGd};_.Bh=function KUd(a){var b,c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,88)&&XMd($Kd(BD(this.Cb,88)),4);pnd(this,null);return;case 2:BId(this,true);return;case 3:CId(this,true);return;case 4:AId(this,0);return;case 5:DId(this,1);return;case 8:yId(this,null);return;case 9:c=xId(this,null,null);!!c&&c.Fi();return;case 10:ZId(this,true);return;case 11:fJd(this,false);return;case 12:dJd(this,false);return;case 13:this.i=null;_Id(this,null);return;case 15:eJd(this,false);return;case 16:aJd(this,false);return;case 18:CUd(this,false);JD(this.Cb,88)&&XMd($Kd(BD(this.Cb,88)),2);return;case 20:EUd(this,true);return;case 21:DUd(this,null);return;case 23:!this.a&&(this.a=new _4d(b5,this,23));Uxd(this.a);return;}eid(this,a-aLd((jGd(),eGd)),XKd((b=BD(Ajd(this,16),26),!b?eGd:b),a))};_.Gh=function LUd(){AUd(this);a2d(q1d((O6d(),M6d),this));wId(this);this.Bb|=1};_.Lj=function MUd(){return zUd(this)};_.qk=function NUd(){var a;return a=zUd(this),!!a&&(a.Bb&ote)!=0};_.rk=function OUd(){return (this.Bb&ote)!=0};_.sk=function PUd(){return (this.Bb&Tje)!=0};_.nk=function QUd(a,b){this.c=null;return zId(this,a,b)};_.Ib=function RUd(){var a;if((this.Db&64)!=0)return gJd(this);a=new Jfb(gJd(this));a.a+=' (containment: ';Ffb(a,(this.Bb&ote)!=0);a.a+=', resolveProxies: ';Ffb(a,(this.Bb&Tje)!=0);a.a+=')';return a.a};var w6=mdb(qte,'EReferenceImpl',99);bcb(548,115,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1,548:1,114:1,115:1},XUd);_.Fb=function bVd(a){return this===a};_.cd=function dVd(){return this.b};_.dd=function eVd(){return this.c};_.Hb=function fVd(){return FCb(this)};_.Uh=function hVd(a){SUd(this,GD(a))};_.ed=function iVd(a){return WUd(this,GD(a))};_._g=function YUd(a,b,c){var d;switch(a){case 0:return this.b;case 1:return this.c;}return bid(this,a-aLd((jGd(),fGd)),XKd((d=BD(Ajd(this,16),26),!d?fGd:d),a),b,c)};_.lh=function ZUd(a){var b;switch(a){case 0:return this.b!=null;case 1:return this.c!=null;}return cid(this,a-aLd((jGd(),fGd)),XKd((b=BD(Ajd(this,16),26),!b?fGd:b),a))};_.sh=function $Ud(a,b){var c;switch(a){case 0:TUd(this,GD(b));return;case 1:VUd(this,GD(b));return;}did(this,a-aLd((jGd(),fGd)),XKd((c=BD(Ajd(this,16),26),!c?fGd:c),a),b)};_.zh=function _Ud(){return jGd(),fGd};_.Bh=function aVd(a){var b;switch(a){case 0:UUd(this,null);return;case 1:VUd(this,null);return;}eid(this,a-aLd((jGd(),fGd)),XKd((b=BD(Ajd(this,16),26),!b?fGd:b),a))};_.Sh=function cVd(){var a;if(this.a==-1){a=this.b;this.a=a==null?0:LCb(a)}return this.a};_.Th=function gVd(a){this.a=a};_.Ib=function jVd(){var a;if((this.Db&64)!=0)return Eid(this);a=new Jfb(Eid(this));a.a+=' (key: ';Efb(a,this.b);a.a+=', value: ';Efb(a,this.c);a.a+=')';return a.a};_.a=-1;_.b=null;_.c=null;var x6=mdb(qte,'EStringToStringMapEntryImpl',548);var D9=odb(yve,'FeatureMap/Entry/Internal');bcb(565,1,Xve);_.Ok=function mVd(a){return this.Pk(BD(a,49))};_.Pk=function nVd(a){return this.Ok(a)};_.Fb=function oVd(a){var b,c;if(this===a){return true}else if(JD(a,72)){b=BD(a,72);if(b.ak()==this.c){c=this.dd();return c==null?b.dd()==null:pb(c,b.dd())}else{return false}}else{return false}};_.ak=function pVd(){return this.c};_.Hb=function qVd(){var a;a=this.dd();return tb(this.c)^(a==null?0:tb(a))};_.Ib=function rVd(){var a,b;a=this.c;b=bKd(a.Hj()).Ph();a.ne();return (b!=null&&b.length!=0?b+':'+a.ne():a.ne())+'='+this.dd()};var y6=mdb(qte,'EStructuralFeatureImpl/BasicFeatureMapEntry',565);bcb(776,565,Xve,uVd);_.Pk=function vVd(a){return new uVd(this.c,a)};_.dd=function wVd(){return this.a};_.Qk=function xVd(a,b,c){return sVd(this,a,this.a,b,c)};_.Rk=function yVd(a,b,c){return tVd(this,a,this.a,b,c)};var z6=mdb(qte,'EStructuralFeatureImpl/ContainmentUpdatingFeatureMapEntry',776);bcb(1314,1,{},zVd);_.Pj=function AVd(a,b,c,d,e){var f;f=BD(gid(a,this.b),215);return f.nl(this.a).Wj(d)};_.Qj=function BVd(a,b,c,d,e){var f;f=BD(gid(a,this.b),215);return f.el(this.a,d,e)};_.Rj=function CVd(a,b,c,d,e){var f;f=BD(gid(a,this.b),215);return f.fl(this.a,d,e)};_.Sj=function DVd(a,b,c){var d;d=BD(gid(a,this.b),215);return d.nl(this.a).fj()};_.Tj=function EVd(a,b,c,d){var e;e=BD(gid(a,this.b),215);e.nl(this.a).Wb(d)};_.Uj=function FVd(a,b,c){return BD(gid(a,this.b),215).nl(this.a)};_.Vj=function GVd(a,b,c){var d;d=BD(gid(a,this.b),215);d.nl(this.a).Xj()};var A6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateFeatureMapDelegator',1314);bcb(89,1,{},IVd,JVd,KVd,LVd);_.Pj=function MVd(a,b,c,d,e){var f;f=b.Ch(c);f==null&&b.Dh(c,f=HVd(this,a));if(!e){switch(this.e){case 50:case 41:return BD(f,589).sj();case 40:return BD(f,215).kl();}}return f};_.Qj=function NVd(a,b,c,d,e){var f,g;g=b.Ch(c);g==null&&b.Dh(c,g=HVd(this,a));f=BD(g,69).lk(d,e);return f};_.Rj=function OVd(a,b,c,d,e){var f;f=b.Ch(c);f!=null&&(e=BD(f,69).mk(d,e));return e};_.Sj=function PVd(a,b,c){var d;d=b.Ch(c);return d!=null&&BD(d,76).fj()};_.Tj=function QVd(a,b,c,d){var e;e=BD(b.Ch(c),76);!e&&b.Dh(c,e=HVd(this,a));e.Wb(d)};_.Uj=function RVd(a,b,c){var d,e;e=b.Ch(c);e==null&&b.Dh(c,e=HVd(this,a));if(JD(e,76)){return BD(e,76)}else{d=BD(b.Ch(c),15);return new iYd(d)}};_.Vj=function SVd(a,b,c){var d;d=BD(b.Ch(c),76);!d&&b.Dh(c,d=HVd(this,a));d.Xj()};_.b=0;_.e=0;var B6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateMany',89);bcb(504,1,{});_.Qj=function WVd(a,b,c,d,e){throw vbb(new bgb)};_.Rj=function XVd(a,b,c,d,e){throw vbb(new bgb)};_.Uj=function YVd(a,b,c){return new ZVd(this,a,b,c)};var TVd;var i7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingle',504);bcb(1331,1,zve,ZVd);_.Wj=function $Vd(a){return this.a.Pj(this.c,this.d,this.b,a,true)};_.fj=function _Vd(){return this.a.Sj(this.c,this.d,this.b)};_.Wb=function aWd(a){this.a.Tj(this.c,this.d,this.b,a)};_.Xj=function bWd(){this.a.Vj(this.c,this.d,this.b)};_.b=0;var C6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingle/1',1331);bcb(769,504,{},cWd);_.Pj=function dWd(a,b,c,d,e){return Nid(a,a.eh(),a.Vg())==this.b?this.sk()&&d?aid(a):a.eh():null};_.Qj=function eWd(a,b,c,d,e){var f,g;!!a.eh()&&(e=(f=a.Vg(),f>=0?a.Qg(e):a.eh().ih(a,-1-f,null,e)));g=bLd(a.Tg(),this.e);return a.Sg(d,g,e)};_.Rj=function fWd(a,b,c,d,e){var f;f=bLd(a.Tg(),this.e);return a.Sg(null,f,e)};_.Sj=function gWd(a,b,c){var d;d=bLd(a.Tg(),this.e);return !!a.eh()&&a.Vg()==d};_.Tj=function hWd(a,b,c,d){var e,f,g,h,i;if(d!=null&&!fKd(this.a,d)){throw vbb(new Cdb(Yve+(JD(d,56)?gLd(BD(d,56).Tg()):idb(rb(d)))+Zve+this.a+"'"))}e=a.eh();g=bLd(a.Tg(),this.e);if(PD(d)!==PD(e)||a.Vg()!=g&&d!=null){if(p6d(a,BD(d,56)))throw vbb(new Wdb(ste+a.Ib()));i=null;!!e&&(i=(f=a.Vg(),f>=0?a.Qg(i):a.eh().ih(a,-1-f,null,i)));h=BD(d,49);!!h&&(i=h.gh(a,bLd(h.Tg(),this.b),null,i));i=a.Sg(h,g,i);!!i&&i.Fi()}else{a.Lg()&&a.Mg()&&Uhd(a,new nSd(a,1,g,d,d))}};_.Vj=function iWd(a,b,c){var d,e,f,g;d=a.eh();if(d){g=(e=a.Vg(),e>=0?a.Qg(null):a.eh().ih(a,-1-e,null,null));f=bLd(a.Tg(),this.e);g=a.Sg(null,f,g);!!g&&g.Fi()}else{a.Lg()&&a.Mg()&&Uhd(a,new DSd(a,1,this.e,null,null))}};_.sk=function jWd(){return false};var E6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleContainer',769);bcb(1315,769,{},kWd);_.sk=function lWd(){return true};var D6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleContainerResolving',1315);bcb(563,504,{});_.Pj=function oWd(a,b,c,d,e){var f;return f=b.Ch(c),f==null?this.b:PD(f)===PD(TVd)?null:f};_.Sj=function pWd(a,b,c){var d;d=b.Ch(c);return d!=null&&(PD(d)===PD(TVd)||!pb(d,this.b))};_.Tj=function qWd(a,b,c,d){var e,f;if(a.Lg()&&a.Mg()){e=(f=b.Ch(c),f==null?this.b:PD(f)===PD(TVd)?null:f);if(d==null){if(this.c!=null){b.Dh(c,null);d=this.b}else this.b!=null?b.Dh(c,TVd):b.Dh(c,null)}else{this.Sk(d);b.Dh(c,d)}Uhd(a,this.d.Tk(a,1,this.e,e,d))}else{if(d==null){this.c!=null?b.Dh(c,null):this.b!=null?b.Dh(c,TVd):b.Dh(c,null)}else{this.Sk(d);b.Dh(c,d)}}};_.Vj=function rWd(a,b,c){var d,e;if(a.Lg()&&a.Mg()){d=(e=b.Ch(c),e==null?this.b:PD(e)===PD(TVd)?null:e);b.Eh(c);Uhd(a,this.d.Tk(a,1,this.e,d,this.b))}else{b.Eh(c)}};_.Sk=function sWd(a){throw vbb(new Bdb)};var T6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData',563);bcb($ve,1,{},DWd);_.Tk=function EWd(a,b,c,d,e){return new DSd(a,b,c,d,e)};_.Uk=function FWd(a,b,c,d,e,f){return new FSd(a,b,c,d,e,f)};var tWd,uWd,vWd,wWd,xWd,yWd,zWd,AWd,BWd;var N6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator',$ve);bcb(1332,$ve,{},GWd);_.Tk=function HWd(a,b,c,d,e){return new ISd(a,b,c,Ccb(DD(d)),Ccb(DD(e)))};_.Uk=function IWd(a,b,c,d,e,f){return new JSd(a,b,c,Ccb(DD(d)),Ccb(DD(e)),f)};var F6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/1',1332);bcb(1333,$ve,{},JWd);_.Tk=function KWd(a,b,c,d,e){return new rSd(a,b,c,BD(d,217).a,BD(e,217).a)};_.Uk=function LWd(a,b,c,d,e,f){return new sSd(a,b,c,BD(d,217).a,BD(e,217).a,f)};var G6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/2',1333);bcb(1334,$ve,{},MWd);_.Tk=function NWd(a,b,c,d,e){return new tSd(a,b,c,BD(d,172).a,BD(e,172).a)};_.Uk=function OWd(a,b,c,d,e,f){return new uSd(a,b,c,BD(d,172).a,BD(e,172).a,f)};var H6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/3',1334);bcb(1335,$ve,{},PWd);_.Tk=function QWd(a,b,c,d,e){return new vSd(a,b,c,Edb(ED(d)),Edb(ED(e)))};_.Uk=function RWd(a,b,c,d,e,f){return new wSd(a,b,c,Edb(ED(d)),Edb(ED(e)),f)};var I6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/4',1335);bcb(1336,$ve,{},SWd);_.Tk=function TWd(a,b,c,d,e){return new xSd(a,b,c,BD(d,155).a,BD(e,155).a)};_.Uk=function UWd(a,b,c,d,e,f){return new ySd(a,b,c,BD(d,155).a,BD(e,155).a,f)};var J6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/5',1336);bcb(1337,$ve,{},VWd);_.Tk=function WWd(a,b,c,d,e){return new zSd(a,b,c,BD(d,19).a,BD(e,19).a)};_.Uk=function XWd(a,b,c,d,e,f){return new ASd(a,b,c,BD(d,19).a,BD(e,19).a,f)};var K6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/6',1337);bcb(1338,$ve,{},YWd);_.Tk=function ZWd(a,b,c,d,e){return new BSd(a,b,c,BD(d,162).a,BD(e,162).a)};_.Uk=function $Wd(a,b,c,d,e,f){return new CSd(a,b,c,BD(d,162).a,BD(e,162).a,f)};var L6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/7',1338);bcb(1339,$ve,{},_Wd);_.Tk=function aXd(a,b,c,d,e){return new GSd(a,b,c,BD(d,184).a,BD(e,184).a)};_.Uk=function bXd(a,b,c,d,e,f){return new HSd(a,b,c,BD(d,184).a,BD(e,184).a,f)};var M6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/8',1339);bcb(1317,563,{},cXd);_.Sk=function dXd(a){if(!this.a.wj(a)){throw vbb(new Cdb(Yve+rb(a)+Zve+this.a+"'"))}};var O6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleDataDynamic',1317);bcb(1318,563,{},eXd);_.Sk=function fXd(a){};var P6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleDataStatic',1318);bcb(770,563,{});_.Sj=function gXd(a,b,c){var d;d=b.Ch(c);return d!=null};_.Tj=function hXd(a,b,c,d){var e,f;if(a.Lg()&&a.Mg()){e=true;f=b.Ch(c);if(f==null){e=false;f=this.b}else PD(f)===PD(TVd)&&(f=null);if(d==null){if(this.c!=null){b.Dh(c,null);d=this.b}else{b.Dh(c,TVd)}}else{this.Sk(d);b.Dh(c,d)}Uhd(a,this.d.Uk(a,1,this.e,f,d,!e))}else{if(d==null){this.c!=null?b.Dh(c,null):b.Dh(c,TVd)}else{this.Sk(d);b.Dh(c,d)}}};_.Vj=function iXd(a,b,c){var d,e;if(a.Lg()&&a.Mg()){d=true;e=b.Ch(c);if(e==null){d=false;e=this.b}else PD(e)===PD(TVd)&&(e=null);b.Eh(c);Uhd(a,this.d.Uk(a,2,this.e,e,this.b,d))}else{b.Eh(c)}};var S6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettable',770);bcb(1319,770,{},jXd);_.Sk=function kXd(a){if(!this.a.wj(a)){throw vbb(new Cdb(Yve+rb(a)+Zve+this.a+"'"))}};var Q6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettableDynamic',1319);bcb(1320,770,{},lXd);_.Sk=function mXd(a){};var R6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettableStatic',1320);bcb(398,504,{},nXd);_.Pj=function pXd(a,b,c,d,e){var f,g,h,i,j;j=b.Ch(c);if(this.Kj()&&PD(j)===PD(TVd)){return null}else if(this.sk()&&d&&j!=null){h=BD(j,49);if(h.kh()){i=xid(a,h);if(h!=i){if(!fKd(this.a,i)){throw vbb(new Cdb(Yve+rb(i)+Zve+this.a+"'"))}b.Dh(c,j=i);if(this.rk()){f=BD(i,49);g=h.ih(a,!this.b?-1-bLd(a.Tg(),this.e):bLd(h.Tg(),this.b),null,null);!f.eh()&&(g=f.gh(a,!this.b?-1-bLd(a.Tg(),this.e):bLd(f.Tg(),this.b),null,g));!!g&&g.Fi()}a.Lg()&&a.Mg()&&Uhd(a,new DSd(a,9,this.e,h,i))}}return j}else{return j}};_.Qj=function qXd(a,b,c,d,e){var f,g;g=b.Ch(c);PD(g)===PD(TVd)&&(g=null);b.Dh(c,d);if(this.bj()){if(PD(g)!==PD(d)&&g!=null){f=BD(g,49);e=f.ih(a,bLd(f.Tg(),this.b),null,e)}}else this.rk()&&g!=null&&(e=BD(g,49).ih(a,-1-bLd(a.Tg(),this.e),null,e));if(a.Lg()&&a.Mg()){!e&&(e=new Ixd(4));e.Ei(new DSd(a,1,this.e,g,d))}return e};_.Rj=function rXd(a,b,c,d,e){var f;f=b.Ch(c);PD(f)===PD(TVd)&&(f=null);b.Eh(c);if(a.Lg()&&a.Mg()){!e&&(e=new Ixd(4));this.Kj()?e.Ei(new DSd(a,2,this.e,f,null)):e.Ei(new DSd(a,1,this.e,f,null))}return e};_.Sj=function sXd(a,b,c){var d;d=b.Ch(c);return d!=null};_.Tj=function tXd(a,b,c,d){var e,f,g,h,i;if(d!=null&&!fKd(this.a,d)){throw vbb(new Cdb(Yve+(JD(d,56)?gLd(BD(d,56).Tg()):idb(rb(d)))+Zve+this.a+"'"))}i=b.Ch(c);h=i!=null;this.Kj()&&PD(i)===PD(TVd)&&(i=null);g=null;if(this.bj()){if(PD(i)!==PD(d)){if(i!=null){e=BD(i,49);g=e.ih(a,bLd(e.Tg(),this.b),null,g)}if(d!=null){e=BD(d,49);g=e.gh(a,bLd(e.Tg(),this.b),null,g)}}}else if(this.rk()){if(PD(i)!==PD(d)){i!=null&&(g=BD(i,49).ih(a,-1-bLd(a.Tg(),this.e),null,g));d!=null&&(g=BD(d,49).gh(a,-1-bLd(a.Tg(),this.e),null,g))}}d==null&&this.Kj()?b.Dh(c,TVd):b.Dh(c,d);if(a.Lg()&&a.Mg()){f=new FSd(a,1,this.e,i,d,this.Kj()&&!h);if(!g){Uhd(a,f)}else{g.Ei(f);g.Fi()}}else !!g&&g.Fi()};_.Vj=function uXd(a,b,c){var d,e,f,g,h;h=b.Ch(c);g=h!=null;this.Kj()&&PD(h)===PD(TVd)&&(h=null);f=null;if(h!=null){if(this.bj()){d=BD(h,49);f=d.ih(a,bLd(d.Tg(),this.b),null,f)}else this.rk()&&(f=BD(h,49).ih(a,-1-bLd(a.Tg(),this.e),null,f))}b.Eh(c);if(a.Lg()&&a.Mg()){e=new FSd(a,this.Kj()?2:1,this.e,h,null,g);if(!f){Uhd(a,e)}else{f.Ei(e);f.Fi()}}else !!f&&f.Fi()};_.bj=function vXd(){return false};_.rk=function wXd(){return false};_.sk=function xXd(){return false};_.Kj=function yXd(){return false};var h7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObject',398);bcb(564,398,{},zXd);_.rk=function AXd(){return true};var _6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainment',564);bcb(1323,564,{},BXd);_.sk=function CXd(){return true};var U6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentResolving',1323);bcb(772,564,{},DXd);_.Kj=function EXd(){return true};var W6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentUnsettable',772);bcb(1325,772,{},FXd);_.sk=function GXd(){return true};var V6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentUnsettableResolving',1325);bcb(640,564,{},HXd);_.bj=function IXd(){return true};var $6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverse',640);bcb(1324,640,{},JXd);_.sk=function KXd(){return true};var X6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseResolving',1324);bcb(773,640,{},LXd);_.Kj=function MXd(){return true};var Z6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseUnsettable',773);bcb(1326,773,{},NXd);_.sk=function OXd(){return true};var Y6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseUnsettableResolving',1326);bcb(641,398,{},PXd);_.sk=function QXd(){return true};var d7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolving',641);bcb(1327,641,{},RXd);_.Kj=function SXd(){return true};var a7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingUnsettable',1327);bcb(774,641,{},TXd);_.bj=function UXd(){return true};var c7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingWithInverse',774);bcb(1328,774,{},VXd);_.Kj=function WXd(){return true};var b7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingWithInverseUnsettable',1328);bcb(1321,398,{},XXd);_.Kj=function YXd(){return true};var e7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectUnsettable',1321);bcb(771,398,{},ZXd);_.bj=function $Xd(){return true};var g7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectWithInverse',771);bcb(1322,771,{},_Xd);_.Kj=function aYd(){return true};var f7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectWithInverseUnsettable',1322);bcb(775,565,Xve,dYd);_.Pk=function eYd(a){return new dYd(this.a,this.c,a)};_.dd=function fYd(){return this.b};_.Qk=function gYd(a,b,c){return bYd(this,a,this.b,c)};_.Rk=function hYd(a,b,c){return cYd(this,a,this.b,c)};var j7=mdb(qte,'EStructuralFeatureImpl/InverseUpdatingFeatureMapEntry',775);bcb(1329,1,zve,iYd);_.Wj=function jYd(a){return this.a};_.fj=function kYd(){return JD(this.a,95)?BD(this.a,95).fj():!this.a.dc()};_.Wb=function lYd(a){this.a.$b();this.a.Gc(BD(a,15))};_.Xj=function mYd(){JD(this.a,95)?BD(this.a,95).Xj():this.a.$b()};var k7=mdb(qte,'EStructuralFeatureImpl/SettingMany',1329);bcb(1330,565,Xve,nYd);_.Ok=function oYd(a){return new sYd((Q8d(),P8d),this.b.Ih(this.a,a))};_.dd=function pYd(){return null};_.Qk=function qYd(a,b,c){return c};_.Rk=function rYd(a,b,c){return c};var l7=mdb(qte,'EStructuralFeatureImpl/SimpleContentFeatureMapEntry',1330);bcb(642,565,Xve,sYd);_.Ok=function tYd(a){return new sYd(this.c,a)};_.dd=function uYd(){return this.a};_.Qk=function vYd(a,b,c){return c};_.Rk=function wYd(a,b,c){return c};var m7=mdb(qte,'EStructuralFeatureImpl/SimpleFeatureMapEntry',642);bcb(391,497,oue,xYd);_.ri=function yYd(a){return KC(c5,Uhe,26,a,0,1)};_.ni=function zYd(){return false};var o7=mdb(qte,'ESuperAdapter/1',391);bcb(444,438,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,836:1,49:1,97:1,150:1,444:1,114:1,115:1},BYd);_._g=function CYd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return !this.a&&(this.a=new KYd(this,j5,this)),this.a;}return bid(this,a-aLd((jGd(),iGd)),XKd((d=BD(Ajd(this,16),26),!d?iGd:d),a),b,c)};_.jh=function DYd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 2:return !this.a&&(this.a=new KYd(this,j5,this)),Txd(this.a,a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),iGd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),iGd)),a,c)};_.lh=function EYd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return !!this.a&&this.a.i!=0;}return cid(this,a-aLd((jGd(),iGd)),XKd((b=BD(Ajd(this,16),26),!b?iGd:b),a))};_.sh=function FYd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:pnd(this,GD(b));return;case 2:!this.a&&(this.a=new KYd(this,j5,this));Uxd(this.a);!this.a&&(this.a=new KYd(this,j5,this));ytd(this.a,BD(b,14));return;}did(this,a-aLd((jGd(),iGd)),XKd((c=BD(Ajd(this,16),26),!c?iGd:c),a),b)};_.zh=function GYd(){return jGd(),iGd};_.Bh=function HYd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:pnd(this,null);return;case 2:!this.a&&(this.a=new KYd(this,j5,this));Uxd(this.a);return;}eid(this,a-aLd((jGd(),iGd)),XKd((b=BD(Ajd(this,16),26),!b?iGd:b),a))};var u7=mdb(qte,'ETypeParameterImpl',444);bcb(445,85,Pve,KYd);_.cj=function LYd(a,b){return IYd(this,BD(a,87),b)};_.dj=function MYd(a,b){return JYd(this,BD(a,87),b)};var q7=mdb(qte,'ETypeParameterImpl/1',445);bcb(634,43,fke,NYd);_.ec=function OYd(){return new RYd(this)};var t7=mdb(qte,'ETypeParameterImpl/2',634);bcb(556,eie,fie,RYd);_.Fc=function SYd(a){return PYd(this,BD(a,87))};_.Gc=function TYd(a){var b,c,d;d=false;for(c=a.Kc();c.Ob();){b=BD(c.Pb(),87);Rhb(this.a,b,'')==null&&(d=true)}return d};_.$b=function UYd(){Uhb(this.a)};_.Hc=function VYd(a){return Mhb(this.a,a)};_.Kc=function WYd(){var a;return a=new nib((new eib(this.a)).a),new ZYd(a)};_.Mc=function XYd(a){return QYd(this,a)};_.gc=function YYd(){return Vhb(this.a)};var s7=mdb(qte,'ETypeParameterImpl/2/1',556);bcb(557,1,aie,ZYd);_.Nb=function $Yd(a){Rrb(this,a)};_.Pb=function aZd(){return BD(lib(this.a).cd(),87)};_.Ob=function _Yd(){return this.a.b};_.Qb=function bZd(){mib(this.a)};var r7=mdb(qte,'ETypeParameterImpl/2/1/1',557);bcb(1276,43,fke,cZd);_._b=function dZd(a){return ND(a)?Qhb(this,a):!!irb(this.f,a)};_.xc=function eZd(a){var b,c;b=ND(a)?Phb(this,a):Wd(irb(this.f,a));if(JD(b,837)){c=BD(b,837);b=c._j();Rhb(this,BD(a,235),b);return b}else return b!=null?b:a==null?(g5d(),f5d):null};var w7=mdb(qte,'EValidatorRegistryImpl',1276);bcb(1313,704,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,1941:1,49:1,97:1,150:1,114:1,115:1},mZd);_.Ih=function nZd(a,b){switch(a.yj()){case 21:case 22:case 23:case 24:case 26:case 31:case 32:case 37:case 38:case 39:case 40:case 43:case 44:case 48:case 49:case 20:return b==null?null:fcb(b);case 25:return gZd(b);case 27:return hZd(b);case 28:return iZd(b);case 29:return b==null?null:CQd(Pmd[0],BD(b,199));case 41:return b==null?'':hdb(BD(b,290));case 42:return fcb(b);case 50:return GD(b);default:throw vbb(new Wdb(tte+a.ne()+ute));}};_.Jh=function oZd(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;switch(a.G==-1&&(a.G=(m=bKd(a),m?HLd(m.Mh(),a):-1)),a.G){case 0:return c=new OJd,c;case 1:return b=new RHd,b;case 2:return d=new hLd,d;case 4:return e=new MPd,e;case 5:return f=new aQd,f;case 6:return g=new rQd,g;case 7:return h=new $md,h;case 10:return j=new MGd,j;case 11:return k=new SSd,k;case 12:return l=new eod,l;case 13:return n=new rUd,n;case 14:return o=new FUd,o;case 17:return p=new XUd,p;case 18:return i=new UQd,i;case 19:return q=new BYd,q;default:throw vbb(new Wdb(xte+a.zb+ute));}};_.Kh=function pZd(a,b){switch(a.yj()){case 20:return b==null?null:new tgb(b);case 21:return b==null?null:new Ygb(b);case 23:case 22:return b==null?null:fZd(b);case 26:case 24:return b==null?null:Scb(Icb(b,-128,127)<<24>>24);case 25:return Xmd(b);case 27:return jZd(b);case 28:return kZd(b);case 29:return lZd(b);case 32:case 31:return b==null?null:Hcb(b);case 38:case 37:return b==null?null:new Odb(b);case 40:case 39:return b==null?null:meb(Icb(b,Rie,Ohe));case 41:return null;case 42:return b==null?null:null;case 44:case 43:return b==null?null:Aeb(Jcb(b));case 49:case 48:return b==null?null:Web(Icb(b,awe,32767)<<16>>16);case 50:return b;default:throw vbb(new Wdb(tte+a.ne()+ute));}};var x7=mdb(qte,'EcoreFactoryImpl',1313);bcb(547,179,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,1939:1,49:1,97:1,150:1,179:1,547:1,114:1,115:1,675:1},AZd);_.gb=false;_.hb=false;var rZd,sZd=false;var o8=mdb(qte,'EcorePackageImpl',547);bcb(1184,1,{837:1},EZd);_._j=function FZd(){return I6d(),H6d};var I7=mdb(qte,'EcorePackageImpl/1',1184);bcb(1193,1,nwe,GZd);_.wj=function HZd(a){return JD(a,147)};_.xj=function IZd(a){return KC(k5,Uhe,147,a,0,1)};var y7=mdb(qte,'EcorePackageImpl/10',1193);bcb(1194,1,nwe,JZd);_.wj=function KZd(a){return JD(a,191)};_.xj=function LZd(a){return KC(l5,Uhe,191,a,0,1)};var z7=mdb(qte,'EcorePackageImpl/11',1194);bcb(1195,1,nwe,MZd);_.wj=function NZd(a){return JD(a,56)};_.xj=function OZd(a){return KC(m5,Uhe,56,a,0,1)};var A7=mdb(qte,'EcorePackageImpl/12',1195);bcb(1196,1,nwe,PZd);_.wj=function QZd(a){return JD(a,399)};_.xj=function RZd(a){return KC(n5,Nve,59,a,0,1)};var B7=mdb(qte,'EcorePackageImpl/13',1196);bcb(1197,1,nwe,SZd);_.wj=function TZd(a){return JD(a,235)};_.xj=function UZd(a){return KC(o5,Uhe,235,a,0,1)};var C7=mdb(qte,'EcorePackageImpl/14',1197);bcb(1198,1,nwe,VZd);_.wj=function WZd(a){return JD(a,509)};_.xj=function XZd(a){return KC(p5,Uhe,2017,a,0,1)};var D7=mdb(qte,'EcorePackageImpl/15',1198);bcb(1199,1,nwe,YZd);_.wj=function ZZd(a){return JD(a,99)};_.xj=function $Zd(a){return KC(q5,Mve,18,a,0,1)};var E7=mdb(qte,'EcorePackageImpl/16',1199);bcb(1200,1,nwe,_Zd);_.wj=function a$d(a){return JD(a,170)};_.xj=function b$d(a){return KC(t5,Mve,170,a,0,1)};var F7=mdb(qte,'EcorePackageImpl/17',1200);bcb(1201,1,nwe,c$d);_.wj=function d$d(a){return JD(a,472)};_.xj=function e$d(a){return KC(v5,Uhe,472,a,0,1)};var G7=mdb(qte,'EcorePackageImpl/18',1201);bcb(1202,1,nwe,f$d);_.wj=function g$d(a){return JD(a,548)};_.xj=function h$d(a){return KC(x6,kve,548,a,0,1)};var H7=mdb(qte,'EcorePackageImpl/19',1202);bcb(1185,1,nwe,i$d);_.wj=function j$d(a){return JD(a,322)};_.xj=function k$d(a){return KC(b5,Mve,34,a,0,1)};var T7=mdb(qte,'EcorePackageImpl/2',1185);bcb(1203,1,nwe,l$d);_.wj=function m$d(a){return JD(a,241)};_.xj=function n$d(a){return KC(j5,Tve,87,a,0,1)};var J7=mdb(qte,'EcorePackageImpl/20',1203);bcb(1204,1,nwe,o$d);_.wj=function p$d(a){return JD(a,444)};_.xj=function q$d(a){return KC(u5,Uhe,836,a,0,1)};var K7=mdb(qte,'EcorePackageImpl/21',1204);bcb(1205,1,nwe,r$d);_.wj=function s$d(a){return KD(a)};_.xj=function t$d(a){return KC(wI,nie,476,a,8,1)};var L7=mdb(qte,'EcorePackageImpl/22',1205);bcb(1206,1,nwe,u$d);_.wj=function v$d(a){return JD(a,190)};_.xj=function w$d(a){return KC(SD,nie,190,a,0,2)};var M7=mdb(qte,'EcorePackageImpl/23',1206);bcb(1207,1,nwe,x$d);_.wj=function y$d(a){return JD(a,217)};_.xj=function z$d(a){return KC(xI,nie,217,a,0,1)};var N7=mdb(qte,'EcorePackageImpl/24',1207);bcb(1208,1,nwe,A$d);_.wj=function B$d(a){return JD(a,172)};_.xj=function C$d(a){return KC(yI,nie,172,a,0,1)};var O7=mdb(qte,'EcorePackageImpl/25',1208);bcb(1209,1,nwe,D$d);_.wj=function E$d(a){return JD(a,199)};_.xj=function F$d(a){return KC($J,nie,199,a,0,1)};var P7=mdb(qte,'EcorePackageImpl/26',1209);bcb(1210,1,nwe,G$d);_.wj=function H$d(a){return false};_.xj=function I$d(a){return KC(O4,Uhe,2110,a,0,1)};var Q7=mdb(qte,'EcorePackageImpl/27',1210);bcb(1211,1,nwe,J$d);_.wj=function K$d(a){return LD(a)};_.xj=function L$d(a){return KC(BI,nie,333,a,7,1)};var R7=mdb(qte,'EcorePackageImpl/28',1211);bcb(1212,1,nwe,M$d);_.wj=function N$d(a){return JD(a,58)};_.xj=function O$d(a){return KC(T4,eme,58,a,0,1)};var S7=mdb(qte,'EcorePackageImpl/29',1212);bcb(1186,1,nwe,P$d);_.wj=function Q$d(a){return JD(a,510)};_.xj=function R$d(a){return KC(a5,{3:1,4:1,5:1,1934:1},590,a,0,1)};var c8=mdb(qte,'EcorePackageImpl/3',1186);bcb(1213,1,nwe,S$d);_.wj=function T$d(a){return JD(a,573)};_.xj=function U$d(a){return KC(U4,Uhe,1940,a,0,1)};var U7=mdb(qte,'EcorePackageImpl/30',1213);bcb(1214,1,nwe,V$d);_.wj=function W$d(a){return JD(a,153)};_.xj=function X$d(a){return KC(O9,eme,153,a,0,1)};var V7=mdb(qte,'EcorePackageImpl/31',1214);bcb(1215,1,nwe,Y$d);_.wj=function Z$d(a){return JD(a,72)};_.xj=function $$d(a){return KC(E9,owe,72,a,0,1)};var W7=mdb(qte,'EcorePackageImpl/32',1215);bcb(1216,1,nwe,_$d);_.wj=function a_d(a){return JD(a,155)};_.xj=function b_d(a){return KC(FI,nie,155,a,0,1)};var X7=mdb(qte,'EcorePackageImpl/33',1216);bcb(1217,1,nwe,c_d);_.wj=function d_d(a){return JD(a,19)};_.xj=function e_d(a){return KC(JI,nie,19,a,0,1)};var Y7=mdb(qte,'EcorePackageImpl/34',1217);bcb(1218,1,nwe,f_d);_.wj=function g_d(a){return JD(a,290)};_.xj=function h_d(a){return KC(AI,Uhe,290,a,0,1)};var Z7=mdb(qte,'EcorePackageImpl/35',1218);bcb(1219,1,nwe,i_d);_.wj=function j_d(a){return JD(a,162)};_.xj=function k_d(a){return KC(MI,nie,162,a,0,1)};var $7=mdb(qte,'EcorePackageImpl/36',1219);bcb(1220,1,nwe,l_d);_.wj=function m_d(a){return JD(a,83)};_.xj=function n_d(a){return KC(DK,Uhe,83,a,0,1)};var _7=mdb(qte,'EcorePackageImpl/37',1220);bcb(1221,1,nwe,o_d);_.wj=function p_d(a){return JD(a,591)};_.xj=function q_d(a){return KC(v8,Uhe,591,a,0,1)};var a8=mdb(qte,'EcorePackageImpl/38',1221);bcb(1222,1,nwe,r_d);_.wj=function s_d(a){return false};_.xj=function t_d(a){return KC(u8,Uhe,2111,a,0,1)};var b8=mdb(qte,'EcorePackageImpl/39',1222);bcb(1187,1,nwe,u_d);_.wj=function v_d(a){return JD(a,88)};_.xj=function w_d(a){return KC(c5,Uhe,26,a,0,1)};var i8=mdb(qte,'EcorePackageImpl/4',1187);bcb(1223,1,nwe,x_d);_.wj=function y_d(a){return JD(a,184)};_.xj=function z_d(a){return KC(UI,nie,184,a,0,1)};var d8=mdb(qte,'EcorePackageImpl/40',1223);bcb(1224,1,nwe,A_d);_.wj=function B_d(a){return ND(a)};_.xj=function C_d(a){return KC(ZI,nie,2,a,6,1)};var e8=mdb(qte,'EcorePackageImpl/41',1224);bcb(1225,1,nwe,D_d);_.wj=function E_d(a){return JD(a,588)};_.xj=function F_d(a){return KC(X4,Uhe,588,a,0,1)};var f8=mdb(qte,'EcorePackageImpl/42',1225);bcb(1226,1,nwe,G_d);_.wj=function H_d(a){return false};_.xj=function I_d(a){return KC(V4,nie,2112,a,0,1)};var g8=mdb(qte,'EcorePackageImpl/43',1226);bcb(1227,1,nwe,J_d);_.wj=function K_d(a){return JD(a,42)};_.xj=function L_d(a){return KC(CK,zie,42,a,0,1)};var h8=mdb(qte,'EcorePackageImpl/44',1227);bcb(1188,1,nwe,M_d);_.wj=function N_d(a){return JD(a,138)};_.xj=function O_d(a){return KC(d5,Uhe,138,a,0,1)};var j8=mdb(qte,'EcorePackageImpl/5',1188);bcb(1189,1,nwe,P_d);_.wj=function Q_d(a){return JD(a,148)};_.xj=function R_d(a){return KC(f5,Uhe,148,a,0,1)};var k8=mdb(qte,'EcorePackageImpl/6',1189);bcb(1190,1,nwe,S_d);_.wj=function T_d(a){return JD(a,457)};_.xj=function U_d(a){return KC(h5,Uhe,671,a,0,1)};var l8=mdb(qte,'EcorePackageImpl/7',1190);bcb(1191,1,nwe,V_d);_.wj=function W_d(a){return JD(a,573)};_.xj=function X_d(a){return KC(g5,Uhe,678,a,0,1)};var m8=mdb(qte,'EcorePackageImpl/8',1191);bcb(1192,1,nwe,Y_d);_.wj=function Z_d(a){return JD(a,471)};_.xj=function $_d(a){return KC(i5,Uhe,471,a,0,1)};var n8=mdb(qte,'EcorePackageImpl/9',1192);bcb(1025,1982,ive,c0d);_.bi=function d0d(a,b){__d(this,BD(b,415))};_.fi=function e0d(a,b){a0d(this,a,BD(b,415))};var q8=mdb(qte,'MinimalEObjectImpl/1ArrayDelegatingAdapterList',1025);bcb(1026,143,fve,f0d);_.Ai=function g0d(){return this.a.a};var p8=mdb(qte,'MinimalEObjectImpl/1ArrayDelegatingAdapterList/1',1026);bcb(1053,1052,{},i0d);var t8=mdb('org.eclipse.emf.ecore.plugin','EcorePlugin',1053);var v8=odb(pwe,'Resource');bcb(781,1378,qwe);_.Yk=function m0d(a){};_.Zk=function n0d(a){};_.Vk=function o0d(){return !this.a&&(this.a=new z0d(this)),this.a};_.Wk=function p0d(a){var b,c,d,e,f;d=a.length;if(d>0){BCb(0,a.length);if(a.charCodeAt(0)==47){f=new Skb(4);e=1;for(b=1;b0&&(a=a.substr(0,c))}}}return k0d(this,a)};_.Xk=function q0d(){return this.c};_.Ib=function r0d(){var a;return hdb(this.gm)+'@'+(a=tb(this)>>>0,a.toString(16))+" uri='"+this.d+"'"};_.b=false;var z8=mdb(rwe,'ResourceImpl',781);bcb(1379,781,qwe,s0d);var w8=mdb(rwe,'BinaryResourceImpl',1379);bcb(1169,694,pue);_.si=function v0d(a){return JD(a,56)?t0d(this,BD(a,56)):JD(a,591)?new Fyd(BD(a,591).Vk()):PD(a)===PD(this.f)?BD(a,14).Kc():(LCd(),KCd.a)};_.Ob=function w0d(){return u0d(this)};_.a=false;var z9=mdb(yve,'EcoreUtil/ContentTreeIterator',1169);bcb(1380,1169,pue,x0d);_.si=function y0d(a){return PD(a)===PD(this.f)?BD(a,15).Kc():new C6d(BD(a,56))};var x8=mdb(rwe,'ResourceImpl/5',1380);bcb(648,1994,Ove,z0d);_.Hc=function A0d(a){return this.i<=4?pud(this,a):JD(a,49)&&BD(a,49).Zg()==this.a};_.bi=function B0d(a,b){a==this.i-1&&(this.a.b||(this.a.b=true,null))};_.di=function C0d(a,b){a==0?this.a.b||(this.a.b=true,null):Atd(this,a,b)};_.fi=function D0d(a,b){};_.gi=function E0d(a,b,c){};_.aj=function F0d(){return 2};_.Ai=function G0d(){return this.a};_.bj=function H0d(){return true};_.cj=function I0d(a,b){var c;c=BD(a,49);b=c.wh(this.a,b);return b};_.dj=function J0d(a,b){var c;c=BD(a,49);return c.wh(null,b)};_.ej=function K0d(){return false};_.hi=function L0d(){return true};_.ri=function M0d(a){return KC(m5,Uhe,56,a,0,1)};_.ni=function N0d(){return false};var y8=mdb(rwe,'ResourceImpl/ContentsEList',648);bcb(957,1964,Lie,O0d);_.Zc=function P0d(a){return this.a._h(a)};_.gc=function Q0d(){return this.a.gc()};var A8=mdb(yve,'AbstractSequentialInternalEList/1',957);var K6d,L6d,M6d,N6d;bcb(624,1,{},y1d);var R0d,S0d;var G8=mdb(yve,'BasicExtendedMetaData',624);bcb(1160,1,{},C1d);_.$k=function D1d(){return null};_._k=function E1d(){this.a==-2&&A1d(this,W0d(this.d,this.b));return this.a};_.al=function F1d(){return null};_.bl=function G1d(){return mmb(),mmb(),jmb};_.ne=function H1d(){this.c==Gwe&&B1d(this,_0d(this.d,this.b));return this.c};_.cl=function I1d(){return 0};_.a=-2;_.c=Gwe;var C8=mdb(yve,'BasicExtendedMetaData/EClassExtendedMetaDataImpl',1160);bcb(1161,1,{},O1d);_.$k=function P1d(){this.a==(T0d(),R0d)&&J1d(this,V0d(this.f,this.b));return this.a};_._k=function Q1d(){return 0};_.al=function R1d(){this.c==(T0d(),R0d)&&K1d(this,Z0d(this.f,this.b));return this.c};_.bl=function S1d(){!this.d&&L1d(this,$0d(this.f,this.b));return this.d};_.ne=function T1d(){this.e==Gwe&&M1d(this,_0d(this.f,this.b));return this.e};_.cl=function U1d(){this.g==-2&&N1d(this,c1d(this.f,this.b));return this.g};_.e=Gwe;_.g=-2;var D8=mdb(yve,'BasicExtendedMetaData/EDataTypeExtendedMetaDataImpl',1161);bcb(1159,1,{},Y1d);_.b=false;_.c=false;var E8=mdb(yve,'BasicExtendedMetaData/EPackageExtendedMetaDataImpl',1159);bcb(1162,1,{},j2d);_.c=-2;_.e=Gwe;_.f=Gwe;var F8=mdb(yve,'BasicExtendedMetaData/EStructuralFeatureExtendedMetaDataImpl',1162);bcb(585,622,Pve,k2d);_.aj=function l2d(){return this.c};_.Fk=function m2d(){return false};_.li=function n2d(a,b){return b};_.c=0;var T8=mdb(yve,'EDataTypeEList',585);var O9=odb(yve,'FeatureMap');bcb(75,585,{3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,76:1,153:1,215:1,1937:1,69:1,95:1},u3d);_.Vc=function v3d(a,b){o2d(this,a,BD(b,72))};_.Fc=function w3d(a){return r2d(this,BD(a,72))};_.Yh=function B3d(a){w2d(this,BD(a,72))};_.cj=function M3d(a,b){return O2d(this,BD(a,72),b)};_.dj=function N3d(a,b){return Q2d(this,BD(a,72),b)};_.ii=function P3d(a,b){return W2d(this,a,b)};_.li=function R3d(a,b){return _2d(this,a,BD(b,72))};_._c=function T3d(a,b){return c3d(this,a,BD(b,72))};_.jj=function X3d(a,b){return i3d(this,BD(a,72),b)};_.kj=function Y3d(a,b){return k3d(this,BD(a,72),b)};_.lj=function Z3d(a,b,c){return l3d(this,BD(a,72),BD(b,72),c)};_.oi=function _3d(a,b){return t3d(this,a,BD(b,72))};_.dl=function x3d(a,b){return q2d(this,a,b)};_.Wc=function y3d(a,b){var c,d,e,f,g,h,i,j,k;j=new zud(b.gc());for(e=b.Kc();e.Ob();){d=BD(e.Pb(),72);f=d.ak();if(T6d(this.e,f)){(!f.hi()||!E2d(this,f,d.dd())&&!pud(j,d))&&wtd(j,d)}else{k=S6d(this.e.Tg(),f);c=BD(this.g,119);g=true;for(h=0;h=0){b=a[this.c];if(this.k.rl(b.ak())){this.j=this.f?b:b.dd();this.i=-2;return true}}this.i=-1;this.g=-1;return false};var H8=mdb(yve,'BasicFeatureMap/FeatureEIterator',410);bcb(662,410,jie,s4d);_.Lk=function t4d(){return true};var I8=mdb(yve,'BasicFeatureMap/ResolvingFeatureEIterator',662);bcb(955,486,Vve,u4d);_.Gi=function v4d(){return this};var M8=mdb(yve,'EContentsEList/1',955);bcb(956,486,Vve,w4d);_.Lk=function x4d(){return false};var N8=mdb(yve,'EContentsEList/2',956);bcb(954,279,Wve,y4d);_.Nk=function z4d(a){};_.Ob=function A4d(){return false};_.Sb=function B4d(){return false};var O8=mdb(yve,'EContentsEList/FeatureIteratorImpl/1',954);bcb(825,585,Pve,C4d);_.ci=function D4d(){this.a=true};_.fj=function E4d(){return this.a};_.Xj=function F4d(){var a;Uxd(this);if(oid(this.e)){a=this.a;this.a=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.a=false}};_.a=false;var S8=mdb(yve,'EDataTypeEList/Unsettable',825);bcb(1849,585,Pve,G4d);_.hi=function H4d(){return true};var V8=mdb(yve,'EDataTypeUniqueEList',1849);bcb(1850,825,Pve,I4d);_.hi=function J4d(){return true};var U8=mdb(yve,'EDataTypeUniqueEList/Unsettable',1850);bcb(139,85,Pve,K4d);_.Ek=function L4d(){return true};_.li=function M4d(a,b){return ILd(this,a,BD(b,56))};var W8=mdb(yve,'EObjectContainmentEList/Resolving',139);bcb(1163,545,Pve,N4d);_.Ek=function O4d(){return true};_.li=function P4d(a,b){return ILd(this,a,BD(b,56))};var X8=mdb(yve,'EObjectContainmentEList/Unsettable/Resolving',1163);bcb(748,16,Pve,Q4d);_.ci=function R4d(){this.a=true};_.fj=function S4d(){return this.a};_.Xj=function T4d(){var a;Uxd(this);if(oid(this.e)){a=this.a;this.a=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.a=false}};_.a=false;var a9=mdb(yve,'EObjectContainmentWithInverseEList/Unsettable',748);bcb(1173,748,Pve,U4d);_.Ek=function V4d(){return true};_.li=function W4d(a,b){return ILd(this,a,BD(b,56))};var _8=mdb(yve,'EObjectContainmentWithInverseEList/Unsettable/Resolving',1173);bcb(743,496,Pve,X4d);_.ci=function Y4d(){this.a=true};_.fj=function Z4d(){return this.a};_.Xj=function $4d(){var a;Uxd(this);if(oid(this.e)){a=this.a;this.a=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.a=false}};_.a=false;var c9=mdb(yve,'EObjectEList/Unsettable',743);bcb(328,496,Pve,_4d);_.Ek=function a5d(){return true};_.li=function b5d(a,b){return ILd(this,a,BD(b,56))};var f9=mdb(yve,'EObjectResolvingEList',328);bcb(1641,743,Pve,c5d);_.Ek=function d5d(){return true};_.li=function e5d(a,b){return ILd(this,a,BD(b,56))};var e9=mdb(yve,'EObjectResolvingEList/Unsettable',1641);bcb(1381,1,{},h5d);var f5d;var g9=mdb(yve,'EObjectValidator',1381);bcb(546,496,Pve,i5d);_.zk=function j5d(){return this.d};_.Ak=function k5d(){return this.b};_.bj=function l5d(){return true};_.Dk=function m5d(){return true};_.b=0;var k9=mdb(yve,'EObjectWithInverseEList',546);bcb(1176,546,Pve,n5d);_.Ck=function o5d(){return true};var h9=mdb(yve,'EObjectWithInverseEList/ManyInverse',1176);bcb(625,546,Pve,p5d);_.ci=function q5d(){this.a=true};_.fj=function r5d(){return this.a};_.Xj=function s5d(){var a;Uxd(this);if(oid(this.e)){a=this.a;this.a=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.a=false}};_.a=false;var j9=mdb(yve,'EObjectWithInverseEList/Unsettable',625);bcb(1175,625,Pve,t5d);_.Ck=function u5d(){return true};var i9=mdb(yve,'EObjectWithInverseEList/Unsettable/ManyInverse',1175);bcb(749,546,Pve,v5d);_.Ek=function w5d(){return true};_.li=function x5d(a,b){return ILd(this,a,BD(b,56))};var o9=mdb(yve,'EObjectWithInverseResolvingEList',749);bcb(31,749,Pve,y5d);_.Ck=function z5d(){return true};var l9=mdb(yve,'EObjectWithInverseResolvingEList/ManyInverse',31);bcb(750,625,Pve,A5d);_.Ek=function B5d(){return true};_.li=function C5d(a,b){return ILd(this,a,BD(b,56))};var n9=mdb(yve,'EObjectWithInverseResolvingEList/Unsettable',750);bcb(1174,750,Pve,D5d);_.Ck=function E5d(){return true};var m9=mdb(yve,'EObjectWithInverseResolvingEList/Unsettable/ManyInverse',1174);bcb(1164,622,Pve);_.ai=function F5d(){return (this.b&1792)==0};_.ci=function G5d(){this.b|=1};_.Bk=function H5d(){return (this.b&4)!=0};_.bj=function I5d(){return (this.b&40)!=0};_.Ck=function J5d(){return (this.b&16)!=0};_.Dk=function K5d(){return (this.b&8)!=0};_.Ek=function L5d(){return (this.b&Dve)!=0};_.rk=function M5d(){return (this.b&32)!=0};_.Fk=function N5d(){return (this.b&zte)!=0};_.wj=function O5d(a){return !this.d?this.ak().Yj().wj(a):qEd(this.d,a)};_.fj=function P5d(){return (this.b&2)!=0?(this.b&1)!=0:this.i!=0};_.hi=function Q5d(){return (this.b&128)!=0};_.Xj=function S5d(){var a;Uxd(this);if((this.b&2)!=0){if(oid(this.e)){a=(this.b&1)!=0;this.b&=-2;GLd(this,new qSd(this.e,2,bLd(this.e.Tg(),this.ak()),a,false))}else{this.b&=-2}}};_.ni=function T5d(){return (this.b&1536)==0};_.b=0;var q9=mdb(yve,'EcoreEList/Generic',1164);bcb(1165,1164,Pve,U5d);_.ak=function V5d(){return this.a};var p9=mdb(yve,'EcoreEList/Dynamic',1165);bcb(747,63,oue,W5d);_.ri=function X5d(a){return izd(this.a.a,a)};var u9=mdb(yve,'EcoreEMap/1',747);bcb(746,85,Pve,Y5d);_.bi=function Z5d(a,b){uAd(this.b,BD(b,133))};_.di=function $5d(a,b){tAd(this.b)};_.ei=function _5d(a,b,c){var d;++(d=this.b,BD(b,133),d).e};_.fi=function a6d(a,b){vAd(this.b,BD(b,133))};_.gi=function b6d(a,b,c){vAd(this.b,BD(c,133));PD(c)===PD(b)&&BD(c,133).Th(CAd(BD(b,133).cd()));uAd(this.b,BD(b,133))};var v9=mdb(yve,'EcoreEMap/DelegateEObjectContainmentEList',746);bcb(1171,151,Ave,c6d);var x9=mdb(yve,'EcoreEMap/Unsettable',1171);bcb(1172,746,Pve,d6d);_.ci=function e6d(){this.a=true};_.fj=function f6d(){return this.a};_.Xj=function g6d(){var a;Uxd(this);if(oid(this.e)){a=this.a;this.a=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.a=false}};_.a=false;var w9=mdb(yve,'EcoreEMap/Unsettable/UnsettableDelegateEObjectContainmentEList',1172);bcb(1168,228,fke,A6d);_.a=false;_.b=false;var A9=mdb(yve,'EcoreUtil/Copier',1168);bcb(745,1,aie,C6d);_.Nb=function D6d(a){Rrb(this,a)};_.Ob=function E6d(){return B6d(this)};_.Pb=function F6d(){var a;B6d(this);a=this.b;this.b=null;return a};_.Qb=function G6d(){this.a.Qb()};var B9=mdb(yve,'EcoreUtil/ProperContentIterator',745);bcb(1382,1381,{},J6d);var H6d;var C9=mdb(yve,'EcoreValidator',1382);var P6d;var N9=odb(yve,'FeatureMapUtil/Validator');bcb(1260,1,{1942:1},U6d);_.rl=function V6d(a){return true};var F9=mdb(yve,'FeatureMapUtil/1',1260);bcb(757,1,{1942:1},Z6d);_.rl=function $6d(a){var b;if(this.c==a)return true;b=DD(Ohb(this.a,a));if(b==null){if(Y6d(this,a)){_6d(this.a,a,(Bcb(),Acb));return true}else{_6d(this.a,a,(Bcb(),zcb));return false}}else{return b==(Bcb(),Acb)}};_.e=false;var W6d;var I9=mdb(yve,'FeatureMapUtil/BasicValidator',757);bcb(758,43,fke,a7d);var H9=mdb(yve,'FeatureMapUtil/BasicValidator/Cache',758);bcb(501,52,{20:1,28:1,52:1,14:1,15:1,58:1,76:1,69:1,95:1},f7d);_.Vc=function g7d(a,b){p2d(this.c,this.b,a,b)};_.Fc=function h7d(a){return q2d(this.c,this.b,a)};_.Wc=function i7d(a,b){return s2d(this.c,this.b,a,b)};_.Gc=function j7d(a){return b7d(this,a)};_.Xh=function k7d(a,b){u2d(this.c,this.b,a,b)};_.lk=function l7d(a,b){return x2d(this.c,this.b,a,b)};_.pi=function m7d(a){return J2d(this.c,this.b,a,false)};_.Zh=function n7d(){return y2d(this.c,this.b)};_.$h=function o7d(){return z2d(this.c,this.b)};_._h=function p7d(a){return A2d(this.c,this.b,a)};_.mk=function q7d(a,b){return c7d(this,a,b)};_.$b=function r7d(){d7d(this)};_.Hc=function s7d(a){return E2d(this.c,this.b,a)};_.Ic=function t7d(a){return G2d(this.c,this.b,a)};_.Xb=function u7d(a){return J2d(this.c,this.b,a,true)};_.Wj=function v7d(a){return this};_.Xc=function w7d(a){return L2d(this.c,this.b,a)};_.dc=function x7d(){return e7d(this)};_.fj=function y7d(){return !R2d(this.c,this.b)};_.Kc=function z7d(){return S2d(this.c,this.b)};_.Yc=function A7d(){return U2d(this.c,this.b)};_.Zc=function B7d(a){return V2d(this.c,this.b,a)};_.ii=function C7d(a,b){return X2d(this.c,this.b,a,b)};_.ji=function D7d(a,b){Y2d(this.c,this.b,a,b)};_.$c=function E7d(a){return Z2d(this.c,this.b,a)};_.Mc=function F7d(a){return $2d(this.c,this.b,a)};_._c=function G7d(a,b){return e3d(this.c,this.b,a,b)};_.Wb=function H7d(a){D2d(this.c,this.b);b7d(this,BD(a,15))};_.gc=function I7d(){return n3d(this.c,this.b)};_.Pc=function J7d(){return o3d(this.c,this.b)};_.Qc=function K7d(a){return q3d(this.c,this.b,a)};_.Ib=function L7d(){var a,b;b=new Hfb;b.a+='[';for(a=y2d(this.c,this.b);b4d(a);){Efb(b,xfb(d4d(a)));b4d(a)&&(b.a+=She,b)}b.a+=']';return b.a};_.Xj=function M7d(){D2d(this.c,this.b)};var J9=mdb(yve,'FeatureMapUtil/FeatureEList',501);bcb(627,36,fve,O7d);_.yi=function P7d(a){return N7d(this,a)};_.Di=function Q7d(a){var b,c,d,e,f,g,h;switch(this.d){case 1:case 2:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){this.g=a.zi();a.xi()==1&&(this.d=1);return true}break}case 3:{e=a.xi();switch(e){case 3:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){this.d=5;b=new zud(2);wtd(b,this.g);wtd(b,a.zi());this.g=b;return true}break}}break}case 5:{e=a.xi();switch(e){case 3:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){c=BD(this.g,14);c.Fc(a.zi());return true}break}}break}case 4:{e=a.xi();switch(e){case 3:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){this.d=1;this.g=a.zi();return true}break}case 4:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){this.d=6;h=new zud(2);wtd(h,this.n);wtd(h,a.Bi());this.n=h;g=OC(GC(WD,1),oje,25,15,[this.o,a.Ci()]);this.g=g;return true}break}}break}case 6:{e=a.xi();switch(e){case 4:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){c=BD(this.n,14);c.Fc(a.Bi());g=BD(this.g,48);d=KC(WD,oje,25,g.length+1,15,1);$fb(g,0,d,0,g.length);d[g.length]=a.Ci();this.g=d;return true}break}}break}}return false};var K9=mdb(yve,'FeatureMapUtil/FeatureENotificationImpl',627);bcb(552,501,{20:1,28:1,52:1,14:1,15:1,58:1,76:1,153:1,215:1,1937:1,69:1,95:1},R7d);_.dl=function S7d(a,b){return q2d(this.c,a,b)};_.el=function T7d(a,b,c){return x2d(this.c,a,b,c)};_.fl=function U7d(a,b,c){return C2d(this.c,a,b,c)};_.gl=function V7d(){return this};_.hl=function W7d(a,b){return K2d(this.c,a,b)};_.il=function X7d(a){return BD(J2d(this.c,this.b,a,false),72).ak()};_.jl=function Y7d(a){return BD(J2d(this.c,this.b,a,false),72).dd()};_.kl=function Z7d(){return this.a};_.ll=function $7d(a){return !R2d(this.c,a)};_.ml=function _7d(a,b){f3d(this.c,a,b)};_.nl=function a8d(a){return g3d(this.c,a)};_.ol=function b8d(a){s3d(this.c,a)};var L9=mdb(yve,'FeatureMapUtil/FeatureFeatureMap',552);bcb(1259,1,zve,c8d);_.Wj=function d8d(a){return J2d(this.b,this.a,-1,a)};_.fj=function e8d(){return !R2d(this.b,this.a)};_.Wb=function f8d(a){f3d(this.b,this.a,a)};_.Xj=function g8d(){D2d(this.b,this.a)};var M9=mdb(yve,'FeatureMapUtil/FeatureValue',1259);var h8d,i8d,j8d,k8d,l8d;var Q9=odb(Iwe,'AnyType');bcb(666,60,Tie,n8d);var R9=mdb(Iwe,'InvalidDatatypeValueException',666);var S9=odb(Iwe,Jwe);var T9=odb(Iwe,Kwe);var U9=odb(Iwe,Lwe);var o8d;var q8d;var s8d,t8d,u8d,v8d,w8d,x8d,y8d,z8d,A8d,B8d,C8d,D8d,E8d,F8d,G8d,H8d,I8d,J8d,K8d,L8d,M8d,N8d,O8d,P8d;bcb(830,506,{105:1,92:1,90:1,56:1,49:1,97:1,843:1},R8d);_._g=function S8d(a,b,c){switch(a){case 0:if(c)return !this.c&&(this.c=new u3d(this,0)),this.c;return !this.c&&(this.c=new u3d(this,0)),this.c.b;case 1:if(c)return !this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153);return (!this.c&&(this.c=new u3d(this,0)),BD(BD(T2d(this.c,(Q8d(),t8d)),153),215)).kl();case 2:if(c)return !this.b&&(this.b=new u3d(this,2)),this.b;return !this.b&&(this.b=new u3d(this,2)),this.b.b;}return bid(this,a-aLd(this.zh()),XKd((this.j&2)==0?this.zh():(!this.k&&(this.k=new HGd),this.k).ck(),a),b,c)};_.jh=function T8d(a,b,c){var d;switch(b){case 0:return !this.c&&(this.c=new u3d(this,0)),B2d(this.c,a,c);case 1:return (!this.c&&(this.c=new u3d(this,0)),BD(BD(T2d(this.c,(Q8d(),t8d)),153),69)).mk(a,c);case 2:return !this.b&&(this.b=new u3d(this,2)),B2d(this.b,a,c);}return d=BD(XKd((this.j&2)==0?this.zh():(!this.k&&(this.k=new HGd),this.k).ck(),b),66),d.Nj().Rj(this,Aid(this),b-aLd(this.zh()),a,c)};_.lh=function U8d(a){switch(a){case 0:return !!this.c&&this.c.i!=0;case 1:return !(!this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153)).dc();case 2:return !!this.b&&this.b.i!=0;}return cid(this,a-aLd(this.zh()),XKd((this.j&2)==0?this.zh():(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.sh=function V8d(a,b){switch(a){case 0:!this.c&&(this.c=new u3d(this,0));d3d(this.c,b);return;case 1:(!this.c&&(this.c=new u3d(this,0)),BD(BD(T2d(this.c,(Q8d(),t8d)),153),215)).Wb(b);return;case 2:!this.b&&(this.b=new u3d(this,2));d3d(this.b,b);return;}did(this,a-aLd(this.zh()),XKd((this.j&2)==0?this.zh():(!this.k&&(this.k=new HGd),this.k).ck(),a),b)};_.zh=function W8d(){return Q8d(),s8d};_.Bh=function X8d(a){switch(a){case 0:!this.c&&(this.c=new u3d(this,0));Uxd(this.c);return;case 1:(!this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153)).$b();return;case 2:!this.b&&(this.b=new u3d(this,2));Uxd(this.b);return;}eid(this,a-aLd(this.zh()),XKd((this.j&2)==0?this.zh():(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.Ib=function Y8d(){var a;if((this.j&4)!=0)return Eid(this);a=new Jfb(Eid(this));a.a+=' (mixed: ';Dfb(a,this.c);a.a+=', anyAttribute: ';Dfb(a,this.b);a.a+=')';return a.a};var V9=mdb(Mwe,'AnyTypeImpl',830);bcb(667,506,{105:1,92:1,90:1,56:1,49:1,97:1,2021:1,667:1},_8d);_._g=function a9d(a,b,c){switch(a){case 0:return this.a;case 1:return this.b;}return bid(this,a-aLd((Q8d(),F8d)),XKd((this.j&2)==0?F8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b,c)};_.lh=function b9d(a){switch(a){case 0:return this.a!=null;case 1:return this.b!=null;}return cid(this,a-aLd((Q8d(),F8d)),XKd((this.j&2)==0?F8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.sh=function c9d(a,b){switch(a){case 0:Z8d(this,GD(b));return;case 1:$8d(this,GD(b));return;}did(this,a-aLd((Q8d(),F8d)),XKd((this.j&2)==0?F8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b)};_.zh=function d9d(){return Q8d(),F8d};_.Bh=function e9d(a){switch(a){case 0:this.a=null;return;case 1:this.b=null;return;}eid(this,a-aLd((Q8d(),F8d)),XKd((this.j&2)==0?F8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.Ib=function f9d(){var a;if((this.j&4)!=0)return Eid(this);a=new Jfb(Eid(this));a.a+=' (data: ';Efb(a,this.a);a.a+=', target: ';Efb(a,this.b);a.a+=')';return a.a};_.a=null;_.b=null;var W9=mdb(Mwe,'ProcessingInstructionImpl',667);bcb(668,830,{105:1,92:1,90:1,56:1,49:1,97:1,843:1,2022:1,668:1},i9d);_._g=function j9d(a,b,c){switch(a){case 0:if(c)return !this.c&&(this.c=new u3d(this,0)),this.c;return !this.c&&(this.c=new u3d(this,0)),this.c.b;case 1:if(c)return !this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153);return (!this.c&&(this.c=new u3d(this,0)),BD(BD(T2d(this.c,(Q8d(),t8d)),153),215)).kl();case 2:if(c)return !this.b&&(this.b=new u3d(this,2)),this.b;return !this.b&&(this.b=new u3d(this,2)),this.b.b;case 3:return !this.c&&(this.c=new u3d(this,0)),GD(K2d(this.c,(Q8d(),I8d),true));case 4:return j6d(this.a,(!this.c&&(this.c=new u3d(this,0)),GD(K2d(this.c,(Q8d(),I8d),true))));case 5:return this.a;}return bid(this,a-aLd((Q8d(),H8d)),XKd((this.j&2)==0?H8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b,c)};_.lh=function k9d(a){switch(a){case 0:return !!this.c&&this.c.i!=0;case 1:return !(!this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153)).dc();case 2:return !!this.b&&this.b.i!=0;case 3:return !this.c&&(this.c=new u3d(this,0)),GD(K2d(this.c,(Q8d(),I8d),true))!=null;case 4:return j6d(this.a,(!this.c&&(this.c=new u3d(this,0)),GD(K2d(this.c,(Q8d(),I8d),true))))!=null;case 5:return !!this.a;}return cid(this,a-aLd((Q8d(),H8d)),XKd((this.j&2)==0?H8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.sh=function l9d(a,b){switch(a){case 0:!this.c&&(this.c=new u3d(this,0));d3d(this.c,b);return;case 1:(!this.c&&(this.c=new u3d(this,0)),BD(BD(T2d(this.c,(Q8d(),t8d)),153),215)).Wb(b);return;case 2:!this.b&&(this.b=new u3d(this,2));d3d(this.b,b);return;case 3:h9d(this,GD(b));return;case 4:h9d(this,h6d(this.a,b));return;case 5:g9d(this,BD(b,148));return;}did(this,a-aLd((Q8d(),H8d)),XKd((this.j&2)==0?H8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b)};_.zh=function m9d(){return Q8d(),H8d};_.Bh=function n9d(a){switch(a){case 0:!this.c&&(this.c=new u3d(this,0));Uxd(this.c);return;case 1:(!this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153)).$b();return;case 2:!this.b&&(this.b=new u3d(this,2));Uxd(this.b);return;case 3:!this.c&&(this.c=new u3d(this,0));f3d(this.c,(Q8d(),I8d),null);return;case 4:h9d(this,h6d(this.a,null));return;case 5:this.a=null;return;}eid(this,a-aLd((Q8d(),H8d)),XKd((this.j&2)==0?H8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};var X9=mdb(Mwe,'SimpleAnyTypeImpl',668);bcb(669,506,{105:1,92:1,90:1,56:1,49:1,97:1,2023:1,669:1},o9d);_._g=function p9d(a,b,c){switch(a){case 0:if(c)return !this.a&&(this.a=new u3d(this,0)),this.a;return !this.a&&(this.a=new u3d(this,0)),this.a.b;case 1:return c?(!this.b&&(this.b=new dId((jGd(),fGd),x6,this,1)),this.b):(!this.b&&(this.b=new dId((jGd(),fGd),x6,this,1)),FAd(this.b));case 2:return c?(!this.c&&(this.c=new dId((jGd(),fGd),x6,this,2)),this.c):(!this.c&&(this.c=new dId((jGd(),fGd),x6,this,2)),FAd(this.c));case 3:return !this.a&&(this.a=new u3d(this,0)),T2d(this.a,(Q8d(),L8d));case 4:return !this.a&&(this.a=new u3d(this,0)),T2d(this.a,(Q8d(),M8d));case 5:return !this.a&&(this.a=new u3d(this,0)),T2d(this.a,(Q8d(),O8d));case 6:return !this.a&&(this.a=new u3d(this,0)),T2d(this.a,(Q8d(),P8d));}return bid(this,a-aLd((Q8d(),K8d)),XKd((this.j&2)==0?K8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b,c)};_.jh=function q9d(a,b,c){var d;switch(b){case 0:return !this.a&&(this.a=new u3d(this,0)),B2d(this.a,a,c);case 1:return !this.b&&(this.b=new dId((jGd(),fGd),x6,this,1)),bId(this.b,a,c);case 2:return !this.c&&(this.c=new dId((jGd(),fGd),x6,this,2)),bId(this.c,a,c);case 5:return !this.a&&(this.a=new u3d(this,0)),c7d(T2d(this.a,(Q8d(),O8d)),a,c);}return d=BD(XKd((this.j&2)==0?(Q8d(),K8d):(!this.k&&(this.k=new HGd),this.k).ck(),b),66),d.Nj().Rj(this,Aid(this),b-aLd((Q8d(),K8d)),a,c)};_.lh=function r9d(a){switch(a){case 0:return !!this.a&&this.a.i!=0;case 1:return !!this.b&&this.b.f!=0;case 2:return !!this.c&&this.c.f!=0;case 3:return !this.a&&(this.a=new u3d(this,0)),!e7d(T2d(this.a,(Q8d(),L8d)));case 4:return !this.a&&(this.a=new u3d(this,0)),!e7d(T2d(this.a,(Q8d(),M8d)));case 5:return !this.a&&(this.a=new u3d(this,0)),!e7d(T2d(this.a,(Q8d(),O8d)));case 6:return !this.a&&(this.a=new u3d(this,0)),!e7d(T2d(this.a,(Q8d(),P8d)));}return cid(this,a-aLd((Q8d(),K8d)),XKd((this.j&2)==0?K8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.sh=function s9d(a,b){switch(a){case 0:!this.a&&(this.a=new u3d(this,0));d3d(this.a,b);return;case 1:!this.b&&(this.b=new dId((jGd(),fGd),x6,this,1));cId(this.b,b);return;case 2:!this.c&&(this.c=new dId((jGd(),fGd),x6,this,2));cId(this.c,b);return;case 3:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),L8d)));!this.a&&(this.a=new u3d(this,0));b7d(T2d(this.a,L8d),BD(b,14));return;case 4:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),M8d)));!this.a&&(this.a=new u3d(this,0));b7d(T2d(this.a,M8d),BD(b,14));return;case 5:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),O8d)));!this.a&&(this.a=new u3d(this,0));b7d(T2d(this.a,O8d),BD(b,14));return;case 6:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),P8d)));!this.a&&(this.a=new u3d(this,0));b7d(T2d(this.a,P8d),BD(b,14));return;}did(this,a-aLd((Q8d(),K8d)),XKd((this.j&2)==0?K8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b)};_.zh=function t9d(){return Q8d(),K8d};_.Bh=function u9d(a){switch(a){case 0:!this.a&&(this.a=new u3d(this,0));Uxd(this.a);return;case 1:!this.b&&(this.b=new dId((jGd(),fGd),x6,this,1));this.b.c.$b();return;case 2:!this.c&&(this.c=new dId((jGd(),fGd),x6,this,2));this.c.c.$b();return;case 3:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),L8d)));return;case 4:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),M8d)));return;case 5:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),O8d)));return;case 6:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),P8d)));return;}eid(this,a-aLd((Q8d(),K8d)),XKd((this.j&2)==0?K8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.Ib=function v9d(){var a;if((this.j&4)!=0)return Eid(this);a=new Jfb(Eid(this));a.a+=' (mixed: ';Dfb(a,this.a);a.a+=')';return a.a};var Y9=mdb(Mwe,'XMLTypeDocumentRootImpl',669);bcb(1919,704,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1,2024:1},U9d);_.Ih=function V9d(a,b){switch(a.yj()){case 7:case 8:case 9:case 10:case 16:case 22:case 23:case 24:case 25:case 26:case 32:case 33:case 34:case 36:case 37:case 44:case 45:case 50:case 51:case 53:case 55:case 56:case 57:case 58:case 60:case 61:case 4:return b==null?null:fcb(b);case 19:case 28:case 29:case 35:case 38:case 39:case 41:case 46:case 52:case 54:case 5:return GD(b);case 6:return C9d(BD(b,190));case 12:case 47:case 49:case 11:return Vmd(this,a,b);case 13:return b==null?null:qgb(BD(b,240));case 15:case 14:return b==null?null:D9d(Edb(ED(b)));case 17:return E9d((Q8d(),b));case 18:return E9d(b);case 21:case 20:return b==null?null:F9d(BD(b,155).a);case 27:return G9d(BD(b,190));case 30:return H9d((Q8d(),BD(b,15)));case 31:return H9d(BD(b,15));case 40:return K9d((Q8d(),b));case 42:return I9d((Q8d(),b));case 43:return I9d(b);case 59:case 48:return J9d((Q8d(),b));default:throw vbb(new Wdb(tte+a.ne()+ute));}};_.Jh=function W9d(a){var b,c,d,e,f;switch(a.G==-1&&(a.G=(c=bKd(a),c?HLd(c.Mh(),a):-1)),a.G){case 0:return b=new R8d,b;case 1:return d=new _8d,d;case 2:return e=new i9d,e;case 3:return f=new o9d,f;default:throw vbb(new Wdb(xte+a.zb+ute));}};_.Kh=function X9d(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;switch(a.yj()){case 5:case 52:case 4:return b;case 6:return L9d(b);case 8:case 7:return b==null?null:B9d(b);case 9:return b==null?null:Scb(Icb((d=Qge(b,true),d.length>0&&(BCb(0,d.length),d.charCodeAt(0)==43)?d.substr(1):d),-128,127)<<24>>24);case 10:return b==null?null:Scb(Icb((e=Qge(b,true),e.length>0&&(BCb(0,e.length),e.charCodeAt(0)==43)?e.substr(1):e),-128,127)<<24>>24);case 11:return GD(Wmd(this,(Q8d(),w8d),b));case 12:return GD(Wmd(this,(Q8d(),x8d),b));case 13:return b==null?null:new tgb(Qge(b,true));case 15:case 14:return M9d(b);case 16:return GD(Wmd(this,(Q8d(),y8d),b));case 17:return N9d((Q8d(),b));case 18:return N9d(b);case 28:case 29:case 35:case 38:case 39:case 41:case 54:case 19:return Qge(b,true);case 21:case 20:return O9d(b);case 22:return GD(Wmd(this,(Q8d(),z8d),b));case 23:return GD(Wmd(this,(Q8d(),A8d),b));case 24:return GD(Wmd(this,(Q8d(),B8d),b));case 25:return GD(Wmd(this,(Q8d(),C8d),b));case 26:return GD(Wmd(this,(Q8d(),D8d),b));case 27:return P9d(b);case 30:return Q9d((Q8d(),b));case 31:return Q9d(b);case 32:return b==null?null:meb(Icb((k=Qge(b,true),k.length>0&&(BCb(0,k.length),k.charCodeAt(0)==43)?k.substr(1):k),Rie,Ohe));case 33:return b==null?null:new Ygb((l=Qge(b,true),l.length>0&&(BCb(0,l.length),l.charCodeAt(0)==43)?l.substr(1):l));case 34:return b==null?null:meb(Icb((m=Qge(b,true),m.length>0&&(BCb(0,m.length),m.charCodeAt(0)==43)?m.substr(1):m),Rie,Ohe));case 36:return b==null?null:Aeb(Jcb((n=Qge(b,true),n.length>0&&(BCb(0,n.length),n.charCodeAt(0)==43)?n.substr(1):n)));case 37:return b==null?null:Aeb(Jcb((o=Qge(b,true),o.length>0&&(BCb(0,o.length),o.charCodeAt(0)==43)?o.substr(1):o)));case 40:return T9d((Q8d(),b));case 42:return R9d((Q8d(),b));case 43:return R9d(b);case 44:return b==null?null:new Ygb((p=Qge(b,true),p.length>0&&(BCb(0,p.length),p.charCodeAt(0)==43)?p.substr(1):p));case 45:return b==null?null:new Ygb((q=Qge(b,true),q.length>0&&(BCb(0,q.length),q.charCodeAt(0)==43)?q.substr(1):q));case 46:return Qge(b,false);case 47:return GD(Wmd(this,(Q8d(),E8d),b));case 59:case 48:return S9d((Q8d(),b));case 49:return GD(Wmd(this,(Q8d(),G8d),b));case 50:return b==null?null:Web(Icb((r=Qge(b,true),r.length>0&&(BCb(0,r.length),r.charCodeAt(0)==43)?r.substr(1):r),awe,32767)<<16>>16);case 51:return b==null?null:Web(Icb((f=Qge(b,true),f.length>0&&(BCb(0,f.length),f.charCodeAt(0)==43)?f.substr(1):f),awe,32767)<<16>>16);case 53:return GD(Wmd(this,(Q8d(),J8d),b));case 55:return b==null?null:Web(Icb((g=Qge(b,true),g.length>0&&(BCb(0,g.length),g.charCodeAt(0)==43)?g.substr(1):g),awe,32767)<<16>>16);case 56:return b==null?null:Web(Icb((h=Qge(b,true),h.length>0&&(BCb(0,h.length),h.charCodeAt(0)==43)?h.substr(1):h),awe,32767)<<16>>16);case 57:return b==null?null:Aeb(Jcb((i=Qge(b,true),i.length>0&&(BCb(0,i.length),i.charCodeAt(0)==43)?i.substr(1):i)));case 58:return b==null?null:Aeb(Jcb((j=Qge(b,true),j.length>0&&(BCb(0,j.length),j.charCodeAt(0)==43)?j.substr(1):j)));case 60:return b==null?null:meb(Icb((c=Qge(b,true),c.length>0&&(BCb(0,c.length),c.charCodeAt(0)==43)?c.substr(1):c),Rie,Ohe));case 61:return b==null?null:meb(Icb(Qge(b,true),Rie,Ohe));default:throw vbb(new Wdb(tte+a.ne()+ute));}};var w9d,x9d,y9d,z9d;var Z9=mdb(Mwe,'XMLTypeFactoryImpl',1919);bcb(586,179,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1,1945:1,586:1},cae);_.N=false;_.O=false;var Z9d=false;var Yab=mdb(Mwe,'XMLTypePackageImpl',586);bcb(1852,1,{837:1},fae);_._j=function gae(){return Uge(),Tge};var iab=mdb(Mwe,'XMLTypePackageImpl/1',1852);bcb(1861,1,nwe,hae);_.wj=function iae(a){return ND(a)};_.xj=function jae(a){return KC(ZI,nie,2,a,6,1)};var $9=mdb(Mwe,'XMLTypePackageImpl/10',1861);bcb(1862,1,nwe,kae);_.wj=function lae(a){return ND(a)};_.xj=function mae(a){return KC(ZI,nie,2,a,6,1)};var _9=mdb(Mwe,'XMLTypePackageImpl/11',1862);bcb(1863,1,nwe,nae);_.wj=function oae(a){return ND(a)};_.xj=function pae(a){return KC(ZI,nie,2,a,6,1)};var aab=mdb(Mwe,'XMLTypePackageImpl/12',1863);bcb(1864,1,nwe,qae);_.wj=function rae(a){return LD(a)};_.xj=function sae(a){return KC(BI,nie,333,a,7,1)};var bab=mdb(Mwe,'XMLTypePackageImpl/13',1864);bcb(1865,1,nwe,tae);_.wj=function uae(a){return ND(a)};_.xj=function vae(a){return KC(ZI,nie,2,a,6,1)};var cab=mdb(Mwe,'XMLTypePackageImpl/14',1865);bcb(1866,1,nwe,wae);_.wj=function xae(a){return JD(a,15)};_.xj=function yae(a){return KC(yK,eme,15,a,0,1)};var dab=mdb(Mwe,'XMLTypePackageImpl/15',1866);bcb(1867,1,nwe,zae);_.wj=function Aae(a){return JD(a,15)};_.xj=function Bae(a){return KC(yK,eme,15,a,0,1)};var eab=mdb(Mwe,'XMLTypePackageImpl/16',1867);bcb(1868,1,nwe,Cae);_.wj=function Dae(a){return ND(a)};_.xj=function Eae(a){return KC(ZI,nie,2,a,6,1)};var fab=mdb(Mwe,'XMLTypePackageImpl/17',1868);bcb(1869,1,nwe,Fae);_.wj=function Gae(a){return JD(a,155)};_.xj=function Hae(a){return KC(FI,nie,155,a,0,1)};var gab=mdb(Mwe,'XMLTypePackageImpl/18',1869);bcb(1870,1,nwe,Iae);_.wj=function Jae(a){return ND(a)};_.xj=function Kae(a){return KC(ZI,nie,2,a,6,1)};var hab=mdb(Mwe,'XMLTypePackageImpl/19',1870);bcb(1853,1,nwe,Lae);_.wj=function Mae(a){return JD(a,843)};_.xj=function Nae(a){return KC(Q9,Uhe,843,a,0,1)};var tab=mdb(Mwe,'XMLTypePackageImpl/2',1853);bcb(1871,1,nwe,Oae);_.wj=function Pae(a){return ND(a)};_.xj=function Qae(a){return KC(ZI,nie,2,a,6,1)};var jab=mdb(Mwe,'XMLTypePackageImpl/20',1871);bcb(1872,1,nwe,Rae);_.wj=function Sae(a){return ND(a)};_.xj=function Tae(a){return KC(ZI,nie,2,a,6,1)};var kab=mdb(Mwe,'XMLTypePackageImpl/21',1872);bcb(1873,1,nwe,Uae);_.wj=function Vae(a){return ND(a)};_.xj=function Wae(a){return KC(ZI,nie,2,a,6,1)};var lab=mdb(Mwe,'XMLTypePackageImpl/22',1873);bcb(1874,1,nwe,Xae);_.wj=function Yae(a){return ND(a)};_.xj=function Zae(a){return KC(ZI,nie,2,a,6,1)};var mab=mdb(Mwe,'XMLTypePackageImpl/23',1874);bcb(1875,1,nwe,$ae);_.wj=function _ae(a){return JD(a,190)};_.xj=function abe(a){return KC(SD,nie,190,a,0,2)};var nab=mdb(Mwe,'XMLTypePackageImpl/24',1875);bcb(1876,1,nwe,bbe);_.wj=function cbe(a){return ND(a)};_.xj=function dbe(a){return KC(ZI,nie,2,a,6,1)};var oab=mdb(Mwe,'XMLTypePackageImpl/25',1876);bcb(1877,1,nwe,ebe);_.wj=function fbe(a){return ND(a)};_.xj=function gbe(a){return KC(ZI,nie,2,a,6,1)};var pab=mdb(Mwe,'XMLTypePackageImpl/26',1877);bcb(1878,1,nwe,hbe);_.wj=function ibe(a){return JD(a,15)};_.xj=function jbe(a){return KC(yK,eme,15,a,0,1)};var qab=mdb(Mwe,'XMLTypePackageImpl/27',1878);bcb(1879,1,nwe,kbe);_.wj=function lbe(a){return JD(a,15)};_.xj=function mbe(a){return KC(yK,eme,15,a,0,1)};var rab=mdb(Mwe,'XMLTypePackageImpl/28',1879);bcb(1880,1,nwe,nbe);_.wj=function obe(a){return ND(a)};_.xj=function pbe(a){return KC(ZI,nie,2,a,6,1)};var sab=mdb(Mwe,'XMLTypePackageImpl/29',1880);bcb(1854,1,nwe,qbe);_.wj=function rbe(a){return JD(a,667)};_.xj=function sbe(a){return KC(S9,Uhe,2021,a,0,1)};var Eab=mdb(Mwe,'XMLTypePackageImpl/3',1854);bcb(1881,1,nwe,tbe);_.wj=function ube(a){return JD(a,19)};_.xj=function vbe(a){return KC(JI,nie,19,a,0,1)};var uab=mdb(Mwe,'XMLTypePackageImpl/30',1881);bcb(1882,1,nwe,wbe);_.wj=function xbe(a){return ND(a)};_.xj=function ybe(a){return KC(ZI,nie,2,a,6,1)};var vab=mdb(Mwe,'XMLTypePackageImpl/31',1882);bcb(1883,1,nwe,zbe);_.wj=function Abe(a){return JD(a,162)};_.xj=function Bbe(a){return KC(MI,nie,162,a,0,1)};var wab=mdb(Mwe,'XMLTypePackageImpl/32',1883);bcb(1884,1,nwe,Cbe);_.wj=function Dbe(a){return ND(a)};_.xj=function Ebe(a){return KC(ZI,nie,2,a,6,1)};var xab=mdb(Mwe,'XMLTypePackageImpl/33',1884);bcb(1885,1,nwe,Fbe);_.wj=function Gbe(a){return ND(a)};_.xj=function Hbe(a){return KC(ZI,nie,2,a,6,1)};var yab=mdb(Mwe,'XMLTypePackageImpl/34',1885);bcb(1886,1,nwe,Ibe);_.wj=function Jbe(a){return ND(a)};_.xj=function Kbe(a){return KC(ZI,nie,2,a,6,1)};var zab=mdb(Mwe,'XMLTypePackageImpl/35',1886);bcb(1887,1,nwe,Lbe);_.wj=function Mbe(a){return ND(a)};_.xj=function Nbe(a){return KC(ZI,nie,2,a,6,1)};var Aab=mdb(Mwe,'XMLTypePackageImpl/36',1887);bcb(1888,1,nwe,Obe);_.wj=function Pbe(a){return JD(a,15)};_.xj=function Qbe(a){return KC(yK,eme,15,a,0,1)};var Bab=mdb(Mwe,'XMLTypePackageImpl/37',1888);bcb(1889,1,nwe,Rbe);_.wj=function Sbe(a){return JD(a,15)};_.xj=function Tbe(a){return KC(yK,eme,15,a,0,1)};var Cab=mdb(Mwe,'XMLTypePackageImpl/38',1889);bcb(1890,1,nwe,Ube);_.wj=function Vbe(a){return ND(a)};_.xj=function Wbe(a){return KC(ZI,nie,2,a,6,1)};var Dab=mdb(Mwe,'XMLTypePackageImpl/39',1890);bcb(1855,1,nwe,Xbe);_.wj=function Ybe(a){return JD(a,668)};_.xj=function Zbe(a){return KC(T9,Uhe,2022,a,0,1)};var Pab=mdb(Mwe,'XMLTypePackageImpl/4',1855);bcb(1891,1,nwe,$be);_.wj=function _be(a){return ND(a)};_.xj=function ace(a){return KC(ZI,nie,2,a,6,1)};var Fab=mdb(Mwe,'XMLTypePackageImpl/40',1891);bcb(1892,1,nwe,bce);_.wj=function cce(a){return ND(a)};_.xj=function dce(a){return KC(ZI,nie,2,a,6,1)};var Gab=mdb(Mwe,'XMLTypePackageImpl/41',1892);bcb(1893,1,nwe,ece);_.wj=function fce(a){return ND(a)};_.xj=function gce(a){return KC(ZI,nie,2,a,6,1)};var Hab=mdb(Mwe,'XMLTypePackageImpl/42',1893);bcb(1894,1,nwe,hce);_.wj=function ice(a){return ND(a)};_.xj=function jce(a){return KC(ZI,nie,2,a,6,1)};var Iab=mdb(Mwe,'XMLTypePackageImpl/43',1894);bcb(1895,1,nwe,kce);_.wj=function lce(a){return ND(a)};_.xj=function mce(a){return KC(ZI,nie,2,a,6,1)};var Jab=mdb(Mwe,'XMLTypePackageImpl/44',1895);bcb(1896,1,nwe,nce);_.wj=function oce(a){return JD(a,184)};_.xj=function pce(a){return KC(UI,nie,184,a,0,1)};var Kab=mdb(Mwe,'XMLTypePackageImpl/45',1896);bcb(1897,1,nwe,qce);_.wj=function rce(a){return ND(a)};_.xj=function sce(a){return KC(ZI,nie,2,a,6,1)};var Lab=mdb(Mwe,'XMLTypePackageImpl/46',1897);bcb(1898,1,nwe,tce);_.wj=function uce(a){return ND(a)};_.xj=function vce(a){return KC(ZI,nie,2,a,6,1)};var Mab=mdb(Mwe,'XMLTypePackageImpl/47',1898);bcb(1899,1,nwe,wce);_.wj=function xce(a){return ND(a)};_.xj=function yce(a){return KC(ZI,nie,2,a,6,1)};var Nab=mdb(Mwe,'XMLTypePackageImpl/48',1899);bcb(nje,1,nwe,zce);_.wj=function Ace(a){return JD(a,184)};_.xj=function Bce(a){return KC(UI,nie,184,a,0,1)};var Oab=mdb(Mwe,'XMLTypePackageImpl/49',nje);bcb(1856,1,nwe,Cce);_.wj=function Dce(a){return JD(a,669)};_.xj=function Ece(a){return KC(U9,Uhe,2023,a,0,1)};var Tab=mdb(Mwe,'XMLTypePackageImpl/5',1856);bcb(1901,1,nwe,Fce);_.wj=function Gce(a){return JD(a,162)};_.xj=function Hce(a){return KC(MI,nie,162,a,0,1)};var Qab=mdb(Mwe,'XMLTypePackageImpl/50',1901);bcb(1902,1,nwe,Ice);_.wj=function Jce(a){return ND(a)};_.xj=function Kce(a){return KC(ZI,nie,2,a,6,1)};var Rab=mdb(Mwe,'XMLTypePackageImpl/51',1902);bcb(1903,1,nwe,Lce);_.wj=function Mce(a){return JD(a,19)};_.xj=function Nce(a){return KC(JI,nie,19,a,0,1)};var Sab=mdb(Mwe,'XMLTypePackageImpl/52',1903);bcb(1857,1,nwe,Oce);_.wj=function Pce(a){return ND(a)};_.xj=function Qce(a){return KC(ZI,nie,2,a,6,1)};var Uab=mdb(Mwe,'XMLTypePackageImpl/6',1857);bcb(1858,1,nwe,Rce);_.wj=function Sce(a){return JD(a,190)};_.xj=function Tce(a){return KC(SD,nie,190,a,0,2)};var Vab=mdb(Mwe,'XMLTypePackageImpl/7',1858);bcb(1859,1,nwe,Uce);_.wj=function Vce(a){return KD(a)};_.xj=function Wce(a){return KC(wI,nie,476,a,8,1)};var Wab=mdb(Mwe,'XMLTypePackageImpl/8',1859);bcb(1860,1,nwe,Xce);_.wj=function Yce(a){return JD(a,217)};_.xj=function Zce(a){return KC(xI,nie,217,a,0,1)};var Xab=mdb(Mwe,'XMLTypePackageImpl/9',1860);var $ce,_ce;var fde,gde;var kde;bcb(50,60,Tie,mde);var Zab=mdb(kxe,'RegEx/ParseException',50);bcb(820,1,{},ude);_.sl=function vde(a){return ac*16)throw vbb(new mde(tvd((h0d(),Uue))));c=c*16+e}while(true);if(this.a!=125)throw vbb(new mde(tvd((h0d(),Vue))));if(c>lxe)throw vbb(new mde(tvd((h0d(),Wue))));a=c}else{e=0;if(this.c!=0||(e=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));c=e;nde(this);if(this.c!=0||(e=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));c=c*16+e;a=c}break;case 117:d=0;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;a=b;break;case 118:nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;if(b>lxe)throw vbb(new mde(tvd((h0d(),'parser.descappe.4'))));a=b;break;case 65:case 90:case 122:throw vbb(new mde(tvd((h0d(),Xue))));}return a};_.ul=function xde(a){var b,c;switch(a){case 100:c=(this.e&32)==32?Kfe('Nd',true):(wfe(),cfe);break;case 68:c=(this.e&32)==32?Kfe('Nd',false):(wfe(),jfe);break;case 119:c=(this.e&32)==32?Kfe('IsWord',true):(wfe(),sfe);break;case 87:c=(this.e&32)==32?Kfe('IsWord',false):(wfe(),lfe);break;case 115:c=(this.e&32)==32?Kfe('IsSpace',true):(wfe(),nfe);break;case 83:c=(this.e&32)==32?Kfe('IsSpace',false):(wfe(),kfe);break;default:throw vbb(new hz((b=a,mxe+b.toString(16))));}return c};_.vl=function zde(a){var b,c,d,e,f,g,h,i,j,k,l,m;this.b=1;nde(this);b=null;if(this.c==0&&this.a==94){nde(this);if(a){k=(wfe(),wfe(),++vfe,new $fe(5))}else{b=(wfe(),wfe(),++vfe,new $fe(4));Ufe(b,0,lxe);k=(null,++vfe,new $fe(4))}}else{k=(wfe(),wfe(),++vfe,new $fe(4))}e=true;while((m=this.c)!=1){if(m==0&&this.a==93&&!e)break;e=false;c=this.a;d=false;if(m==10){switch(c){case 100:case 68:case 119:case 87:case 115:case 83:Xfe(k,this.ul(c));d=true;break;case 105:case 73:case 99:case 67:c=this.Ll(k,c);c<0&&(d=true);break;case 112:case 80:l=tde(this,c);if(!l)throw vbb(new mde(tvd((h0d(),Iue))));Xfe(k,l);d=true;break;default:c=this.tl();}}else if(m==20){g=gfb(this.i,58,this.d);if(g<0)throw vbb(new mde(tvd((h0d(),Jue))));h=true;if(bfb(this.i,this.d)==94){++this.d;h=false}f=qfb(this.i,this.d,g);i=Lfe(f,h,(this.e&512)==512);if(!i)throw vbb(new mde(tvd((h0d(),Lue))));Xfe(k,i);d=true;if(g+1>=this.j||bfb(this.i,g+1)!=93)throw vbb(new mde(tvd((h0d(),Jue))));this.d=g+2}nde(this);if(!d){if(this.c!=0||this.a!=45){Ufe(k,c,c)}else{nde(this);if((m=this.c)==1)throw vbb(new mde(tvd((h0d(),Kue))));if(m==0&&this.a==93){Ufe(k,c,c);Ufe(k,45,45)}else{j=this.a;m==10&&(j=this.tl());nde(this);Ufe(k,c,j)}}}(this.e&zte)==zte&&this.c==0&&this.a==44&&nde(this)}if(this.c==1)throw vbb(new mde(tvd((h0d(),Kue))));if(b){Zfe(b,k);k=b}Yfe(k);Vfe(k);this.b=0;nde(this);return k};_.wl=function Ade(){var a,b,c,d;c=this.vl(false);while((d=this.c)!=7){a=this.a;if(d==0&&(a==45||a==38)||d==4){nde(this);if(this.c!=9)throw vbb(new mde(tvd((h0d(),Que))));b=this.vl(false);if(d==4)Xfe(c,b);else if(a==45)Zfe(c,b);else if(a==38)Wfe(c,b);else throw vbb(new hz('ASSERT'))}else{throw vbb(new mde(tvd((h0d(),Rue))))}}nde(this);return c};_.xl=function Bde(){var a,b;a=this.a-48;b=(wfe(),wfe(),++vfe,new Hge(12,null,a));!this.g&&(this.g=new Wvb);Tvb(this.g,new cge(a));nde(this);return b};_.yl=function Cde(){nde(this);return wfe(),ofe};_.zl=function Dde(){nde(this);return wfe(),mfe};_.Al=function Ede(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Bl=function Fde(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Cl=function Gde(){nde(this);return Ife()};_.Dl=function Hde(){nde(this);return wfe(),qfe};_.El=function Ide(){nde(this);return wfe(),tfe};_.Fl=function Jde(){var a;if(this.d>=this.j||((a=bfb(this.i,this.d++))&65504)!=64)throw vbb(new mde(tvd((h0d(),Eue))));nde(this);return wfe(),wfe(),++vfe,new ige(0,a-64)};_.Gl=function Kde(){nde(this);return Jfe()};_.Hl=function Lde(){nde(this);return wfe(),ufe};_.Il=function Mde(){var a;a=(wfe(),wfe(),++vfe,new ige(0,105));nde(this);return a};_.Jl=function Nde(){nde(this);return wfe(),rfe};_.Kl=function Ode(){nde(this);return wfe(),pfe};_.Ll=function Pde(a,b){return this.tl()};_.Ml=function Qde(){nde(this);return wfe(),hfe};_.Nl=function Rde(){var a,b,c,d,e;if(this.d+1>=this.j)throw vbb(new mde(tvd((h0d(),Bue))));d=-1;b=null;a=bfb(this.i,this.d);if(49<=a&&a<=57){d=a-48;!this.g&&(this.g=new Wvb);Tvb(this.g,new cge(d));++this.d;if(bfb(this.i,this.d)!=41)throw vbb(new mde(tvd((h0d(),yue))));++this.d}else{a==63&&--this.d;nde(this);b=qde(this);switch(b.e){case 20:case 21:case 22:case 23:break;case 8:if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));break;default:throw vbb(new mde(tvd((h0d(),Cue))));}}nde(this);e=rde(this);c=null;if(e.e==2){if(e.em()!=2)throw vbb(new mde(tvd((h0d(),Due))));c=e.am(1);e=e.am(0)}if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return wfe(),wfe(),++vfe,new vge(d,b,e,c)};_.Ol=function Sde(){nde(this);return wfe(),ife};_.Pl=function Tde(){var a;nde(this);a=Cfe(24,rde(this));if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Ql=function Ude(){var a;nde(this);a=Cfe(20,rde(this));if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Rl=function Vde(){var a;nde(this);a=Cfe(22,rde(this));if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Sl=function Wde(){var a,b,c,d,e;a=0;c=0;b=-1;while(this.d=this.j)throw vbb(new mde(tvd((h0d(),zue))));if(b==45){++this.d;while(this.d=this.j)throw vbb(new mde(tvd((h0d(),zue))))}if(b==58){++this.d;nde(this);d=Dfe(rde(this),a,c);if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this)}else if(b==41){++this.d;nde(this);d=Dfe(rde(this),a,c)}else throw vbb(new mde(tvd((h0d(),Aue))));return d};_.Tl=function Xde(){var a;nde(this);a=Cfe(21,rde(this));if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Ul=function Yde(){var a;nde(this);a=Cfe(23,rde(this));if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Vl=function Zde(){var a,b;nde(this);a=this.f++;b=Efe(rde(this),a);if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return b};_.Wl=function $de(){var a;nde(this);a=Efe(rde(this),0);if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Xl=function _de(a){nde(this);if(this.c==5){nde(this);return Bfe(a,(wfe(),wfe(),++vfe,new lge(9,a)))}else return Bfe(a,(wfe(),wfe(),++vfe,new lge(3,a)))};_.Yl=function aee(a){var b;nde(this);b=(wfe(),wfe(),++vfe,new Lge(2));if(this.c==5){nde(this);Kge(b,(null,ffe));Kge(b,a)}else{Kge(b,a);Kge(b,(null,ffe))}return b};_.Zl=function bee(a){nde(this);if(this.c==5){nde(this);return wfe(),wfe(),++vfe,new lge(9,a)}else return wfe(),wfe(),++vfe,new lge(3,a)};_.a=0;_.b=0;_.c=0;_.d=0;_.e=0;_.f=1;_.g=null;_.j=0;var bbb=mdb(kxe,'RegEx/RegexParser',820);bcb(1824,820,{},hee);_.sl=function iee(a){return false};_.tl=function jee(){return eee(this)};_.ul=function lee(a){return fee(a)};_.vl=function mee(a){return gee(this)};_.wl=function nee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.xl=function oee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.yl=function pee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.zl=function qee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Al=function ree(){nde(this);return fee(67)};_.Bl=function see(){nde(this);return fee(73)};_.Cl=function tee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Dl=function uee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.El=function vee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Fl=function wee(){nde(this);return fee(99)};_.Gl=function xee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Hl=function yee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Il=function zee(){nde(this);return fee(105)};_.Jl=function Aee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Kl=function Bee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Ll=function Cee(a,b){return Xfe(a,fee(b)),-1};_.Ml=function Dee(){nde(this);return wfe(),wfe(),++vfe,new ige(0,94)};_.Nl=function Eee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Ol=function Fee(){nde(this);return wfe(),wfe(),++vfe,new ige(0,36)};_.Pl=function Gee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Ql=function Hee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Rl=function Iee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Sl=function Jee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Tl=function Kee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Ul=function Lee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Vl=function Mee(){var a;nde(this);a=Efe(rde(this),0);if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Wl=function Nee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Xl=function Oee(a){nde(this);return Bfe(a,(wfe(),wfe(),++vfe,new lge(3,a)))};_.Yl=function Pee(a){var b;nde(this);b=(wfe(),wfe(),++vfe,new Lge(2));Kge(b,a);Kge(b,(null,ffe));return b};_.Zl=function Qee(a){nde(this);return wfe(),wfe(),++vfe,new lge(3,a)};var cee=null,dee=null;var $ab=mdb(kxe,'RegEx/ParserForXMLSchema',1824);bcb(117,1,yxe,xfe);_.$l=function yfe(a){throw vbb(new hz('Not supported.'))};_._l=function Gfe(){return -1};_.am=function Hfe(a){return null};_.bm=function Mfe(){return null};_.cm=function Pfe(a){};_.dm=function Qfe(a){};_.em=function Rfe(){return 0};_.Ib=function Sfe(){return this.fm(0)};_.fm=function Tfe(a){return this.e==11?'.':''};_.e=0;var Yee,Zee,$ee,_ee,afe,bfe=null,cfe,dfe=null,efe,ffe,gfe=null,hfe,ife,jfe,kfe,lfe,mfe,nfe,ofe,pfe,qfe,rfe,sfe,tfe,ufe,vfe=0;var lbb=mdb(kxe,'RegEx/Token',117);bcb(136,117,{3:1,136:1,117:1},$fe);_.fm=function bge(a){var b,c,d;if(this.e==4){if(this==efe)c='.';else if(this==cfe)c='\\d';else if(this==sfe)c='\\w';else if(this==nfe)c='\\s';else{d=new Hfb;d.a+='[';for(b=0;b0&&(d.a+=',',d);if(this.b[b]===this.b[b+1]){Efb(d,age(this.b[b]))}else{Efb(d,age(this.b[b]));d.a+='-';Efb(d,age(this.b[b+1]))}}d.a+=']';c=d.a}}else{if(this==jfe)c='\\D';else if(this==lfe)c='\\W';else if(this==kfe)c='\\S';else{d=new Hfb;d.a+='[^';for(b=0;b0&&(d.a+=',',d);if(this.b[b]===this.b[b+1]){Efb(d,age(this.b[b]))}else{Efb(d,age(this.b[b]));d.a+='-';Efb(d,age(this.b[b+1]))}}d.a+=']';c=d.a}}return c};_.a=false;_.c=false;var _ab=mdb(kxe,'RegEx/RangeToken',136);bcb(584,1,{584:1},cge);_.a=0;var abb=mdb(kxe,'RegEx/RegexParser/ReferencePosition',584);bcb(583,1,{3:1,583:1},ege);_.Fb=function fge(a){var b;if(a==null)return false;if(!JD(a,583))return false;b=BD(a,583);return dfb(this.b,b.b)&&this.a==b.a};_.Hb=function gge(){return LCb(this.b+'/'+See(this.a))};_.Ib=function hge(){return this.c.fm(this.a)};_.a=0;var cbb=mdb(kxe,'RegEx/RegularExpression',583);bcb(223,117,yxe,ige);_._l=function jge(){return this.a};_.fm=function kge(a){var b,c,d;switch(this.e){case 0:switch(this.a){case 124:case 42:case 43:case 63:case 40:case 41:case 46:case 91:case 123:case 92:d='\\'+HD(this.a&aje);break;case 12:d='\\f';break;case 10:d='\\n';break;case 13:d='\\r';break;case 9:d='\\t';break;case 27:d='\\e';break;default:if(this.a>=Tje){c=(b=this.a>>>0,'0'+b.toString(16));d='\\v'+qfb(c,c.length-6,c.length)}else d=''+HD(this.a&aje);}break;case 8:this==hfe||this==ife?(d=''+HD(this.a&aje)):(d='\\'+HD(this.a&aje));break;default:d=null;}return d};_.a=0;var dbb=mdb(kxe,'RegEx/Token/CharToken',223);bcb(309,117,yxe,lge);_.am=function mge(a){return this.a};_.cm=function nge(a){this.b=a};_.dm=function oge(a){this.c=a};_.em=function pge(){return 1};_.fm=function qge(a){var b;if(this.e==3){if(this.c<0&&this.b<0){b=this.a.fm(a)+'*'}else if(this.c==this.b){b=this.a.fm(a)+'{'+this.c+'}'}else if(this.c>=0&&this.b>=0){b=this.a.fm(a)+'{'+this.c+','+this.b+'}'}else if(this.c>=0&&this.b<0){b=this.a.fm(a)+'{'+this.c+',}'}else throw vbb(new hz('Token#toString(): CLOSURE '+this.c+She+this.b))}else{if(this.c<0&&this.b<0){b=this.a.fm(a)+'*?'}else if(this.c==this.b){b=this.a.fm(a)+'{'+this.c+'}?'}else if(this.c>=0&&this.b>=0){b=this.a.fm(a)+'{'+this.c+','+this.b+'}?'}else if(this.c>=0&&this.b<0){b=this.a.fm(a)+'{'+this.c+',}?'}else throw vbb(new hz('Token#toString(): NONGREEDYCLOSURE '+this.c+She+this.b))}return b};_.b=0;_.c=0;var ebb=mdb(kxe,'RegEx/Token/ClosureToken',309);bcb(821,117,yxe,rge);_.am=function sge(a){return a==0?this.a:this.b};_.em=function tge(){return 2};_.fm=function uge(a){var b;this.b.e==3&&this.b.am(0)==this.a?(b=this.a.fm(a)+'+'):this.b.e==9&&this.b.am(0)==this.a?(b=this.a.fm(a)+'+?'):(b=this.a.fm(a)+(''+this.b.fm(a)));return b};var fbb=mdb(kxe,'RegEx/Token/ConcatToken',821);bcb(1822,117,yxe,vge);_.am=function wge(a){if(a==0)return this.d;if(a==1)return this.b;throw vbb(new hz('Internal Error: '+a))};_.em=function xge(){return !this.b?1:2};_.fm=function yge(a){var b;this.c>0?(b='(?('+this.c+')'):this.a.e==8?(b='(?('+this.a+')'):(b='(?'+this.a);!this.b?(b+=this.d+')'):(b+=this.d+'|'+this.b+')');return b};_.c=0;var gbb=mdb(kxe,'RegEx/Token/ConditionToken',1822);bcb(1823,117,yxe,zge);_.am=function Age(a){return this.b};_.em=function Bge(){return 1};_.fm=function Cge(a){return '(?'+(this.a==0?'':See(this.a))+(this.c==0?'':See(this.c))+':'+this.b.fm(a)+')'};_.a=0;_.c=0;var hbb=mdb(kxe,'RegEx/Token/ModifierToken',1823);bcb(822,117,yxe,Dge);_.am=function Ege(a){return this.a};_.em=function Fge(){return 1};_.fm=function Gge(a){var b;b=null;switch(this.e){case 6:this.b==0?(b='(?:'+this.a.fm(a)+')'):(b='('+this.a.fm(a)+')');break;case 20:b='(?='+this.a.fm(a)+')';break;case 21:b='(?!'+this.a.fm(a)+')';break;case 22:b='(?<='+this.a.fm(a)+')';break;case 23:b='(?'+this.a.fm(a)+')';}return b};_.b=0;var ibb=mdb(kxe,'RegEx/Token/ParenToken',822);bcb(521,117,{3:1,117:1,521:1},Hge);_.bm=function Ige(){return this.b};_.fm=function Jge(a){return this.e==12?'\\'+this.a:Wee(this.b)};_.a=0;var jbb=mdb(kxe,'RegEx/Token/StringToken',521);bcb(465,117,yxe,Lge);_.$l=function Mge(a){Kge(this,a)};_.am=function Nge(a){return BD(Uvb(this.a,a),117)};_.em=function Oge(){return !this.a?0:this.a.a.c.length};_.fm=function Pge(a){var b,c,d,e,f;if(this.e==1){if(this.a.a.c.length==2){b=BD(Uvb(this.a,0),117);c=BD(Uvb(this.a,1),117);c.e==3&&c.am(0)==b?(e=b.fm(a)+'+'):c.e==9&&c.am(0)==b?(e=b.fm(a)+'+?'):(e=b.fm(a)+(''+c.fm(a)))}else{f=new Hfb;for(d=0;d=this.c.b:this.a<=this.c.b};_.Sb=function whe(){return this.b>0};_.Tb=function yhe(){return this.b};_.Vb=function Ahe(){return this.b-1};_.Qb=function Bhe(){throw vbb(new cgb(Exe))};_.a=0;_.b=0;var pbb=mdb(Bxe,'ExclusiveRange/RangeIterator',254);var TD=pdb(Fve,'C');var WD=pdb(Ive,'I');var sbb=pdb(Khe,'Z');var XD=pdb(Jve,'J');var SD=pdb(Eve,'B');var UD=pdb(Gve,'D');var VD=pdb(Hve,'F');var rbb=pdb(Kve,'S');var h1=odb('org.eclipse.elk.core.labels','ILabelManager');var O4=odb(Tte,'DiagnosticChain');var u8=odb(pwe,'ResourceSet');var V4=mdb(Tte,'InvocationTargetException',null);var Ihe=(Az(),Dz);var gwtOnLoad=gwtOnLoad=Zbb;Xbb(hcb);$bb('permProps',[[[Fxe,Gxe],[Hxe,'gecko1_8']],[[Fxe,Gxe],[Hxe,'ie10']],[[Fxe,Gxe],[Hxe,'ie8']],[[Fxe,Gxe],[Hxe,'ie9']],[[Fxe,Gxe],[Hxe,'safari']]]); +// -------------- RUN GWT INITIALIZATION CODE -------------- +gwtOnLoad(null, 'elk', null); + +}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],3:[function(require,module,exports){ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +/******************************************************************************* + * Copyright (c) 2021 Kiel University and others. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +var ELK = require('./elk-api.js').default; + +var ELKNode = function (_ELK) { + _inherits(ELKNode, _ELK); + + function ELKNode() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, ELKNode); + + var optionsClone = Object.assign({}, options); + + var workerThreadsExist = false; + try { + require.resolve('web-worker'); + workerThreadsExist = true; + } catch (e) {} + + // user requested a worker + if (options.workerUrl) { + if (workerThreadsExist) { + var Worker = require('web-worker'); + optionsClone.workerFactory = function (url) { + return new Worker(url); + }; + } else { + console.warn('Web worker requested but \'web-worker\' package not installed. \nConsider installing the package or pass your own \'workerFactory\' to ELK\'s constructor.\n... Falling back to non-web worker version.'); + } + } + + // unless no other workerFactory is registered, use the fake worker + if (!optionsClone.workerFactory) { + var _require = require('./elk-worker.min.js'), + _Worker = _require.Worker; + + optionsClone.workerFactory = function (url) { + return new _Worker(url); + }; + } + + return _possibleConstructorReturn(this, (ELKNode.__proto__ || Object.getPrototypeOf(ELKNode)).call(this, optionsClone)); + } + + return ELKNode; +}(ELK); + +Object.defineProperty(module.exports, "__esModule", { + value: true +}); +module.exports = ELKNode; +ELKNode.default = ELKNode; +},{"./elk-api.js":1,"./elk-worker.min.js":2,"web-worker":4}],4:[function(require,module,exports){ +/** + * Copyright 2020 Google LLC + * + * 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. + */ +module.exports = Worker; +},{}]},{},[3])(3) +}); diff --git a/rohd_devtools_extension/bin/rohd_shell.dart b/rohd_devtools_extension/bin/rohd_shell.dart new file mode 100644 index 0000000000..884252dd1e --- /dev/null +++ b/rohd_devtools_extension/bin/rohd_shell.dart @@ -0,0 +1,895 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// rohd_shell.dart +// Terminal client for the target-owned ROHD DTD shell service. +// +// 2026 August +// Author: Desmond Kirkpatrick + +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:dtd/dtd.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/cli/rohd_design_dtd_service.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/cli/rohd_shell_output.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/io_vm_connection_strategy.dart'; + +const _usage = r''' +Usage: rohd-shell --dtd [--json] [shell command] + rohd-shell --dtd [--json] --file + rohd-shell --dtd --list-vms + +With a command, prints one human-readable response. Without one, starts an +interactive shell. With --file, prints one response for each non-empty script +line. Use --json to preserve the complete protocol response for scripts. The +DTD and a debugged ROHD design must be running. Interactive mode supports line +editing and Up/Down command history. Ctrl-C cancels a running command; Ctrl-D +closes the shell. + +When several VMs are registered, select one interactively or use --vm +. The shell uses the typed ROHD design-session protocol only. + +Typed commands: + status + find-cell + find-port + find-ports [root-alias] [transparent] + find-signal + find-cells [root-alias] [transparent] + find-signals [root-alias] [transparent] + fanin [transparent] + fanout [transparent] + name + let = find-cell|find-cells|find-port|find-ports|find-signal|find-signals ... + +Occurrence results are compact address handles. `name` expands one handle with +its path and metadata. Entering `$name` displays an alias directly; lists show +only their count. Hierarchy regex/glob rules are shared with ROHD DevTools +widgets. Use * and ? as glob wildcards, ** to cross any number of hierarchy +levels, and regex operators within a path segment. Unqualified patterns search +at any depth.'''; + +Future main(List arguments) async { + final unknownOption = _unknownOption(arguments); + if (unknownOption != null) { + stderr + ..writeln('rohd-shell: unknown option: $unknownOption') + ..writeln(_usage); + exitCode = 64; + return; + } + final command = _command(arguments); + final jsonOutput = arguments.contains('--json'); + if (command == 'exit' || command == 'quit') { + return; + } + final dtdUri = _dtdUri(arguments); + if (dtdUri == null) { + stderr.writeln(_usage); + exitCode = 64; + return; + } + + final vmSelector = _vmSelector(arguments); + if (arguments.contains('--vm') && vmSelector == null) { + stderr.writeln(_usage); + exitCode = 64; + return; + } + if (arguments.contains('--list-vms')) { + await _listVmServices(dtdUri); + return; + } + final scriptPath = _scriptPath(arguments); + if (arguments.contains('--file') && scriptPath == null) { + stderr.writeln(_usage); + exitCode = 64; + return; + } + if (scriptPath != null && command.isNotEmpty) { + stderr.writeln('rohd-shell: specify a command or --file, not both.'); + exitCode = 64; + return; + } + try { + final session = await _connectTypedShell(dtdUri, vmSelector: vmSelector); + try { + if (scriptPath != null) { + await _executeScriptAndWrite( + session, + await File(scriptPath).readAsString(), + jsonOutput: jsonOutput, + ); + } else if (command.isNotEmpty) { + await _executeAndWrite(session, command, jsonOutput: jsonOutput); + } else { + await _runInteractive(session, jsonOutput: jsonOutput); + } + } finally { + await session.dispose(); + } + } on Object catch (error) { + stderr.writeln('rohd-shell: $error'); + exitCode = 1; + } + exit(exitCode); +} + +String? _unknownOption(List arguments) { + for (var index = 0; index < arguments.length; index++) { + final argument = arguments[index]; + if (argument == '--json' || argument == '--list-vms') { + continue; + } + if (argument == '--dtd' || argument == '--file' || argument == '--vm') { + index++; + continue; + } + if (argument.startsWith('--')) { + return argument; + } + } + return null; +} + +String? _vmSelector(List arguments) { + final vmIndex = arguments.indexOf('--vm'); + if (vmIndex < 0 || vmIndex + 1 >= arguments.length) { + return null; + } + return arguments[vmIndex + 1]; +} + +Uri? _dtdUri(List arguments) { + final dtdIndex = arguments.indexOf('--dtd'); + if (dtdIndex < 0 || dtdIndex + 1 >= arguments.length) { + return null; + } + final uri = Uri.tryParse(arguments[dtdIndex + 1]); + return uri != null && (uri.isScheme('ws') || uri.isScheme('wss')) + ? uri + : null; +} + +String? _scriptPath(List arguments) { + final fileIndex = arguments.indexOf('--file'); + if (fileIndex < 0 || fileIndex + 1 >= arguments.length) { + return null; + } + return arguments[fileIndex + 1]; +} + +String _command(List arguments) { + final words = []; + for (var index = 0; index < arguments.length; index++) { + final argument = arguments[index]; + if (argument == '--json' || argument == '--list-vms') { + continue; + } + if (argument == '--dtd' || argument == '--file' || argument == '--vm') { + index++; + continue; + } + words.add(argument); + } + return words.join(' '); +} + +Future _runInteractive( + _ShellSession session, { + required bool jsonOutput, +}) async { + stdout.writeln('Connected to the ROHD shell. Type `exit` to close.'); + final editor = _TerminalLineEditor(session.completionCandidates); + while (true) { + final input = (await editor.readLine('rohd> '))?.trim(); + if (input == null) { + stdout.writeln(); + return; + } + if (input == 'exit' || input == 'quit') { + return; + } + if (input.isNotEmpty) { + await _executeInteractiveAndWrite(session, input, jsonOutput: jsonOutput); + } + } +} + +Future _executeInteractiveAndWrite( + _ShellSession session, + String input, { + required bool jsonOutput, +}) async { + if (!stdin.hasTerminal) { + await _executeAndWrite(session, input, jsonOutput: jsonOutput); + return; + } + final interrupted = Completer(); + final interruptSubscription = ProcessSignal.sigint.watch().listen((_) { + if (!interrupted.isCompleted) { + interrupted.complete(); + } + }); + final command = session.execute(input); + try { + final outcome = + await Future.any<({bool interrupted, Map? response})>([ + command.then((response) => (interrupted: false, response: response)), + interrupted.future.then((_) => (interrupted: true, response: null)), + ]); + if (!outcome.interrupted) { + _writeResponse(outcome.response!, jsonOutput: jsonOutput); + return; + } + await session.cancelActiveCommand(); + try { + await command; + } on Object { + // Closing the command's connection rejects its in-flight request. + } + stdout.writeln('^C'); + } finally { + await interruptSubscription.cancel(); + } +} + +class _TerminalLineEditor { + _TerminalLineEditor(this._completionCandidates); + + final List _history = []; + final Future> Function(String input, int cursor) + _completionCandidates; + final StreamIterator> _input = StreamIterator(stdin); + final List _pendingBytes = []; + + Future readLine(String prompt) async { + if (!stdin.hasTerminal) { + stdout.write(prompt); + return stdin.readLineSync(); + } + + var buffer = ''; + var cursor = 0; + var historyIndex = _history.length; + stdout.write(prompt); + final previousEcho = stdin.echoMode; + final previousLineMode = stdin.lineMode; + stdin + ..echoMode = false + ..lineMode = false; + try { + while (true) { + final byte = await _readByte(); + if (byte < 0) { + return null; + } + switch (byte) { + case 1: + cursor = 0; + case 5: + cursor = buffer.length; + case 3: + return null; + case 4: + if (buffer.isEmpty) { + return null; + } + if (cursor < buffer.length) { + buffer = + buffer.substring(0, cursor) + buffer.substring(cursor + 1); + } + case 11: + buffer = buffer.substring(0, cursor); + case 12: + stdout.write('\x1b[2J\x1b[H'); + case 14: + if (historyIndex < _history.length) { + historyIndex++; + buffer = + historyIndex == _history.length ? '' : _history[historyIndex]; + cursor = buffer.length; + } + case 16: + if (historyIndex > 0) { + buffer = _history[--historyIndex]; + cursor = buffer.length; + } + case 21: + buffer = buffer.substring(cursor); + cursor = 0; + case 23: + final start = _previousWordStart(buffer, cursor); + buffer = buffer.substring(0, start) + buffer.substring(cursor); + cursor = start; + case 10: + case 13: + stdout.writeln(); + if (buffer.isNotEmpty) { + _history.add(buffer); + } + return buffer; + case 8: + case 127: + if (cursor > 0) { + buffer = + buffer.substring(0, cursor - 1) + buffer.substring(cursor); + cursor--; + } + case 9: + final completion = await _complete(buffer, cursor); + buffer = completion.buffer; + cursor = completion.cursor; + if (completion.candidates.isEmpty) { + stdout.write('\x07'); + } else if (completion.showCandidates) { + stdout + ..writeln() + ..writeln(completion.candidates.join(' ')); + } + case 27: + final next = await _readByte(); + final key = next == 91 || next == 79 ? await _readByte() : -1; + switch (key) { + case 65: + if (historyIndex > 0) { + buffer = _history[--historyIndex]; + cursor = buffer.length; + } + case 66: + if (historyIndex < _history.length) { + historyIndex++; + buffer = historyIndex == _history.length + ? '' + : _history[historyIndex]; + cursor = buffer.length; + } + case 67: + if (cursor < buffer.length) { + cursor++; + } + case 68: + if (cursor > 0) { + cursor--; + } + case 72: + cursor = 0; + case 70: + cursor = buffer.length; + case 51: + if (await _readByte() == 126 && cursor < buffer.length) { + buffer = buffer.substring(0, cursor) + + buffer.substring(cursor + 1); + } + } + default: + if (byte >= 32) { + final character = String.fromCharCode(byte); + buffer = buffer.substring(0, cursor) + + character + + buffer.substring(cursor); + cursor++; + } + } + _redraw(prompt, buffer, cursor); + } + } finally { + stdin + ..echoMode = previousEcho + ..lineMode = previousLineMode; + } + } + + Future< + ({ + String buffer, + int cursor, + List candidates, + bool showCandidates + })> _complete(String buffer, int cursor) async { + final candidates = await _completionCandidates(buffer, cursor); + if (candidates.isEmpty) { + return ( + buffer: buffer, + cursor: cursor, + candidates: candidates, + showCandidates: false, + ); + } + final start = _tokenStart(buffer, cursor); + final prefix = buffer.substring(start, cursor); + final replacement = _sharedPrefix(candidates); + if (replacement.length > prefix.length) { + return ( + buffer: + buffer.substring(0, start) + replacement + buffer.substring(cursor), + cursor: start + replacement.length, + candidates: candidates, + showCandidates: false, + ); + } + return ( + buffer: buffer, + cursor: cursor, + candidates: candidates, + showCandidates: candidates.length > 1, + ); + } + + static int _tokenStart(String input, int cursor) { + var start = cursor.clamp(0, input.length); + while (start > 0 && !RegExp(r'\s').hasMatch(input[start - 1])) { + start--; + } + return start; + } + + static String _sharedPrefix(Iterable candidates) { + final values = candidates.toList(growable: false); + if (values.isEmpty) { + return ''; + } + var prefix = values.first; + for (final value in values.skip(1)) { + var length = 0; + while (length < prefix.length && + length < value.length && + prefix.codeUnitAt(length) == value.codeUnitAt(length)) { + length++; + } + prefix = prefix.substring(0, length); + } + return prefix; + } + + Future _readByte() async { + if (_pendingBytes.isNotEmpty) { + return _pendingBytes.removeAt(0); + } + if (!await _input.moveNext()) { + return -1; + } + _pendingBytes.addAll(_input.current); + return _pendingBytes.removeAt(0); + } + + static int _previousWordStart(String buffer, int cursor) { + var start = cursor; + while (start > 0 && buffer[start - 1].trim().isEmpty) { + start--; + } + while (start > 0 && buffer[start - 1].trim().isNotEmpty) { + start--; + } + return start; + } + + void _redraw(String prompt, String buffer, int cursor) { + stdout.write('\r$prompt$buffer\x1b[K'); + final remaining = buffer.length - cursor; + if (remaining > 0) { + stdout.write('\x1b[${remaining}D'); + } + } +} + +Future<_ShellSession> _connectTypedShell( + Uri dtdUri, { + String? vmSelector, +}) async { + final dtd = await DartToolingDaemon.connect(dtdUri); + try { + final connected = await _connectTypedTarget(dtdUri, vmSelector: vmSelector); + return _TypedShellSession(dtd, () async { + final commandTarget = await _connectTypedTarget( + dtdUri, + vmSelector: connected.selector, + ); + return commandTarget.target; + }, initialTarget: connected.target); + } catch (_) { + await dtd.close(); + rethrow; + } +} + +class _ConnectedTypedTarget { + const _ConnectedTypedTarget(this.target, this.selector); + + final VmServiceRohdDesignTarget target; + final String selector; +} + +Future _listVmServices(Uri dtdUri) async { + final dtd = await DartToolingDaemon.connect(dtdUri); + try { + final services = (await dtd.getVmServices()).vmServicesInfos; + stdout.writeln( + jsonEncode({ + 'vms': [ + for (final service in services) + { + 'name': service.name, + 'uri': service.uri, + if (service.exposedUri != null) 'exposedUri': service.exposedUri, + }, + ], + }), + ); + } finally { + await dtd.close(); + } +} + +Future<_ConnectedTypedTarget> _connectTypedTarget( + Uri dtdUri, { + String? vmSelector, +}) async { + final directVmUri = _directVmUri(vmSelector); + if (directVmUri != null) { + final target = await _connectTypedVm(directVmUri); + return target; + } + final dtd = await DartToolingDaemon.connect(dtdUri); + try { + var services = (await dtd.getVmServices()).vmServicesInfos; + if (services.isEmpty) { + throw StateError('DTD has no registered VM services.'); + } + var selection = vmSelector; + var candidates = _selectVmServices(services, selection); + if (candidates.isEmpty) { + throw StateError( + 'No DTD VM matches "$vmSelector". Run --list-vms to inspect targets.', + ); + } + if (selection == null && candidates.length > 1) { + final selected = await _chooseVmService(candidates); + selection = selected.name ?? selected.exposedUri ?? selected.uri; + candidates = [selected]; + } + final failures = []; + const attemptCount = 5; + for (var attempt = 1; attempt <= attemptCount; attempt++) { + for (final service in candidates) { + final endpoints = [ + service.uri, + if (service.exposedUri != null) service.exposedUri!, + ]; + for (final vmServiceUri in endpoints) { + VmServiceRohdDesignTarget? target; + try { + final result = await IoVmConnectionStrategy().connect(vmServiceUri); + target = VmServiceRohdDesignTarget( + result.vmService, + result.isolateId, + ); + await target.register(); + return _ConnectedTypedTarget( + target, + selection ?? service.name ?? service.uri, + ); + } on Object catch (error) { + await target?.vmService.dispose(); + failures.add('${service.name ?? vmServiceUri}: $error'); + } + } + } + if (attempt == attemptCount) { + break; + } + await Future.delayed(const Duration(milliseconds: 500)); + services = (await dtd.getVmServices()).vmServicesInfos; + candidates = _selectVmServices(services, selection); + if (candidates.isEmpty) { + failures.add('DTD no longer reports "$selection".'); + } + } + throw StateError( + 'Selected ROHD VM did not become available after $attemptCount ' + 'attempts. ${failures.join('; ')}', + ); + } finally { + await dtd.close(); + } +} + +/// Connects to an explicitly selected VM service without DTD discovery. +Future<_ConnectedTypedTarget> _connectTypedVm(String vmServiceUri) async { + VmServiceRohdDesignTarget? target; + try { + final result = await IoVmConnectionStrategy().connect(vmServiceUri); + target = VmServiceRohdDesignTarget(result.vmService, result.isolateId); + await target.register(); + return _ConnectedTypedTarget(target, vmServiceUri); + } on Object { + await target?.vmService.dispose(); + rethrow; + } +} + +/// Returns [selector] when it is a direct VM service endpoint. +String? _directVmUri(String? selector) { + final uri = selector == null ? null : Uri.tryParse(selector); + if (uri == null || uri.host.isEmpty) { + return null; + } + return uri.isScheme('ws') || + uri.isScheme('wss') || + uri.isScheme('http') || + uri.isScheme('https') + ? selector + : null; +} + +Future _chooseVmService(List services) async { + if (!stdin.hasTerminal) { + throw StateError( + 'Multiple DTD VM services are available. Specify --vm .', + ); + } + stdout.writeln('Available ROHD VM services:'); + for (var index = 0; index < services.length; index++) { + final service = services[index]; + final uri = service.exposedUri ?? service.uri; + stdout.writeln(' ${index + 1}. ${service.name ?? 'Unnamed VM'} ($uri)'); + } + final editor = _TerminalLineEditor((_, __) async => const []); + while (true) { + final input = + (await editor.readLine('Select VM [1-${services.length}]: '))?.trim(); + final selected = input == null ? null : int.tryParse(input); + if (selected != null && selected >= 1 && selected <= services.length) { + return services[selected - 1]; + } + stdout.writeln('Enter a number from 1 to ${services.length}.'); + } +} + +List _selectVmServices( + List services, + String? selector, +) { + if (selector == null) { + return services; + } + return services + .where( + (service) => + service.name == selector || + service.uri == selector || + service.exposedUri == selector, + ) + .toList(); +} + +Future _executeAndWrite( + _ShellSession session, + String input, { + required bool jsonOutput, +}) async { + final result = await session.execute(input); + _writeResponse(result, jsonOutput: jsonOutput); +} + +Future _executeScriptAndWrite( + _ShellSession session, + String script, { + required bool jsonOutput, +}) async { + for (final result in await session.executeScript(script)) { + _writeResponse(result, jsonOutput: jsonOutput); + } +} + +void _writeResponse(Map response, {required bool jsonOutput}) { + if (jsonOutput) { + stdout.writeln(jsonEncode(response)); + return; + } + final output = RohdShellOutput.pretty(response); + if (!stdout.hasTerminal) { + stdout.writeln(output.text); + return; + } + final color = output.isError ? '\x1b[1;31m' : '\x1b[32m'; + stdout.writeln('$color${output.text}\x1b[0m'); +} + +abstract class _ShellSession { + Future> execute(String input); + + Future cancelActiveCommand() async {} + + Future> completionCandidates(String input, int cursor) async => + const []; + + Future>> executeScript(String script) async { + final responses = >[]; + for (final line in script.split(RegExp(r'\r?\n'))) { + final input = line.trim(); + if (input.isEmpty || input.startsWith('#')) { + continue; + } + responses.add(await execute(input)); + } + return responses; + } + + Future dispose(); +} + +class _TypedShellSession extends _ShellSession { + _TypedShellSession( + this._dtd, + this._connectTarget, { + VmServiceRohdDesignTarget? initialTarget, + }) : _initialTarget = initialTarget; + + final DartToolingDaemon _dtd; + final Future Function() _connectTarget; + VmServiceRohdDesignTarget? _initialTarget; + final _sessionId = 'terminal-${DateTime.now().microsecondsSinceEpoch}'; + VmServiceRohdDesignTarget? _activeTarget; + var _cancelRequested = false; + var _disposed = false; + + @override + Future> execute(String input) async { + var response = await _withTarget( + (target) => target.command(_sessionId, input), + ); + response = await _applyDevToolsFormat(input, response); + await _broadcastSentPaths(input, response); + return response; + } + + Future> _applyDevToolsFormat( + String input, + Map response, + ) async { + if (response['ok'] != true || response['result'] is! Map) { + return response; + } + final result = Map.from(response['result']! as Map); + if (result['value'] is! String) { + return response; + } + if (result['path'] is! String || result['width'] is! int) { + final metadata = await _valueMetadata(input); + if (metadata != null) { + result + ..['path'] = metadata['path'] + ..['width'] = metadata['width']; + } + } + final path = result['path']; + if (path is! String) { + return {...response, 'result': result}; + } + try { + final formatResponse = await _dtd.call( + rohdSignalFormatDtdServiceName, + rohdSignalFormatGetDtdMethod, + params: {'path': path}, + ); + final format = formatResponse.result['format']; + if (format is! String) { + return response; + } + result['format'] = format; + return {...response, 'result': result}; + } on Object { + // DevTools is optional; retain local default formatting when absent. + return {...response, 'result': result}; + } + } + + Future?> _valueMetadata(String input) async { + final match = RegExp(r'^\s*get-value\s+(\S+)').firstMatch(input); + if (match == null) { + return null; + } + try { + final response = await _withTarget( + (target) => target.command(_sessionId, 'name ${match.group(1)}'), + ); + final result = response['result']; + if (response['ok'] != true || + result is! Map || + result['path'] is! String || + result['width'] is! int) { + return null; + } + return Map.from(result); + } on Object { + return null; + } + } + + Future _broadcastSentPaths( + String input, + Map response, + ) async { + if (!RegExp(r'^send(?:\s|$)').hasMatch(input.trim()) || + response['ok'] != true) { + return; + } + final result = response['result']; + if (result is! Map || result['paths'] is! List) { + return; + } + final paths = (result['paths'] as List).whereType().toList(); + if (paths.isEmpty) { + return; + } + try { + await _dtd.call( + rohdCrossProbeDtdServiceName, + rohdCrossProbeSendDtdMethod, + params: {'paths': jsonEncode(paths)}, + ); + } on Object { + // The GUI host is optional; target-owned `send` remains successful. + } + } + + Future> _withTarget( + Future> Function(VmServiceRohdDesignTarget target) + operation, + ) async { + if (_disposed) { + throw StateError('The shell session is closed.'); + } + _cancelRequested = false; + VmServiceRohdDesignTarget? target; + try { + target = _initialTarget; + _initialTarget = null; + target ??= await _connectTarget(); + _activeTarget = target; + if (_cancelRequested || _disposed) { + throw StateError('The shell command was cancelled.'); + } + return await operation(target); + } finally { + if (identical(_activeTarget, target)) { + _activeTarget = null; + } + await target?.vmService.dispose(); + } + } + + @override + Future cancelActiveCommand() async { + _cancelRequested = true; + await _activeTarget?.vmService.dispose(); + } + + @override + Future> completionCandidates(String input, int cursor) async { + final response = await _withTarget( + (target) => target.complete(_sessionId, input, cursor), + ); + final items = response['items']; + if (response['ok'] != true || items is! List) { + return const []; + } + return items.whereType().toList(); + } + + @override + Future dispose() async { + _disposed = true; + await cancelActiveCommand(); + await _initialTarget?.vmService.dispose(); + _initialTarget = null; + try { + await _dtd.close().timeout(const Duration(milliseconds: 250)); + } on TimeoutException { + // The shell must not wait indefinitely for a DTD close handshake. + } + } +} diff --git a/rohd_devtools_extension/lib/main.dart b/rohd_devtools_extension/lib/main.dart index 98336fa23e..e90d94d014 100644 --- a/rohd_devtools_extension/lib/main.dart +++ b/rohd_devtools_extension/lib/main.dart @@ -55,47 +55,59 @@ void main() { /// controlled reconnect. void _installMessageInterceptor() { web.window.addEventListener( - 'message', - ((web.MessageEvent e) { - try { - final data = e.data.dartify(); - if (data is! Map) { - return; - } - final type = data['type']; + 'message', + ((web.MessageEvent e) { + try { + final data = e.data.dartify(); + if (data is! Map) { + return; + } + final type = data['type']; - final source = data['source'] ?? '?'; - debugPrint('[ROHD-MSG] type=$type source=$source ' - 'data=${data['data']}'); + final source = data['source'] ?? '?'; + debugPrint( + '[ROHD-MSG] type=$type source=$source ' + 'data=${data['data']}', + ); - if (type == 'forceReload') { - debugPrint('[ROHD-MSG] BLOCKED forceReload — ' - 'triggering graceful reconnection'); - e.stopImmediatePropagation(); + if (type == 'forceReload') { + debugPrint( + '[ROHD-MSG] BLOCKED forceReload — ' + 'triggering graceful reconnection', + ); + e.stopImmediatePropagation(); - // After blocking the page reload, disconnect the stale VM - // service and ask DevTools for the current (restarted) URI. - // A short delay lets the DevTools wrapper finish its own - // transition before we re-request. - Future.delayed(const Duration(milliseconds: 300), () async { - try { - if (serviceManager.connectedState.value.connected) { - debugPrint('[ROHD-MSG] Disconnecting stale VM...'); - await serviceManager.manuallyDisconnect(); - } - debugPrint('[ROHD-MSG] Requesting fresh VM URI ' - 'from DevTools...'); - extensionManager.postMessageToDevTools(DevToolsExtensionEvent( - DevToolsExtensionEventType.vmServiceConnection)); - } on Object catch (err) { - debugPrint('[ROHD-MSG] Reconnection request ' - 'failed: $err'); + // After blocking the page reload, disconnect the stale VM + // service and ask DevTools for the current (restarted) URI. + // A short delay lets the DevTools wrapper finish its own + // transition before we re-request. + Future.delayed(const Duration(milliseconds: 300), () async { + try { + if (serviceManager.connectedState.value.connected) { + debugPrint('[ROHD-MSG] Disconnecting stale VM...'); + await serviceManager.manuallyDisconnect(); } - }); - return; - } - } on Object catch (_) {} - }).toJS); + debugPrint( + '[ROHD-MSG] Requesting fresh VM URI ' + 'from DevTools...', + ); + extensionManager.postMessageToDevTools( + DevToolsExtensionEvent( + DevToolsExtensionEventType.vmServiceConnection, + ), + ); + } on Object catch (err) { + debugPrint( + '[ROHD-MSG] Reconnection request ' + 'failed: $err', + ); + } + }); + return; + } + } on Object catch (_) {} + }).toJS, + ); } /// The main ROHD DevTools application. @@ -107,22 +119,27 @@ class RohdDevToolsApp extends StatelessWidget { Widget build(BuildContext context) { debugPrint('[RohdDevToolsApp] Building app widget...'); return DevToolsExtension( - // Reset IdeTheme scaling so extension renders at 1× size - // regardless of the IDE's editor.fontSize setting. - child: Builder(builder: (context) { - final current = ideTheme; - setGlobal( - IdeTheme, - IdeTheme( + // Reset IdeTheme scaling so extension renders at 1× size + // regardless of the IDE's editor.fontSize setting. + child: Builder( + builder: (context) { + final current = ideTheme; + setGlobal( + IdeTheme, + IdeTheme( backgroundColor: current.backgroundColor, foregroundColor: current.foregroundColor, embedMode: current.embedMode, - isDarkMode: current.isDarkMode)); + isDarkMode: current.isDarkMode, + ), + ); - final isDark = Theme.of(context).brightness == Brightness.dark; - final base = isDark ? buildDarkTheme() : buildLightTheme(); + final isDark = Theme.of(context).brightness == Brightness.dark; + final base = isDark ? buildDarkTheme() : buildLightTheme(); - return Theme(data: base, child: const RohdDevToolsPage()); - })); + return Theme(data: base, child: const RohdDevToolsPage()); + }, + ), + ); } } diff --git a/rohd_devtools_extension/lib/rohd_devtools/cli/design_query_language.dart b/rohd_devtools_extension/lib/rohd_devtools/cli/design_query_language.dart new file mode 100644 index 0000000000..92e343d745 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/cli/design_query_language.dart @@ -0,0 +1,158 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// design_query_language.dart +// Typed query language for interactive ROHD design traversal. +// +// 2026 August 7 +// Author: Desmond A. Kirkpatrick + +// RegExp's implementation-only deprecation is incorrectly reported at use +// sites by some Dart analysis-server versions. +// ignore_for_file: deprecated_member_use, unnecessary_ignore + +import 'package:rohd_devtools_extension/rohd_devtools/cli/waveform_cli.dart'; + +import 'package:rohd_schematic_viewer/schematic_connectivity.dart'; + +/// Small typed query language for interactive design traversal. +/// +/// The language intentionally supports handles and query pipelines only; it +/// does not provide control flow, user-defined functions, or file execution. +class DesignQueryLanguage { + /// Creates an evaluator backed by schematic connectivity. + DesignQueryLanguage({required SchematicTraversalCli connectivity}) + : _connectivity = connectivity; + + final SchematicTraversalCli _connectivity; + final Map _handles = {}; + + /// Resolves an alias (`@name` or `$name`) or an address/path to a live signal + /// handle. + SignalOccurrence resolveSignalHandle(String reference) { + final trimmed = reference.trim(); + if (trimmed.startsWith('@') || trimmed.startsWith(r'$')) { + final handle = _handles[trimmed.substring(1)]; + if (handle == null) { + throw FormatException('Unknown signal handle: $trimmed'); + } + return handle; + } + final signal = _connectivity.resolveSignalHandle(trimmed); + if (signal == null) { + throw FormatException('Signal not found: $trimmed'); + } + return signal; + } + + /// Evaluates one query and returns a structured result. + /// + /// Supported forms are: + /// + /// * `select signal ` + /// * `let = select signal ` + /// * `@ | fanin` + /// * `@ | fanin transparent` + /// * `@ | fanout` + /// * `@ | fanout transparent` + /// * `select signal | fanin|fanout` + DesignQueryResult evaluate(String input) { + final assignment = RegExp( + r'^let\s+([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.+)$', + caseSensitive: false, + ).firstMatch(input.trim()); + final expression = assignment?.group(2) ?? input.trim(); + final parts = expression.split('|').map((part) => part.trim()).toList(); + if (parts.isEmpty || parts.any((part) => part.isEmpty)) { + throw const FormatException('A query must contain at least one stage.'); + } + + var value = _selectSignal(parts.first); + for (final stage in parts.skip(1)) { + value = _applyStage(value, stage); + } + if (assignment != null) { + if (value is! SignalOccurrence) { + throw const FormatException('Only a selected signal can be assigned.'); + } + _handles[assignment.group(1)!] = value; + return DesignQueryResult.signal( + CliSignal.fromOccurrence(value), + alias: assignment.group(1), + ); + } + return switch (value) { + final SignalOccurrence signal => DesignQueryResult.signal( + CliSignal.fromOccurrence(signal), + ), + final CliConnectivity connectivity => DesignQueryResult.connectivity( + connectivity, + ), + _ => throw StateError('Unsupported query result.'), + }; + } + + Object _selectSignal(String stage) { + if (stage.startsWith('@')) { + return resolveSignalHandle(stage); + } + final match = RegExp( + r'^select\s+signal\s+(.+)$', + caseSensitive: false, + ).firstMatch(stage); + if (match == null) { + throw const FormatException( + 'Start with `select signal ` or `@`.', + ); + } + return resolveSignalHandle(match.group(1)!); + } + + Object _applyStage(Object value, String stage) { + if (value is! SignalOccurrence) { + throw const FormatException('Only a signal can be traversed.'); + } + return switch (stage.toLowerCase()) { + 'fanin' => _connectivity.faninSignal(value), + 'fanin transparent' => _connectivity.faninSignal( + value, + mode: SchematicTraversalMode.transparent, + ), + 'fanout' => _connectivity.fanoutSignal(value), + 'fanout transparent' => _connectivity.fanoutSignal( + value, + mode: SchematicTraversalMode.transparent, + ), + _ => throw FormatException('Unsupported query stage: $stage'), + }; + } +} + +/// Structured result returned by [DesignQueryLanguage]. +class DesignQueryResult { + const DesignQueryResult._({this.alias, this.signal, this.connectivity}); + + /// Creates a selected signal result. + const DesignQueryResult.signal(CliSignal signal, {String? alias}) + : this._(alias: alias, signal: signal); + + /// Creates a fan-in or fan-out result. + const DesignQueryResult.connectivity(CliConnectivity connectivity) + : this._(connectivity: connectivity); + + /// Alias assigned by a `let` expression, when applicable. + final String? alias; + + /// Selected signal, when the query ends at selection. + final CliSignal? signal; + + /// Connectivity result, when the query ends at traversal. + final CliConnectivity? connectivity; + + /// Converts the result to a JSON-ready object. + Map toJson() => { + if (alias != null) 'alias': alias, + if (signal != null) 'signal': signal!.toJson(), + if (connectivity != null) ...connectivity!.toJson(), + }; +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/cli/rohd_design_dtd_service.dart b/rohd_devtools_extension/lib/rohd_devtools/cli/rohd_design_dtd_service.dart new file mode 100644 index 0000000000..3c18a5af25 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/cli/rohd_design_dtd_service.dart @@ -0,0 +1,277 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// rohd_design_dtd_service.dart +// DTD bridge for the typed ROHD design-session protocol. +// +// 2026 August +// Author: Desmond Kirkpatrick + +import 'dart:async'; +import 'dart:convert'; + +import 'package:dtd/dtd.dart'; +import 'package:rohd/design_session_protocol.dart'; +import 'package:rohd/rohd.dart' show RohdShellService; +import 'package:vm_service/vm_service.dart'; + +/// Sends a typed design-session protocol request to a debug target. +typedef RohdDesignTarget = Future> Function( + String method, + Map parameters, +); + +/// Target-backed command operations used by terminal and GUI clients. +abstract interface class RohdDesignCommandTarget { + /// Executes a canonical target-owned command for [sessionId]. + Future> command(String sessionId, String input); + + /// Returns target-owned completion candidates. + Future> complete( + String sessionId, + String input, + int cursor, + ); +} + +const _targetRequestTimeout = Duration(seconds: 10); + +/// DTD client service that forwards external shell selections to DevTools. +const rohdCrossProbeDtdServiceName = 'rohdCrossProbe'; + +/// Method on [rohdCrossProbeDtdServiceName] that broadcasts signal paths. +const rohdCrossProbeSendDtdMethod = 'send'; + +/// DTD client service that exposes DevTools-selected signal display formats. +const rohdSignalFormatDtdServiceName = 'rohdSignalFormat'; + +/// Method on [rohdSignalFormatDtdServiceName] that resolves one signal path. +const rohdSignalFormatGetDtdMethod = 'get'; + +/// [RohdDesignCommandTarget] implementation for an in-process ROHD design. +/// +/// Demo mode runs the design and DevTools in one isolate, so command execution +/// can use the same target-owned shell service without a DTD or VM connection. +class InProcessRohdDesignTarget implements RohdDesignCommandTarget { + /// Creates a target backed directly by the in-process ROHD shell service. + const InProcessRohdDesignTarget(); + + @override + Future> command(String sessionId, String input) async => + _decode(RohdShellService.executeDesignCommandNow(sessionId, input)); + + @override + Future> complete( + String sessionId, + String input, + int cursor, + ) async => + _decode( + RohdShellService.completeDesignCommandNow(sessionId, input, cursor), + ); + + static Map _decode(String response) => + Map.from(jsonDecode(response) as Map); +} + +/// [RohdDesignCommandTarget] implementation backed by a target VM service. +class VmServiceRohdDesignTarget implements RohdDesignCommandTarget { + /// Creates a target proxy for [vmService] and its [isolateId]. + const VmServiceRohdDesignTarget(this.vmService, this.isolateId); + + /// Target VM service connection. + final VmService vmService; + + /// Isolate that registered the typed design-session extension. + final String isolateId; + + /// Ensures the target has loaded the typed design-session implementation. + Future register() async { + await _diagnosticsLibraryId(); + } + + Future _diagnosticsLibraryId() async { + final isolate = + await vmService.getIsolate(isolateId).timeout(_targetRequestTimeout); + final library = (isolate.libraries ?? const []).where( + (candidate) => + candidate.uri == + 'package:rohd/src/diagnostics/inspector_service.dart', + ); + if (library.isEmpty || library.first.id == null) { + throw StateError('ROHD diagnostics library is not loaded in the target.'); + } + return library.first.id!; + } + + /// Forwards a typed request through debugger evaluation. + Future> call( + String method, + Map parameters, + ) => + _evaluateJson( + 'RohdShellService.executeDesignSessionNow(' + '${_dartStringLiteral(method)}, ' + '${_dartStringLiteral(jsonEncode(parameters))})', + ); + + @override + Future> command(String sessionId, String input) => + _evaluateJson( + 'RohdShellService.executeDesignCommandNow(' + '${_dartStringLiteral(sessionId)}, ${_dartStringLiteral(input)})', + ); + + @override + Future> complete( + String sessionId, + String input, + int cursor, + ) => + _evaluateJson( + 'RohdShellService.completeDesignCommandNow(' + '${_dartStringLiteral(sessionId)}, ${_dartStringLiteral(input)}, ' + '$cursor)', + ); + + Future> _evaluateJson(String expression) async { + final libraryId = await _diagnosticsLibraryId(); + final response = await vmService + .evaluate(isolateId, libraryId, expression) + .timeout(_targetRequestTimeout); + if (response is! InstanceRef) { + throw StateError('Target design-session evaluation returned no string.'); + } + var json = response.valueAsString; + if (json == null || (response.valueAsStringIsTruncated ?? false)) { + final responseId = response.id; + if (responseId != null) { + final fullResponse = await vmService + .getObject(isolateId, responseId) + .timeout(_targetRequestTimeout); + if (fullResponse is Instance) { + json = fullResponse.valueAsString; + } + } + } + if (json == null) { + throw StateError('Target design-session evaluation returned no JSON.'); + } + return Map.from(jsonDecode(json) as Map); + } +} + +/// Encodes [value] as a Dart string literal for debugger evaluation. +String _dartStringLiteral(String value) => + jsonEncode(value).replaceAll(r'$', r'\$'); + +/// DTD service that forwards typed ROHD design-session calls to a target. +/// +/// The DTD boundary uses JSON-ready maps. The target resolves occurrence +/// address DTOs into canonical hierarchy handles. +class RohdDesignDtdService { + /// Creates a DTD bridge that forwards requests to [target]. + RohdDesignDtdService(this.target); + + /// Target endpoint to which protocol calls are forwarded. + RohdDesignTarget target; + Future? _registration; + + /// Registers the protocol's single DTD forwarding method. + Future register(DartToolingDaemon dtd) async { + if (dtd.isClosed) { + throw StateError('Cannot register a design service on a closed DTD.'); + } + final services = await dtd.getRegisteredServices(); + final isRegistered = services.clientServices.any( + (service) => + service.name == RohdDesignSessionProtocol.serviceName && + service.methods.containsKey('call'), + ); + if (isRegistered) { + return; + } + final inProgress = _registration; + if (inProgress != null) { + await inProgress; + return; + } + + final registration = dtd.registerService( + RohdDesignSessionProtocol.serviceName, + 'call', + (parameters) async => { + 'type': 'RohdDesignSessionResponse', + ...await execute( + parameters['method'].asString, + parameters['parameters'].asString, + ), + }, + capabilities: const { + 'rohdDesignSession': RohdDesignSessionProtocol.schemaVersion, + 'commands': ['call'], + 'methods': RohdDesignSessionProtocol.methods, + }, + ); + _registration = registration; + try { + await registration; + } finally { + if (identical(_registration, registration)) { + _registration = null; + } + } + } + + /// Forwards a serialized parameter map to [target]. + /// + /// This method makes the bridge testable without a running DTD daemon. + Future> execute( + String method, + String encodedParameters, + ) async { + try { + final decoded = jsonDecode(encodedParameters); + if (decoded is! Map) { + throw const FormatException('parameters must be a JSON object.'); + } + return await target(method, Map.from(decoded)); + } on FormatException catch (error) { + return _error('invalidArgument', error.message); + } on Object catch (error) { + return _error('internal', error.toString()); + } + } + + Map _error(String code, String message) => { + 'schemaVersion': RohdDesignSessionProtocol.schemaVersion, + 'ok': false, + 'error': {'code': code, 'message': message}, + }; +} + +/// DTD client for the typed design-session protocol. +/// +/// Responses remain DTOs at this boundary. A client resolves returned +/// occurrence addresses against its own hierarchy before using them as handles. +class RohdDesignDtdClient { + /// Creates a client over an established [dtd] connection. + const RohdDesignDtdClient(this.dtd); + + /// DTD connection that hosts [RohdDesignSessionProtocol.serviceName]. + final DartToolingDaemon dtd; + + /// Invokes a typed design-session [method]. + Future> call( + String method, + Map parameters, + ) async { + final response = await dtd.call( + RohdDesignSessionProtocol.serviceName, + 'call', + params: {'method': method, 'parameters': jsonEncode(parameters)}, + ); + final result = Map.from(response.result)..remove('type'); + return result; + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/cli/rohd_shell_dtd_service.dart b/rohd_devtools_extension/lib/rohd_devtools/cli/rohd_shell_dtd_service.dart new file mode 100644 index 0000000000..9254aa36bf --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/cli/rohd_shell_dtd_service.dart @@ -0,0 +1,188 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// rohd_shell_dtd_service.dart +// DTD bridge for the DevTools-owned ROHD design shell. +// +// 2026 August +// Author: Desmond Kirkpatrick + +import 'package:dtd/dtd.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/cli/design_query_language.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/cli/waveform_cli.dart'; + +import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart'; + +/// DTD service hosted by DevTools for executing design shell commands. +/// +/// DevTools supplies diagnostics-loaded netlist data through [configure]. The +/// service keeps aliases and their live occurrence handles in the interpreter +/// until the design changes, at which point the design epoch advances and the +/// interpreter is replaced. +class RohdShellDtdService { + /// The DTD service name advertised by DevTools. + static const serviceName = 'rohdDevtoolsShell'; + + /// Creates a shell DTD service without a loaded design. + RohdShellDtdService({CrossProbeService? crossProbeService}) + : _crossProbeService = crossProbeService; + + Future? _registration; + final CrossProbeService? _crossProbeService; + DesignQueryLanguage? _interpreter; + String? _designName; + var _designEpoch = 0; + + /// Configures the current DevTools design from diagnostics netlist JSON. + void configure(Map netlist, {String? designName}) { + final connectivity = SchematicTraversalCli.fromNetlist(netlist); + _interpreter = DesignQueryLanguage(connectivity: connectivity); + _designName = designName; + _designEpoch++; + } + + /// Clears live design state and invalidates all shell aliases. + void clearDesign() { + _interpreter = null; + _designName = null; + _designEpoch++; + } + + /// Registers the shell service on [dtd]. + /// + /// Re-registering against the same connection is a no-op. A failed + /// registration is not retained, so a later hot reload can retry. DTD + /// unregisters service methods automatically when its client connection + /// closes. + Future register(DartToolingDaemon dtd) async { + if (dtd.isClosed) { + throw StateError('Cannot register a shell service on a closed DTD.'); + } + final services = await dtd.getRegisteredServices(); + final hasExecuteMethod = services.clientServices.any( + (service) => + service.name == serviceName && service.methods.containsKey('execute'), + ); + if (hasExecuteMethod) { + return; + } + final inProgress = _registration; + if (inProgress != null) { + await inProgress; + return; + } + + const capabilities = { + 'rohdDevtoolsShell': 1, + 'commands': ['execute'], + }; + final registration = dtd.registerService( + serviceName, + 'execute', + (parameters) async => { + 'type': 'RohdShellResponse', + ...execute(parameters['input'].asString), + }, + capabilities: capabilities, + ); + _registration = registration; + try { + await registration; + } finally { + if (identical(_registration, registration)) { + _registration = null; + } + } + } + + /// Returns JSON-ready status for DTD clients and embedded shell UI. + Map status() => { + 'schemaVersion': 1, + 'ready': _interpreter != null, + 'designName': _designName, + 'designEpoch': _designEpoch, + 'capabilities': { + 'schematic': _interpreter != null, + 'hierarchy': false, + 'waveform': false, + 'sendSignals': _crossProbeService?.isActive.value ?? false, + }, + 'commands': const [ + 'select signal', + 'let', + 'fanin', + 'fanout', + 'fanin transparent', + 'fanout transparent', + 'send', + ], + }; + + /// Lists commands supported by the current shell protocol. + Map commands() => { + 'schemaVersion': 1, + 'commands': status()['commands'], + }; + + /// Executes one shell input line against the current design session. + Map execute(String input) { + switch (input.trim()) { + case 'status': + return {'ok': true, ...status()}; + case 'commands': + return {'ok': true, ...commands()}; + } + final interpreter = _interpreter; + if (interpreter == null) { + return { + 'ok': false, + 'error': 'No schematic design is loaded in DevTools.', + ...status(), + }; + } + try { + if (input.trimLeft().startsWith('send ')) { + return _sendSignals(interpreter, input); + } + return { + 'ok': true, + 'designEpoch': _designEpoch, + 'result': interpreter.evaluate(input).toJson(), + }; + } on FormatException catch (error) { + return {'ok': false, 'designEpoch': _designEpoch, 'error': error.message}; + } + } + + Map _sendSignals( + DesignQueryLanguage interpreter, + String input, + ) { + final crossProbeService = _crossProbeService; + if (crossProbeService == null || !crossProbeService.isActive.value) { + return { + 'ok': false, + 'designEpoch': _designEpoch, + 'error': 'Signal send is unavailable in this shell session.', + ...status(), + }; + } + final references = input + .trim() + .substring('send'.length) + .split(' ') + .where((reference) => reference.isNotEmpty) + .toList(); + if (references.isEmpty) { + throw const FormatException('Usage: send ...'); + } + final paths = references + .map(interpreter.resolveSignalHandle) + .map((signal) => signal.path()) + .toSet() + .toList() + ..sort(); + crossProbeService.send(paths, source: 'rohd-shell'); + return {'ok': true, 'designEpoch': _designEpoch, 'sentSignals': paths}; + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/cli/rohd_shell_output.dart b/rohd_devtools_extension/lib/rohd_devtools/cli/rohd_shell_output.dart new file mode 100644 index 0000000000..508d644cf0 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/cli/rohd_shell_output.dart @@ -0,0 +1,173 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// rohd_shell_output.dart +// Human-readable presentation for ROHD shell protocol responses. + +import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart' + show SignalValueFormat, SignalValueFormatRegistry; + +/// Resolves the selected display format for a signal occurrence path. +typedef RohdSignalFormatResolver = SignalValueFormat Function(String path); + +/// A formatted ROHD shell response with its presentation status. +class RohdShellOutput { + /// Creates formatted shell [text] with an error status. + const RohdShellOutput({required this.text, required this.isError}); + + /// Converts a structured shell [response] to concise human-readable text. + factory RohdShellOutput.pretty( + Map response, { + RohdSignalFormatResolver? formatForPath, + }) { + if (response['ok'] != true) { + final error = _map(response['error']); + final code = error?['code']; + final message = error?['message']; + final detail = message ?? 'The command did not complete.'; + return RohdShellOutput( + text: code == null ? 'error: $detail' : 'error [$code]: $detail', + isError: true, + ); + } + + final alias = response['alias']; + final result = response['result']; + final commands = response['commands']; + final prefix = alias is String ? 'ok: \$$alias = ' : 'ok: '; + if (commands is List) { + return RohdShellOutput( + text: 'ok: commands\n${_lines(commands.whereType())}', + isError: false, + ); + } + return RohdShellOutput( + text: _formatResult(result, prefix, formatForPath), + isError: false, + ); + } + + /// The human-readable response text. + final String text; + + /// Whether the response represents a command failure. + final bool isError; + + static String _formatResult( + Object? result, + String prefix, + RohdSignalFormatResolver? formatForPath, + ) { + if (result == null) { + return '${prefix}no matching occurrence'; + } + final map = _map(result); + if (map != null) { + if (map.containsKey('value') && map['address'] is String) { + final time = map['time']; + final sampleTime = map['sampleTime']; + final timing = time == null + ? '' + : sampleTime == null + ? ' at $time' + : ' at $time (sampled $sampleTime)'; + final rawValue = map['value']; + final path = map['path']; + final width = map['width']; + final selectedFormat = map['format']; + final displayValue = rawValue is String && width is int + ? _formatValue( + rawValue, + selectedFormat is String + ? SignalValueFormatRegistry.formatFromString( + selectedFormat, + ) ?? + SignalValueFormat.waveform + : path is String + ? formatForPath?.call(path) ?? + SignalValueFormat.waveform + : SignalValueFormat.waveform, + width, + ) + : rawValue; + return '${prefix}value ${_occurrenceLabel(map)} ${map['address']} = ' + '$displayValue$timing'; + } + if (map['path'] is String && map['address'] is String) { + final details = [ + 'path: ${map['path']}', + if (map['name'] != null) 'name: ${map['name']}', + if (map['definition'] != null) 'definition: ${map['definition']}', + if (map['width'] != null) 'width: ${map['width']}', + if (map['direction'] != null) 'direction: ${map['direction']}', + ]; + return '${prefix}occurrence ${_occurrenceLabel(map)} ' + '${map['address']}\n${_lines(details)}'; + } + if (map['address'] is String) { + return '${prefix}occurrence ${_occurrenceLabel(map)} ' + '${map['address']}'; + } + if (map['paths'] is List) { + final count = (map['paths']! as List).whereType().length; + return '${prefix}sent $count ${count == 1 ? 'signal' : 'signals'}'; + } + final items = map['items']; + if (items is List) { + return _formatItems(items, prefix, map['nextPageToken']); + } + if (map.containsKey('ready') || map.containsKey('epoch')) { + return _formatStatus(map, prefix); + } + return '${prefix}result received'; + } + if (result is List) { + return _formatItems(result, prefix, null); + } + return '$prefix$result'; + } + + static String _formatValue( + String value, + SignalValueFormat format, + int width, + ) => + SignalValueFormatRegistry.formatValue(value, format, width); + + static String _formatItems( + List items, + String prefix, + Object? nextPageToken, + ) { + final occurrenceCount = + items.where((item) => _map(item)?['address'] is String).length; + final label = occurrenceCount == 1 ? 'occurrence' : 'occurrences'; + final continuation = nextPageToken == null ? '' : ' (more available)'; + if (occurrenceCount == items.length) { + return '$prefix$occurrenceCount $label$continuation'; + } + return '$prefix${items.length} results$continuation'; + } + + static String _formatStatus(Map result, String prefix) { + final capabilities = result['capabilities']; + final details = [ + if (result['designName'] != null) 'design: ${result['designName']}', + if (result['ready'] != null) 'ready: ${result['ready']}', + if (result['epoch'] != null) 'epoch: ${result['epoch']}', + if (capabilities is List) 'capabilities: ${capabilities.join(', ')}', + ]; + return '$prefix status${details.isEmpty ? '' : '\n${_lines(details)}'}'; + } + + static String _lines(Iterable values) => + values.map((value) => ' $value').join('\n'); + + static String _occurrenceLabel(Map value) { + final kind = value['kind']; + return kind is String ? kind : 'unknown'; + } + + static Map? _map(Object? value) => + value is Map ? value : null; +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/cli/waveform_cli.dart b/rohd_devtools_extension/lib/rohd_devtools/cli/waveform_cli.dart new file mode 100644 index 0000000000..3797ec4196 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/cli/waveform_cli.dart @@ -0,0 +1,310 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause + +import 'dart:convert'; + +import 'package:rohd_devtools_extension/rohd_devtools/models/tree_model.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/tree_data_source.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/waveform_data_source.dart'; +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; +import 'package:rohd_schematic_viewer/schematic_connectivity.dart'; + +/// Read-only hierarchy traversal facade shared by terminal and AI clients. +/// +/// [OccurrenceAddress] is the stable wire identity for hierarchy and waveform +/// queries. Paths are returned as human-readable aliases, never as identity. +class DesignTraversalCli { + /// Creates a hierarchy traversal facade rooted at [root]. + DesignTraversalCli(HierarchyOccurrence root) + : _hierarchy = BaseHierarchyAdapter.fromTree(root); + + final HierarchyService _hierarchy; + + /// Finds all signals whose path matches [pattern]. + List findSignals(String pattern) { + final expression = RegExp(pattern, caseSensitive: false); + final signals = []; + void collect(HierarchyOccurrence occurrence) { + for (final signal in occurrence.signals) { + final path = signal.path(); + if (expression.hasMatch(path)) { + signals.add(CliSignal.fromOccurrence(signal)); + } + } + occurrence.children.forEach(collect); + } + + collect(_hierarchy.root); + signals.sort((left, right) => left.id.compareTo(right.id)); + return signals; + } + + /// Resolves either a dot-string address or a hierarchy/waveform pathname. + CliSignal? resolveSignal(String reference) { + final address = + _tryParseAddress(reference) ?? _hierarchy.pathnameToAddress(reference); + if (address == null) { + return null; + } + final signal = _hierarchy.signalByAddress(address); + return signal == null ? null : CliSignal.fromOccurrence(signal); + } + + OccurrenceAddress? _tryParseAddress(String reference) { + if (!RegExp(r'^\d+(\.\d+)*$').hasMatch(reference)) { + return null; + } + return OccurrenceAddress.fromDotString(reference); + } +} + +/// A signal that can be addressed by the waveform CLI. +class CliSignal { + /// Creates a serializable signal descriptor. + const CliSignal({ + required this.id, + required this.name, + required this.width, + this.direction, + this.address, + }); + + /// Creates a descriptor from an address-assigned hierarchy signal. + factory CliSignal.fromOccurrence(SignalOccurrence signal) => CliSignal( + id: signal.path(), + name: signal.name, + width: signal.width, + direction: signal.direction, + address: signal.address?.toDotString(), + ); + + /// Human-readable canonical hierarchy path. + final String id; + + /// Local signal name. + final String name; + + /// Signal bit width. + final int width; + + /// Port direction, when this signal is a port. + final String? direction; + + /// Stable dot-string [OccurrenceAddress] used on the query wire. + final String? address; + + /// Converts this signal descriptor to a stable JSON object. + Map toJson() => { + 'id': id, + 'name': name, + 'width': width, + if (direction != null) 'direction': direction, + if (address != null) 'address': address, + }; +} + +/// Directed net traversal over schematic connectivity attached to a netlist. +class SchematicTraversalCli { + /// Builds a connectivity query facade from Yosys-compatible netlist JSON. + factory SchematicTraversalCli.fromNetlist(Map netlist) { + final connectivity = + NetlistSchematicConnectivity.fromJson(jsonEncode(netlist)); + return SchematicTraversalCli._(connectivity); + } + + SchematicTraversalCli._(this._connectivity); + + final NetlistSchematicConnectivity _connectivity; + + /// Resolves a signal by dot-string address or hierarchy pathname. + SignalOccurrence? resolveSignalHandle(String reference) { + final address = _tryParseAddress(reference) ?? + _connectivity.hierarchy.pathnameToAddress(reference); + return address == null + ? null + : _connectivity.hierarchy.signalByAddress(address); + } + + /// Returns the endpoints driving [signal]. + CliConnectivity faninSignal( + SignalOccurrence signal, { + SchematicTraversalMode mode = SchematicTraversalMode.opaque, + }) => + CliConnectivity( + direction: 'fanin', + signal: CliSignal.fromOccurrence(signal), + endpoints: _connectivity + .fanin(signal, mode: mode) + .map(CliConnectivityEndpoint.fromSchematicPort) + .toList(), + ); + + /// Returns the endpoints consuming [signal]. + CliConnectivity fanoutSignal( + SignalOccurrence signal, { + SchematicTraversalMode mode = SchematicTraversalMode.opaque, + }) => + CliConnectivity( + direction: 'fanout', + signal: CliSignal.fromOccurrence(signal), + endpoints: _connectivity + .fanout(signal, mode: mode) + .map(CliConnectivityEndpoint.fromSchematicPort) + .toList(), + ); + + OccurrenceAddress? _tryParseAddress(String reference) { + if (!RegExp(r'^\d+(\.\d+)*$').hasMatch(reference)) { + return null; + } + return OccurrenceAddress.fromDotString(reference); + } +} + +/// Serializable connectivity traversal result. +class CliConnectivity { + /// Creates a connectivity result. + const CliConnectivity({ + required this.direction, + required this.signal, + required this.endpoints, + }); + + /// Direction traversed from [signal]: `fanin` or `fanout`. + final String direction; + + /// Signal used as the traversal source. + final CliSignal signal; + + /// Reached schematic endpoints. + final List endpoints; + + /// Converts the result to a JSON-ready object. + Map toJson() => { + 'direction': direction, + 'signal': signal.toJson(), + 'endpoints': endpoints.map((endpoint) => endpoint.toJson()).toList(), + }; +} + +/// Serializable schematic endpoint reached during a connectivity traversal. +class CliConnectivityEndpoint { + /// Creates an endpoint descriptor. + const CliConnectivityEndpoint({ + required this.nodePath, + required this.portId, + required this.direction, + }); + + /// Creates an endpoint descriptor from a schematic traversal endpoint. + factory CliConnectivityEndpoint.fromSchematicPort( + SchematicPortOccurrence endpoint, + ) => + CliConnectivityEndpoint( + nodePath: endpoint.nodePath, + portId: endpoint.portId, + direction: endpoint.direction, + ); + + /// Hierarchical path of the node containing the port. + final String nodePath; + + /// Schematic port identity. + final String portId; + + /// Direction declared for the endpoint port. + final String direction; + + /// Converts the endpoint to a JSON-ready object. + Map toJson() => { + 'nodePath': nodePath, + 'portId': portId, + 'direction': direction, + }; +} + +/// Read-only query facade shared by terminal and AI clients. +class WaveformCli { + /// Creates a read-only waveform query facade. + WaveformCli({ + required WaveformDataSource waveforms, + required Future> Function() loadSignals, + }) : _waveforms = waveforms, + _loadSignals = loadSignals; + + final WaveformDataSource _waveforms; + final Future> Function() _loadSignals; + + /// Returns connection and endpoint information without fetching waveforms. + Future> status() async => { + 'schemaVersion': 1, + 'connected': _waveforms.isConnected, + 'mode': _waveforms.modeDescription, + 'currentTimePs': await _waveforms.getCurrentTime(), + }; + + /// Lists signals matching [pattern], interpreted as a case-insensitive regex. + Future> findSignals(String pattern) async { + final expression = RegExp(pattern, caseSensitive: false); + final signals = await _loadSignals(); + final matches = signals + .where((signal) => expression.hasMatch(signal.id)) + .toList() + ..sort((left, right) => left.id.compareTo(right.id)); + return { + 'schemaVersion': 1, + 'pattern': pattern, + 'signals': matches.map((signal) => signal.toJson()).toList(), + }; + } + + /// Gets the value of [signalId] at or immediately before [timePs]. + Future> valueAt(String signalId, int timePs) async { + final waveforms = await _waveforms.getWaveformData( + signalIds: [signalId], + startTime: 0, + endTime: timePs, + ); + final samples = waveforms + .expand((waveform) => waveform.data) + .where((sample) => sample.time <= timePs) + .toList() + ..sort((left, right) => left.time.compareTo(right.time)); + final sample = samples.isEmpty ? null : samples.last; + return { + 'schemaVersion': 1, + 'signal': signalId, + 'timePs': timePs, + 'value': sample?.value, + 'sampleTimePs': sample?.time, + }; + } +} + +/// Loads CLI signal metadata from the same hierarchy source as DevTools. +Future> loadCliSignals(TreeDataSource tree) async { + final root = await tree.evalModuleTree(); + if (root == null) { + return const []; + } + final signals = []; + void collect(TreeModel node, String path) { + for (final signal in [...node.inputs, ...node.outputs]) { + signals.add( + CliSignal( + id: '$path/${signal.name}', + name: signal.name, + width: signal.width, + direction: signal.direction, + ), + ); + } + for (final child in node.children) { + collect(child, '$path/${child.name}'); + } + } + + collect(root, root.name); + signals.sort((left, right) => left.id.compareTo(right.id)); + return signals; +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/const/app_theme.dart b/rohd_devtools_extension/lib/rohd_devtools/const/app_theme.dart index fac67eab0a..b0a3ae7749 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/const/app_theme.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/const/app_theme.dart @@ -11,9 +11,8 @@ import 'package:material_ui/material_ui.dart'; const _fontFallback = ['Noto Color Emoji']; -TextTheme _withFontFallback(TextTheme theme) => theme.apply( - fontFamilyFallback: _fontFallback, - ); +TextTheme _withFontFallback(TextTheme theme) => + theme.apply(fontFamilyFallback: _fontFallback); /// Dark theme colors class DarkThemeColors { diff --git a/rohd_devtools_extension/lib/rohd_devtools/cubit/cubits.dart b/rohd_devtools_extension/lib/rohd_devtools/cubit/cubits.dart index 18c07803d8..da1e3d9a8c 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/cubit/cubits.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/cubit/cubits.dart @@ -5,6 +5,7 @@ // Barrel file for rohd_devtools cubits. export 'details_tab_cubit.dart'; +export 'hierarchy_cubit.dart'; export 'rohd_service_cubit.dart'; export 'selected_module_cubit.dart'; export 'signal_search_term_cubit.dart'; diff --git a/rohd_devtools_extension/lib/rohd_devtools/cubit/hierarchy_cubit.dart b/rohd_devtools_extension/lib/rohd_devtools/cubit/hierarchy_cubit.dart new file mode 100644 index 0000000000..2b9550314b --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/cubit/hierarchy_cubit.dart @@ -0,0 +1,170 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// hierarchy_cubit.dart +// Unified hierarchy state management for DevTools. This cubit owns the +// HierarchyOccurrence tree and provides it to embedded viewers. +// +// 2026 January Author: Desmond Kirkpatrick + +import 'package:equatable/equatable.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; + +/// State representing the current hierarchy data. +sealed class DevToolsHierarchyState extends Equatable { + const DevToolsHierarchyState(); +} + +/// Initial state - no hierarchy loaded. +class HierarchyNotLoaded extends DevToolsHierarchyState { + /// Constructor for not loaded state. + const HierarchyNotLoaded(); + + @override + List get props => []; +} + +/// Loading state - hierarchy is being loaded. +class HierarchyLoading extends DevToolsHierarchyState { + /// Constructor for loading state. + const HierarchyLoading(); + + @override + List get props => []; +} + +/// Loaded state - hierarchy is available. +class HierarchyLoaded extends DevToolsHierarchyState { + /// The root hierarchy node. + final HierarchyOccurrence root; + + /// The hierarchy service for navigating the tree. + /// Can be used by embedded viewers for signal search, etc. + final HierarchyService? hierarchyService; + + /// Optional selected module. + final HierarchyOccurrence? selectedModule; + + /// Constructor for loaded state. + const HierarchyLoaded({ + required this.root, + this.hierarchyService, + this.selectedModule, + }); + + /// Create a copy of this state with optional new values. + HierarchyLoaded copyWith({ + HierarchyOccurrence? root, + HierarchyService? hierarchyService, + HierarchyOccurrence? selectedModule, + bool clearSelectedModule = false, + }) => + HierarchyLoaded( + root: root ?? this.root, + hierarchyService: hierarchyService ?? this.hierarchyService, + selectedModule: clearSelectedModule + ? null + : (selectedModule ?? this.selectedModule), + ); + + @override + List get props => [ + root.path(), + hierarchyService, + selectedModule?.path(), + ]; +} + +/// Error state - hierarchy loading failed. +class HierarchyError extends DevToolsHierarchyState { + /// Error message. + final String message; + + /// Constructor for error state. + const HierarchyError(this.message); + + @override + List get props => [message]; +} + +/// Cubit that manages the shared hierarchy state for DevTools. +/// +/// This cubit is the single source of truth for hierarchy data. +/// Embedded viewers (Wave Viewer, Schematic Viewer) should listen to +/// this cubit rather than loading their own hierarchy. +class DevToolsHierarchyCubit extends Cubit { + /// Constructor for the cubit, starts with no hierarchy loaded. + DevToolsHierarchyCubit() : super(const HierarchyNotLoaded()); + + /// Load hierarchy from a HierarchyOccurrence (e.g., from ROHD inspector + /// JSON). + /// + /// If no [service] is provided, a [BaseHierarchyAdapter.fromTree] adapter is + /// automatically created to wrap the node tree, enabling signal search and + /// navigation. + void loadFromNode(HierarchyOccurrence root, {HierarchyService? service}) { + // Create a service if not provided - fromTree wraps the tree + final hierarchyService = service ?? BaseHierarchyAdapter.fromTree(root); + emit(HierarchyLoaded(root: root, hierarchyService: hierarchyService)); + } + + /// Load hierarchy from an adapter that implements HierarchyService. + void loadFromAdapter(HierarchyService adapter) { + emit(HierarchyLoaded(root: adapter.root, hierarchyService: adapter)); + } + + /// Set loading state. + void setLoading() { + emit(const HierarchyLoading()); + } + + /// Set error state. + void setError(String message) { + emit(HierarchyError(message)); + } + + /// Clear hierarchy. + void clear() { + emit(const HierarchyNotLoaded()); + } + + /// Select a module in the hierarchy. + void selectModule(HierarchyOccurrence? module) { + final currentState = state; + if (currentState is HierarchyLoaded) { + if (module == null) { + emit(currentState.copyWith(clearSelectedModule: true)); + } else { + emit(currentState.copyWith(selectedModule: module)); + } + } + } + + /// Get the current root node if loaded. + HierarchyOccurrence? get currentRoot { + final currentState = state; + if (currentState is HierarchyLoaded) { + return currentState.root; + } + return null; + } + + /// Get the current hierarchy service if loaded. + HierarchyService? get currentService { + final currentState = state; + if (currentState is HierarchyLoaded) { + return currentState.hierarchyService; + } + return null; + } + + /// Get the currently selected module if any. + HierarchyOccurrence? get selectedModule { + final currentState = state; + if (currentState is HierarchyLoaded) { + return currentState.selectedModule; + } + return null; + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/cubit/rohd_service_cubit.dart b/rohd_devtools_extension/lib/rohd_devtools/cubit/rohd_service_cubit.dart index 6850dcd7b3..a0294c7f05 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/cubit/rohd_service_cubit.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/cubit/rohd_service_cubit.dart @@ -1,4 +1,4 @@ -// Copyright (C) 2025-2026 Intel Corporation +// Copyright (C) 2025 Intel Corporation // SPDX-License-Identifier: BSD-3-Clause // // rohd_service_cubit.dart @@ -16,9 +16,8 @@ import 'package:flutter/foundation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:rohd_devtools_extension/rohd_devtools/models/tree_model.dart'; import 'package:rohd_devtools_extension/rohd_devtools/services/service_manager_bridge.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/services/signal_value_source.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/services/signal_value_source_binding.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/services/tree_service.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/services.dart' + hide serviceManager; import 'package:vm_service/vm_service.dart' as vm; part 'rohd_service_state.dart'; @@ -65,7 +64,9 @@ class RohdServiceCubit extends Cubit { /// Configure a standalone VM service session without relying on the global /// DevTools extension [serviceManager]. Future configureStandaloneVmService( - vm.VmService vmService, String isolateId) async { + vm.VmService vmService, + String isolateId, + ) async { _rohdIsolateId = null; _disposeSignalValueSource(); @@ -79,8 +80,10 @@ class RohdServiceCubit extends Cubit { final localManager = _localServiceManager!; _localServiceClosedSignal = Completer(); - await localManager.vmServiceOpened(vmService, - onClosed: _localServiceClosedSignal!.future); + await localManager.vmServiceOpened( + vmService, + onClosed: _localServiceClosedSignal!.future, + ); final vmInfo = await vmService.getVM(); final isolates = vmInfo.isolates ?? const []; @@ -97,8 +100,10 @@ class RohdServiceCubit extends Cubit { void _onConnectionStateChanged() { final connected = serviceManager.connectedState.value.connected; - debugPrint('[RohdServiceCubit] Connection state changed: ' - 'connected=$connected'); + debugPrint( + '[RohdServiceCubit] Connection state changed: ' + 'connected=$connected', + ); if (connected) { // Reset tree service so we use the new connection treeService = null; @@ -132,21 +137,25 @@ class RohdServiceCubit extends Cubit { Future evalModuleTree() async { debugPrint('[RohdServiceCubit] evalModuleTree called'); await _handleModuleTreeOperation( - (treeService) => treeService.evalModuleTree()); + (treeService) => treeService.evalModuleTree(), + ); } /// Refresh the module tree from the ROHD service. Future refreshModuleTree() async { debugPrint('[RohdServiceCubit] refreshModuleTree called'); await _handleModuleTreeOperation( - (treeService) => treeService.refreshModuleTree()); + (treeService) => treeService.refreshModuleTree(), + ); } Future _handleModuleTreeOperation( - Future Function(TreeService) operation) async { + Future Function(TreeService) operation, + ) async { try { debugPrint( - '[RohdServiceCubit] _handleModuleTreeOperation - emitting loading'); + '[RohdServiceCubit] _handleModuleTreeOperation - emitting loading', + ); emit(RohdServiceLoading()); final activeServiceManager = @@ -154,8 +163,10 @@ class RohdServiceCubit extends Cubit { final activeService = activeServiceManager?.service; if (activeService == null) { - debugPrint('[RohdServiceCubit] ServiceManager is not initialized - ' - 'emitting loaded with null'); + debugPrint( + '[RohdServiceCubit] ServiceManager is not initialized - ' + 'emitting loaded with null', + ); // When not running in DevTools, just emit loaded with null tree // This prevents constant error states and allows the UI to work emit(const RohdServiceLoaded(null)); @@ -174,8 +185,10 @@ class RohdServiceCubit extends Cubit { try { final vmInfo = await service.getVM(); final isolates = vmInfo.isolates ?? []; - debugPrint('[RohdServiceCubit] Scanning ${isolates.length} ' - 'isolate(s) for ROHD library...'); + debugPrint( + '[RohdServiceCubit] Scanning ${isolates.length} ' + 'isolate(s) for ROHD library...', + ); for (final isoRef in isolates) { final id = isoRef.id; @@ -185,21 +198,29 @@ class RohdServiceCubit extends Cubit { try { final iso = await service.getIsolate(id); final libs = iso.libraries ?? []; - debugPrint('[RohdServiceCubit] Isolate ${isoRef.name} ' - '(${isoRef.id}): ${libs.length} libraries'); - final hasRohd = libs.any((lib) => - lib.uri == - 'package:rohd/src/diagnostics/inspector_service.dart'); + debugPrint( + '[RohdServiceCubit] Isolate ${isoRef.name} ' + '(${isoRef.id}): ${libs.length} libraries', + ); + final hasRohd = libs.any( + (lib) => + lib.uri == + 'package:rohd/src/diagnostics/inspector_service.dart', + ); if (hasRohd) { - debugPrint('[RohdServiceCubit] → Found ROHD in ' - '${isoRef.name}'); + debugPrint( + '[RohdServiceCubit] → Found ROHD in ' + '${isoRef.name}', + ); rohdIsolate = ValueNotifier(isoRef); _rohdIsolateId = id; break; } } on Exception catch (e) { - debugPrint('[RohdServiceCubit] Isolate ${isoRef.name} ' - 'scan error: $e'); + debugPrint( + '[RohdServiceCubit] Isolate ${isoRef.name} ' + 'scan error: $e', + ); } } } on Exception catch (e) { @@ -207,21 +228,29 @@ class RohdServiceCubit extends Cubit { } if (rohdIsolate == null) { - debugPrint('[RohdServiceCubit] ROHD isolate not found, ' - 'falling back to selected isolate'); + debugPrint( + '[RohdServiceCubit] ROHD isolate not found, ' + 'falling back to selected isolate', + ); } treeService = TreeService( - EvalOnDartLibrary( - 'package:rohd/src/diagnostics/inspector_service.dart', service, - serviceManager: activeServiceManager!, isolate: rohdIsolate), - Disposable(), - vmService: service, - isolateId: _rohdIsolateId); + EvalOnDartLibrary( + 'package:rohd/src/diagnostics/inspector_service.dart', + service, + serviceManager: activeServiceManager!, + isolate: rohdIsolate, + ), + Disposable(), + vmService: service, + isolateId: _rohdIsolateId, + ); _disposeSignalValueSource(); _signalValueSource = createSignalValueSourceBinding( - treeService: treeService!, vmService: service); + treeService: treeService!, + vmService: service, + ); } debugPrint('[RohdServiceCubit] Calling operation...'); diff --git a/rohd_devtools_extension/lib/rohd_devtools/cubit/standalone_rohd_service_cubit.dart b/rohd_devtools_extension/lib/rohd_devtools/cubit/standalone_rohd_service_cubit.dart new file mode 100644 index 0000000000..64e90147d9 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/cubit/standalone_rohd_service_cubit.dart @@ -0,0 +1,97 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// standalone_rohd_service_cubit.dart +// Cubit for ROHD service in standalone (non-web) mode. +// +// 2026 January +// Author: Desmond Kirkpatrick + +import 'package:equatable/equatable.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/models/tree_model.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/standalone_tree_service.dart'; +import 'package:vm_service/vm_service.dart'; + +part 'standalone_rohd_service_state.dart'; + +/// Cubit for managing ROHD service state in standalone mode. +/// This version uses VmService directly without devtools_app_shared. +class StandaloneRohdServiceCubit extends Cubit { + StandaloneTreeService? _treeService; + VmService? _vmService; + String? _isolateId; + + /// Constructor for [StandaloneRohdServiceCubit]. + StandaloneRohdServiceCubit() : super(StandaloneRohdServiceInitial()); + + /// Initialize with a connected VM service + Future initialize(VmService vmService, String isolateId) async { + _vmService = vmService; + _isolateId = isolateId; + _treeService = StandaloneTreeService( + vmService: vmService, + isolateId: isolateId, + ); + await evalModuleTree(); + } + + /// Check if the cubit is initialized with a VM service + bool get isInitialized => _vmService != null && _isolateId != null; + + /// Evaluate the module tree + Future evalModuleTree() async { + if (!isInitialized) { + emit( + StandaloneRohdServiceError( + 'Not connected to VM service', + StackTrace.current, + ), + ); + return; + } + + try { + emit(StandaloneRohdServiceLoading()); + final treeModel = await _treeService!.evalModuleTree(); + emit(StandaloneRohdServiceLoaded(treeModel)); + } on Exception catch (error, trace) { + emit(StandaloneRohdServiceError(error.toString(), trace)); + } + } + + /// Refresh the module tree + Future refreshModuleTree() async { + if (!isInitialized) { + emit( + StandaloneRohdServiceError( + 'Not connected to VM service', + StackTrace.current, + ), + ); + return; + } + + try { + emit(StandaloneRohdServiceLoading()); + final treeModel = await _treeService!.refreshModuleTree(); + emit(StandaloneRohdServiceLoaded(treeModel)); + } on Exception catch (error, trace) { + emit(StandaloneRohdServiceError(error.toString(), trace)); + } + } + + /// Disconnect and reset state + void disconnect() { + _vmService = null; + _isolateId = null; + _treeService = null; + emit(StandaloneRohdServiceInitial()); + } + + @override + Future close() { + disconnect(); + return super.close(); + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/cubit/standalone_rohd_service_state.dart b/rohd_devtools_extension/lib/rohd_devtools/cubit/standalone_rohd_service_state.dart new file mode 100644 index 0000000000..57d2eb93a3 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/cubit/standalone_rohd_service_state.dart @@ -0,0 +1,52 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// standalone_rohd_service_state.dart +// States for standalone ROHD service. +// +// 2026 January +// Author: Desmond Kirkpatrick + +part of 'standalone_rohd_service_cubit.dart'; + +/// Abstract base class for standalone ROHD service states. +sealed class StandaloneRohdServiceState extends Equatable { + const StandaloneRohdServiceState(); + + @override + List get props => []; +} + +/// Initial state when the service is not yet connected. +class StandaloneRohdServiceInitial extends StandaloneRohdServiceState {} + +/// Loading state when the module tree is being evaluated. +class StandaloneRohdServiceLoading extends StandaloneRohdServiceState {} + +/// Loaded state when the module tree has been successfully evaluated. +class StandaloneRohdServiceLoaded extends StandaloneRohdServiceState { + /// The evaluated module tree model. + final TreeModel? treeModel; + + /// Constructor for [StandaloneRohdServiceLoaded]. + const StandaloneRohdServiceLoaded(this.treeModel); + + @override + List get props => [treeModel]; +} + +/// Error state when there was an issue connecting or evaluating the module +/// tree. +class StandaloneRohdServiceError extends StandaloneRohdServiceState { + /// The error message. + final String error; + + /// The stack trace of the error. + final StackTrace? trace; + + /// Constructor for [StandaloneRohdServiceError]. + const StandaloneRohdServiceError(this.error, [this.trace]); + + @override + List get props => [error, trace]; +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/examples/rohd_examples.dart b/rohd_devtools_extension/lib/rohd_devtools/examples/rohd_examples.dart new file mode 100755 index 0000000000..f543948422 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/examples/rohd_examples.dart @@ -0,0 +1,429 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// rohd_examples.dart +// In-process ROHD example designs for loopback mode. +// +// Each example builds a real ROHD module, initializes in-memory hierarchy and +// waveform services, runs simulation, and keeps the event loop alive so the +// DevTools UI can query data via direct calls. +// +// 2026 April +// Author: Desmond Kirkpatrick + +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:rohd/examples.dart'; +import 'package:rohd/rohd.dart'; + +/// Descriptor for a launchable in-process ROHD example. +class RohdExample { + /// Human-readable display name. + final String name; + + /// Async function that builds, simulates, and keeps alive. + /// + /// Returns a [Completer] that the shell can complete to shut down the + /// example (e.g. when switching examples or disconnecting). + final Future> Function() launcher; + + /// Creates a launchable in-process ROHD example descriptor. + const RohdExample({required this.name, required this.launcher}); +} + +/// All available in-process ROHD examples. +/// +/// Add new entries here and they'll appear in the demo-mode picker. +final rohdExamples = [ + const RohdExample(name: 'Counter (8-bit)', launcher: launchCounter), + const RohdExample(name: 'Oven FSM', launcher: launchOvenFsm), + const RohdExample(name: 'Tree (8×8-bit max)', launcher: launchTree), + const RohdExample(name: 'FilterBank', launcher: launchFilterBank), +]; + +/// Initializes the in-memory services used by an in-process DevTools example. +/// +/// The browser cannot create the VCD file used by [Module.dumpWaves], so these +/// examples record waveform data directly in [WaveformDataService] instead. +void _initializeInProcessServices(Module module) { + WaveformDataService.instance.clear(); + NetlistService(module); + WaveformDataService.init(module); + WaveformDataService.instance.startRecording(); +} + +// --------------------------------------------------------------------------- +// Counter example +// --------------------------------------------------------------------------- + +/// An 8-bit counter with enable and reset. +class _Counter extends Module { + Logic get val => output('val'); + + final int width; + + _Counter(Logic en, Logic reset, Logic clk) + : width = 8, + super(name: 'counter', definitionName: 'Counter') { + en = addInput('en', en); + reset = addInput('reset', reset); + clk = addInput('clk', clk); + addOutput('val', width: width); + + val <= flop(clk, reset: reset, en: en, val + 1); + } +} + +/// Build, simulate, and keep alive an 8-bit counter. +/// +/// Build, simulate, and keep alive an 8-bit counter. +/// +/// Runs the simulation for 200 time units (~20 clock cycles) so the +/// waveform viewer has real data to display, then keeps the process alive +/// so hierarchy and waveform queries continue to work. +/// +/// The simulation does NOT call [Simulator.endSimulation] — the simulator +/// remains in a runnable state so additional cycles can be triggered later. +Future> launchCounter() async { + // Reset the simulator to a clean state (important when switching + // between examples without restarting the process). + await Simulator.reset(); + + final en = Logic(name: 'en'); + final reset = Logic(name: 'reset'); + final clk = SimpleClockGenerator(10).clk; + + final counter = _Counter(en, reset, clk); + + await counter.build(); + _initializeInProcessServices(counter); + + debugPrint( + '[RohdExample] Counter built — ' + 'WaveformDataService initialized: ' + '${WaveformDataService.instance.isInitialized}, ' + 'signals: ${WaveformDataService.instance.signalCount}', + ); + + // Start simulation — runs via microtasks, yielding between ticks. + unawaited(Simulator.run()); + + // Reset sequence. + en.inject(0); + reset.inject(1); + + await clk.nextPosedge; + await clk.nextPosedge; + + // Release reset, enable counter. + reset.inject(0); + en.inject(1); + + // Let the counter run for 200 time units (~20 clock cycles). + // setMaxSimTime causes the simulator to stop at time 200 but does NOT + // tear down the simulator state, so data remains queryable. + Simulator.setMaxSimTime(200); + await Simulator.simulationEnded; + + debugPrint( + '[RohdExample] Counter simulation complete — ' + 'time=${WaveformDataService.instance.currentTime}, ' + 'changes=${WaveformDataService.instance.totalValueChanges}', + ); + + // Keep the process alive until the shell says stop. + final keepAlive = Completer(); + return keepAlive; +} + +// --------------------------------------------------------------------------- +// Oven FSM example +// --------------------------------------------------------------------------- + +/// Build, simulate, and keep alive a microwave oven FSM. +/// +/// Stimulus: reset → start cooking → pause → resume → cook until timer +/// completes → restart. ~300 time units of waveform data. +Future> launchOvenFsm() async { + await Simulator.reset(); + + final button = Logic(name: 'button', width: 2); + final reset = Logic(name: 'reset'); + final clk = SimpleClockGenerator(10).clk; + + final oven = OvenModule(button, reset, clk); + + await oven.build(); + _initializeInProcessServices(oven); + + debugPrint( + '[RohdExample] OvenFSM built — ' + 'WaveformDataService initialized: ' + '${WaveformDataService.instance.isInitialized}, ' + 'signals: ${WaveformDataService.instance.signalCount}', + ); + + unawaited(Simulator.run()); + + // ── Reset ── + reset.inject(1); + button.inject(Button.start.value); + + await clk.nextPosedge; + await clk.nextPosedge; + reset.inject(0); + + // ── Start cooking ── + button.inject(Button.start.value); + await clk.nextPosedge; + await clk.nextPosedge; + await clk.nextPosedge; + + // ── Pause ── + button.inject(Button.pause.value); + await clk.nextPosedge; + await clk.nextPosedge; + await clk.nextPosedge; + + // ── Resume ── + button.inject(Button.resume.value); + + // Let the counter run until it completes (counter reaches 4 → done) + for (var i = 0; i < 8; i++) { + await clk.nextPosedge; + } + + // ── Restart from completed state ── + button.inject(Button.start.value); + await clk.nextPosedge; + await clk.nextPosedge; + + Simulator.setMaxSimTime(300); + await Simulator.simulationEnded; + + debugPrint( + '[RohdExample] OvenFSM simulation complete — ' + 'time=${WaveformDataService.instance.currentTime}, ' + 'changes=${WaveformDataService.instance.totalValueChanges}', + ); + + final keepAlive = Completer(); + return keepAlive; +} + +// --------------------------------------------------------------------------- +// Tree of Two-Input Modules example +// --------------------------------------------------------------------------- + +/// A clocked wrapper around [TreeOfTwoInputModules] that samples +/// combinational inputs on each rising edge for waveform visibility. +class _ClockedTree extends Module { + Logic get out => output('out'); + + _ClockedTree(List inputs, Logic clk) + : super(name: 'clocked_tree', definitionName: 'ClockedTree') { + clk = addInput('clk', clk); + final registered = []; + for (var i = 0; i < inputs.length; i++) { + final inp = addInput('in$i', inputs[i], width: inputs[i].width); + final reg = Logic(width: inp.width, name: 'reg$i'); + reg <= flop(clk, inp); + registered.add(reg); + } + + final tree = TreeOfTwoInputModules(registered, (a, b) => mux(a > b, a, b)); + + addOutput('out', width: registered[0].width); + out <= tree.out; + } +} + +/// Build, simulate, and keep alive a tree-max module with 8 inputs. +/// +/// Injects different values each cycle so the waveform shows the tree +/// selecting the maximum. ~200 time units of waveform data. +Future> launchTree() async { + await Simulator.reset(); + + const width = 8; + const count = 8; + + final clk = SimpleClockGenerator(10).clk; + final inputs = List.generate( + count, + (i) => Logic(name: 'in$i', width: width), + ); + + final tree = _ClockedTree(inputs, clk); + + await tree.build(); + _initializeInProcessServices(tree); + + debugPrint( + '[RohdExample] Tree built — ' + 'WaveformDataService initialized: ' + '${WaveformDataService.instance.isInitialized}, ' + 'signals: ${WaveformDataService.instance.signalCount}', + ); + + unawaited(Simulator.run()); + + // Inject varying values each cycle so the max output changes. + for (var cycle = 0; cycle < 20; cycle++) { + for (var i = 0; i < count; i++) { + // Rotating pattern: each input gets a different value per cycle. + inputs[i].inject((cycle * 17 + i * 37) % 256); + } + await clk.nextPosedge; + } + + Simulator.setMaxSimTime(200); + await Simulator.simulationEnded; + + debugPrint( + '[RohdExample] Tree simulation complete — ' + 'time=${WaveformDataService.instance.currentTime}, ' + 'changes=${WaveformDataService.instance.totalValueChanges}', + ); + + final keepAlive = Completer(); + return keepAlive; +} + +// --------------------------------------------------------------------------- +// FilterBank example (with bidirectional bus) +// --------------------------------------------------------------------------- + +/// Build, simulate, and keep alive a 2-channel FIR filter bank with +/// bidirectional `dataBus` (LogicNet / inOut port) and `writeEnable` +/// exercising the SharedDataBus sub-module. +/// +/// An external [TriStateBuffer] drives the bus when `writeEnable` is low +/// (external write); the internal SharedDataBus drives it when high +/// (module read-back). +/// +/// Runs an impulse-response test: reset → bus exercise → start → +/// single '1' sample on both channels → zeros → inputDone → drain. +/// ~500 time units of waveform data. +Future> launchFilterBank() async { + await Simulator.reset(); + + const dataWidth = 16; + const numTaps = 3; + const coeffs0 = [1, 2, 1]; + const coeffs1 = [1, -2, 1]; + + final clk = SimpleClockGenerator(10).clk; + final reset = Logic(name: 'reset'); + final start = Logic(name: 'start'); + final samples = List.generate(2, (ch) => FilterSample(name: r'sample$ch')); + final inputDone = Logic(name: 'inputDone'); + final dataBus = LogicNet(name: 'dataBus', width: dataWidth); + final writeEnable = Logic(name: 'writeEnable'); + + // External driver: a TriStateBuffer that drives the bus when the module + // is NOT driving (writeEnable == 0 → external owns the bus). + final extData = Logic(name: 'extData', width: dataWidth); + final extDriver = TriStateBuffer( + extData, + enable: ~writeEnable, + name: 'extBusDriver', + ); + extDriver.out.gets(dataBus); + + final dut = FilterBank( + clk, + reset, + start, + samples, + inputDone, + numTaps: numTaps, + dataWidth: dataWidth, + coefficients: [coeffs0, coeffs1], + dataBus: dataBus, + writeEnable: writeEnable, + ); + + await dut.build(); + _initializeInProcessServices(dut); + + debugPrint( + '[RohdExample] FilterBank built — ' + 'WaveformDataService initialized: ' + '${WaveformDataService.instance.isInitialized}, ' + 'signals: ${WaveformDataService.instance.signalCount}', + ); + + unawaited(Simulator.run()); + + // ── Reset ── + reset.inject(1); + start.inject(0); + samples[0].data.inject(0); + samples[1].data.inject(0); + samples[0].valid.inject(0); + samples[1].valid.inject(0); + inputDone.inject(0); + writeEnable.inject(0); + extData.inject(0); + + await clk.nextPosedge; + await clk.nextPosedge; + reset.inject(0); + + // ── External write onto the bus (writeEnable=0 → ext driver active) ── + extData.inject(0xABCD); + await clk.nextPosedge; + await clk.nextPosedge; + + // ── Module reads back stored value (writeEnable=1 → internal driver) ── + writeEnable.inject(1); + await clk.nextPosedge; + await clk.nextPosedge; + writeEnable.inject(0); + + // ── External writes another value ── + extData.inject(0x1234); + await clk.nextPosedge; + await clk.nextPosedge; + + // ── Start filtering (same stimulus as plain FilterBank) ── + extData.inject(0); + await clk.nextPosedge; + start.inject(1); + await clk.nextPosedge; + start.inject(0); + samples[0].valid.inject(1); + samples[1].valid.inject(1); + + samples[0].data.inject(1); + samples[1].data.inject(1); + await clk.nextPosedge; + + for (var i = 0; i < 8; i++) { + samples[0].data.inject(0); + samples[1].data.inject(0); + await clk.nextPosedge; + } + + // ── End of input ── + samples[0].valid.inject(0); + samples[1].valid.inject(0); + inputDone.inject(1); + await clk.nextPosedge; + inputDone.inject(0); + + // ── Drain pipeline ── + Simulator.setMaxSimTime(500); + await Simulator.simulationEnded; + + debugPrint( + '[RohdExample] FilterBank simulation complete — ' + 'time=${WaveformDataService.instance.currentTime}, ' + 'changes=${WaveformDataService.instance.totalValueChanges}', + ); + + final keepAlive = Completer(); + return keepAlive; +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/models/signal_model.dart b/rohd_devtools_extension/lib/rohd_devtools/models/signal_model.dart index a028d60685..43532fa2e7 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/models/signal_model.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/models/signal_model.dart @@ -1,41 +1,19 @@ -// Copyright (C) 2024-2026 Intel Corporation +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; + +export 'package:rohd_hierarchy/rohd_hierarchy.dart' show SignalOccurrence; + +// Copyright (C) 2024-2025 Intel Corporation // SPDX-License-Identifier: BSD-3-Clause // // signal_model.dart -// Model of the signal shown in the details table. +// Model of the signal to be tabulate on the detail table. // // 2024 January 5 // Author: Yao Jing Quek -/// Model of a signal shown in the details table. -class SignalModel { - /// Signal name. - final String name; - - /// Signal direction label. - final String direction; - - /// Signal value rendered as text. - final String value; - - /// Signal bit width. - final int width; - - /// Creates a signal model. - SignalModel( - {required this.name, - required this.direction, - required this.value, - required this.width}); - - /// Builds a signal model from a map representation. - factory SignalModel.fromMap(Map map) => SignalModel( - name: map['name'] as String, - direction: map['direction'] as String, - value: map['value'] as String, - width: map['width'] as int); +// Re-export SignalOccurrence as SignalModel for backwards compatibility. +// New code should import rohd_hierarchy directly. - /// Converts the signal model to a JSON-compatible map. - Map toMap() => - {'name': name, 'direction': direction, 'value': value, 'width': width}; -} +/// Typedef for backwards compatibility. +/// @deprecated Use [SignalOccurrence] directly. +typedef SignalModel = SignalOccurrence; diff --git a/rohd_devtools_extension/lib/rohd_devtools/models/tree_model.dart b/rohd_devtools_extension/lib/rohd_devtools/models/tree_model.dart index 4ef6820c4c..48c6e5b23d 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/models/tree_model.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/models/tree_model.dart @@ -1,4 +1,8 @@ -// Copyright (C) 2024-2026 Intel Corporation +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; + +export 'package:rohd_hierarchy/rohd_hierarchy.dart' show HierarchyOccurrence; + +// Copyright (C) 2024-2025 Intel Corporation // SPDX-License-Identifier: BSD-3-Clause // // tree_model.dart @@ -7,85 +11,9 @@ // 2024 January 5 // Author: Yao Jing Quek -import 'package:rohd_devtools_extension/rohd_devtools/models/signal_model.dart'; - -/// Hierarchical model of a ROHD module tree. -class TreeModel { - /// Module name. - final String name; - - /// Input signals for the module. - final List inputs; - - /// Output signals for the module. - final List outputs; - - /// Inout signals for the module. - final List inouts; - - /// Child submodules contained by this module. - final List subModules; - - /// Creates a tree model for a module hierarchy node. - TreeModel( - {required this.name, - required this.inputs, - required this.outputs, - required this.subModules, - this.inouts = const []}); - - /// Builds a tree model from a JSON map. - factory TreeModel.fromJson(Map json) { - final inputSignalsList = []; - final outputSignalsList = []; - final inoutSignalsList = []; - final inputsJson = json['inputs'] as Map; - final outputsJson = json['outputs'] as Map; - final inoutsJson = json['inouts'] as Map? ?? {}; - - for (final inputSignal in inputsJson.entries) { - final inputValue = inputSignal.value as Map; - final signal = SignalModel.fromMap({ - 'name': inputSignal.key, - 'direction': 'Input', - 'value': inputValue['value'], - 'width': inputValue['width'] - }); - inputSignalsList.add(signal); - } - - for (final outputSignal in outputsJson.entries) { - final outputValue = outputSignal.value as Map; - final signal = SignalModel.fromMap({ - 'name': outputSignal.key, - 'direction': 'Output', - 'value': outputValue['value'], - 'width': outputValue['width'] - }); - - outputSignalsList.add(signal); - } - - for (final inoutSignal in inoutsJson.entries) { - final inoutValue = inoutSignal.value as Map; - final signal = SignalModel.fromMap({ - 'name': inoutSignal.key, - 'direction': 'Inout', - 'value': inoutValue['value'], - 'width': inoutValue['width'] - }); - - inoutSignalsList.add(signal); - } +// Re-export HierarchyOccurrence as TreeModel for backwards compatibility. +// New code should import rohd_hierarchy directly. - return TreeModel( - name: json['name'] as String, - inputs: inputSignalsList, - outputs: outputSignalsList, - inouts: inoutSignalsList, - subModules: (json['subModules'] as List) - .map((subModule) => - TreeModel.fromJson(subModule as Map)) - .toList()); - } -} +/// Typedef for backwards compatibility. +/// @deprecated Use [HierarchyOccurrence] directly. +typedef TreeModel = HierarchyOccurrence; diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/base_signal_waveform_api.dart b/rohd_devtools_extension/lib/rohd_devtools/services/base_signal_waveform_api.dart new file mode 100755 index 0000000000..3704f96d5e --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/base_signal_waveform_api.dart @@ -0,0 +1,1246 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// base_signal_rohd_waveform.dart +// Shared algorithm for waveform data retrieval and client-side evaluation. +// +// Extracts the common logic from VmServiceSignalWaveformApi and +// LoopbackSignalWaveformApi into a single base class. All data access +// goes through [RohdServiceTransport], so the same algorithm works for +// VM-attached and in-process modes. +// +// 2026 April +// Author: Desmond Kirkpatrick + +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:rohd/rohd.dart' show LogicValue; +import 'package:rohd_devtools_extension/rohd_devtools/services/netlist_evaluator.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/rohd_service_transport.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/utils/regex_utils.dart'; +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; +import 'package:rohd_waveform/rohd_waveform.dart'; + +/// Base implementation of [SignalWaveformApi] that handles all the shared +/// algorithm: hierarchy service construction, compact snapshot expansion, +/// client-side netlist evaluation, waveform synthesis, and on-demand +/// module expansion. +/// +/// Subclasses provide transport-specific behavior (e.g., signal tracking +/// for VM, stream merging for loopback). +class BaseSignalWaveformApi extends SignalWaveformApi { + /// The transport used for all server communication. + final RohdServiceTransport transport; + + /// Cached module structure. + ModuleStructure? _cachedStructure; + + /// Cached waveform data by signal ID. + final _waveformCache = {}; + + /// Monotonic ID for correlating waveform request debug output. + int _waveformRequestSequence = 0; + + /// Cached [HierarchyService] for pathname ↔ address conversion. + HierarchyService? _hierarchyService; + + /// Guard against recursive synthesis. + bool _inSynthesis = false; + + /// Shared cross-call cache for [evaluateSignalOnDemand]. + EvalOnDemandCache? evalCache; + + /// Netlist module definitions for client-side signal evaluation. + Map? get schematicModules => _schematicModules; + set schematicModules(Map? value) { + if (!identical(value, _schematicModules)) { + _schematicModules = value; + _evaluator = null; + } + } + + Map? _schematicModules; + + /// Callback to fetch the full (non-slim) module data for a definition. + Future?> Function(String definitionName)? + fetchModuleSchematic; + + /// Shared evaluator instance (from the shell). + NetlistEvaluator? sharedEvaluator; + + /// Lazily-built client-side netlist evaluator. + NetlistEvaluator? _evaluator; + + /// Definition names that have already been expanded. + final Set _expandedModules = {}; + + /// In-flight module expansion futures. + final Map?>> _inFlightExpansions = {}; + + /// Creates a new base waveform API backed by [transport]. + BaseSignalWaveformApi(this.transport); + + // ───────────────────────────────────────────────────────────────────────── + // Properties + // ───────────────────────────────────────────────────────────────────────── + + /// Whether the transport is connected. + bool get isConnected => transport.isConnected; + + /// Whether the API is ready to use. + @override + bool get isLoaded => transport.isConnected; + + /// Current simulation end time. + int get currentEndTime => transport.lastFetchedTime; + + /// Stream of live updates from the transport. + Stream? get liveUpdates => transport.liveUpdates; + + /// The cached module structure. + ModuleStructure? get cachedStructure => _cachedStructure; + + /// Whether compact transport is available. + bool get _compactAvailable => _hierarchyService != null; + + /// All signal IDs that have been fetched. + Set get cachedSignalIds => _waveformCache.keys.cast().toSet(); + + // ───────────────────────────────────────────────────────────────────────── + // Hierarchy service construction + // ───────────────────────────────────────────────────────────────────────── + + /// Sets the module structure from the hierarchy data source. + Future setExternalStructure(ModuleStructure structure) async { + _cachedStructure = structure; + _hierarchyService = null; + await _ensureIndexMaps(); + } + + /// Build the [HierarchyService] from the cached [ModuleStructure]. + Future _ensureIndexMaps() async { + if (_hierarchyService != null) { + return true; + } + + final structure = _cachedStructure; + if (structure == null || structure.modules.isEmpty) { + debugPrint('[BaseApi] No structure available for hierarchy service'); + return false; + } + + for (final root in structure.modules) { + root.buildAddresses(); + } + + _hierarchyService = structure.hierarchyService ?? + BaseHierarchyAdapter.fromTree(structure.modules.first); + + final signalCount = structure.modules.fold( + 0, + (sum, r) => sum + r.signalCount, + ); + final computedCount = structure.modules.fold( + 0, + (sum, r) => sum + r.computedSignalCount, + ); + + debugPrint( + '[BaseApi] HierarchyService ready: ' + '$signalCount signals ($computedCount computed)', + ); + return true; + } + + /// Expose the hierarchy service for subclasses that need it. + @protected + HierarchyService? get hierarchyService => _hierarchyService; + + // ───────────────────────────────────────────────────────────────────────── + // Core API methods + // ───────────────────────────────────────────────────────────────────────── + + @override + Future> getWaveformData({ + required List signalIds, + int? startTime, + int? endTime, + }) async { + final requestId = ++_waveformRequestSequence; + debugPrint( + '[BaseApi][$requestId] getWaveformData request: ' + '${signalIds.length} signals, range=${startTime ?? "start"}..' + '${endTime ?? "end"}, sample=${signalIds.take(5).join(", ")}', + ); + + // Partition into tracked (server-side), derivable (client-side), and + // bit-slice (sub-field extraction from parent struct/array). + final trackedIds = []; + final derivableIds = []; + final bitSliceIds = []; + + if (_schematicModules != null && !_inSynthesis) { + final hs = _hierarchyService; + final eval = _getEvaluator(); + for (final id in signalIds) { + if (isSubFieldPath(id)) { + bitSliceIds.add(id); + continue; + } + final sig = _resolveSignal(hs, id); + if (sig != null && !sig.isComputed) { + trackedIds.add(id); + } else if (eval != null) { + derivableIds.add(id); + } else { + trackedIds.add(id); + } + } + if (derivableIds.isNotEmpty || bitSliceIds.isNotEmpty) { + debugPrint( + '[BaseApi] partitioned: ' + '${derivableIds.length} derivable / ' + '${bitSliceIds.length} bit-slice / ' + '${trackedIds.length} tracked of ${signalIds.length}', + ); + } + } else { + for (final id in signalIds) { + if (isSubFieldPath(id)) { + bitSliceIds.add(id); + } else { + trackedIds.add(id); + } + } + } + + // Fetch tracked signals from the server. + final data = []; + + if (trackedIds.isNotEmpty) { + // Hook for subclasses to register tracked signals. + onTrackSignals(trackedIds); + + await _ensureIndexMaps(); + final hs = _hierarchyService; + if (_compactAvailable && hs != null) { + final addresses = []; + final addrToId = {}; + final skippedIds = []; + for (final id in trackedIds) { + final addr = hs.pathnameToAddress(id)?.toDotString(); + if (addr != null) { + addresses.add(addr); + addrToId[addr] = id; + } else { + skippedIds.add(id); + debugPrint( + '[BaseApi][$requestId] WARNING: signal "$id" has no compact ' + 'address — skipping', + ); + } + } + debugPrint( + '[BaseApi][$requestId] compact address map: ' + '${addresses.length}/${trackedIds.length} tracked resolved, ' + 'skipped=${skippedIds.length}, ' + 'sample=${addresses.take(5).join(", ")}', + ); + if (addresses.isNotEmpty) { + final fetched = await transport.getWaveformDataCompact( + signalAddresses: addresses, + addressToSignalId: addrToId, + startTime: startTime, + endTime: endTime, + ); + final pointCount = fetched.fold( + 0, + (total, waveform) => total + waveform.data.length, + ); + debugPrint( + '[BaseApi][$requestId] compact transport returned ' + '${fetched.length} waveforms / $pointCount points', + ); + data.addAll(fetched); + } else if (trackedIds.isNotEmpty) { + debugPrint( + '[BaseApi][$requestId] no compact addresses resolved; ' + 'no server waveform request sent', + ); + } + } + } + + // Client-side synthesis for derivable + missing/empty tracked signals. + if (_schematicModules != null && !_inSynthesis) { + final returnedIds = data.map((wf) => wf.signalId).toSet(); + final missingOrEmpty = {}; + for (final wf in data) { + if (wf.data.isEmpty) { + missingOrEmpty.add(wf.signalId); + } + } + for (final id in trackedIds) { + if (!returnedIds.contains(id)) { + missingOrEmpty.add(id); + } + } + if (missingOrEmpty.isNotEmpty) { + data.removeWhere((wf) => missingOrEmpty.contains(wf.signalId)); + derivableIds.addAll(missingOrEmpty); + debugPrint( + '[BaseApi] ${missingOrEmpty.length} tracked signals ' + 'missing/empty — retrying as derivable', + ); + } + } + + if (derivableIds.isNotEmpty && _schematicModules != null && !_inSynthesis) { + final eval = _getEvaluator(); + if (eval != null) { + for (final id in derivableIds) { + final synth = await _synthesizeClientSide( + eval, + id, + startTime: startTime, + endTime: endTime, + ); + if (synth != null) { + data.add( + WaveformData( + signalId: synth.signalId, + data: synth.data, + isComputed: true, + ), + ); + } + } + } + } + + // Bit-slice synthesis for sub-field paths (struct/array element extraction). + if (bitSliceIds.isNotEmpty) { + for (final id in bitSliceIds) { + final synth = await _synthesizeBitSlice(id); + if (synth != null) { + data.add(synth); + } + } + } + + // Update cache. + for (final waveform in data) { + _waveformCache[waveform.signalId] = waveform; + } + + debugPrint( + '[BaseApi][$requestId] getWaveformData result: ' + '${trackedIds.length} tracked + ${derivableIds.length} derived ' + '+ ${bitSliceIds.length} bit-slice ' + '=> ${data.length} waveforms', + ); + + return data; + } + + /// Hook for subclasses to register tracked signals with the transport. + /// + /// Default is no-op. VmServiceSignalWaveformApi overrides this to call + /// `transport.trackSignal()` for each ID. + @protected + void onTrackSignals(List signalIds) {} + + @override + Stream streamWaveformData({ + required List signalIds, + int? startTime, + }) async* { + final initialData = await getWaveformData( + signalIds: signalIds, + startTime: startTime, + ); + for (final waveform in initialData) { + yield waveform; + } + + // Stream incremental updates from the transport. + final updates = transport.liveUpdates; + if (updates == null) { + return; + } + await for (final update in updates) { + for (final waveform in update.incrementalData) { + if (signalIds.contains(waveform.signalId)) { + // Merge with cached data. + final cached = _waveformCache[waveform.signalId]; + if (cached != null) { + final mergedData = [...cached.data, ...waveform.data]; + final merged = WaveformData( + signalId: waveform.signalId, + data: mergedData, + ); + _waveformCache[waveform.signalId] = merged; + yield merged; + } else { + _waveformCache[waveform.signalId] = waveform; + yield waveform; + } + } + } + } + } + + @override + Future getCurrentTime() => transport.getCurrentTime(); + + @override + Future>?> getSnapshot(int time) async { + await _ensureIndexMaps(); + + if (_compactAvailable) { + try { + final compact = await transport.getSnapshotCompact(time); + if (compact != null) { + final result = _expandCompactSnapshot(compact); + if (result != null) { + final computedCount = + result.values.where((m) => m['computed'] == true).length; + final fetchedCount = result.length - computedCount; + final computedPercent = + result.isNotEmpty ? (computedCount * 100 ~/ result.length) : 0; + debugPrint( + '[BaseApi] Snapshot(compact) at t=$time: ' + '${result.length} signals — $fetchedCount fetched, ' + '$computedCount computed ($computedPercent% local)', + ); + return result; + } + } + } on Object catch (e) { + debugPrint('[BaseApi] Compact snapshot failed: $e'); + } + } + + return null; + } + + // ───────────────────────────────────────────────────────────────────────── + // Snapshot expansion & client-side evaluation + // ───────────────────────────────────────────────────────────────────────── + + /// Expand a compact snapshot into the full consumer format. + Map>? _expandCompactSnapshot( + Map compact, + ) { + final values = compact['v'] as Map?; + if (values == null) { + return null; + } + final hs = _hierarchyService; + + final result = >{}; + + for (final entry in values.entries) { + final addrStr = entry.key; + final address = OccurrenceAddress.fromDotString(addrStr); + final signalId = hs?.addressToPathname(address, asSignal: true); + if (signalId == null) { + continue; + } + + final signal = hs?.signalByAddress(address); + + result[signalId] = { + 'value': entry.value as String, + 'name': signal?.name ?? signalId.split('/').last, + 'width': signal?.width ?? 1, + if (signal?.direction != null) 'direction': signal!.direction, + }; + } + + // Evaluate computed signals client-side. + _evaluateComputedInSnapshot(result); + + // Hook for subclass diagnostics. + onSnapshotExpanded(compact, result); + + return result; + } + + /// Hook for subclass-specific post-expansion diagnostics. + /// + /// Default is a no-op. VmServiceSignalWaveformApi overrides to log + /// parent↔child port value mismatches. + @protected + void onSnapshotExpanded( + Map compact, + Map> result, + ) {} + + /// Evaluate computed (server-skipped) signals using the + /// [NetlistEvaluator]. + void _evaluateComputedInSnapshot(Map> result) { + final eval = _getEvaluator(); + final hs = _hierarchyService; + if (eval == null || hs == null) { + debugPrint( + '[CONST-DBG] _evaluateComputedInSnapshot BAIL: ' + 'eval=$eval, hs=$hs', + ); + return; + } + + final structure = _cachedStructure; + if (structure == null) { + debugPrint( + '[CONST-DBG] _evaluateComputedInSnapshot BAIL: ' + 'structure=null', + ); + return; + } + + // Build tracked-value map for the evaluator's snapshot lookup. + final tracked = {}; + for (final entry in result.entries) { + tracked[entry.key] = entry.value['value'] as String; + } + String? snapshotLookup(String path) => tracked[path]; + + final computedIds = []; + final computedSignals = {}; + var skipped = 0; + final seen = {...result.keys}; + + void visitOccurrence(HierarchyOccurrence occ) { + for (final signal in occ.signals) { + final signalId = signal.path(); + if (seen.contains(signalId)) { + continue; + } + if (!eval.canEvaluate(signalId)) { + skipped++; + continue; + } + computedIds.add(signalId); + computedSignals[signalId] = signal; + seen.add(signalId); + } + occ.children.forEach(visitOccurrence); + } + + structure.modules.forEach(visitOccurrence); + + // Also discover netlist-only signals. + final rootInstance = + structure.modules.isNotEmpty ? structure.modules.first.path() : null; + if (rootInstance != null) { + final netlistPaths = eval.allEvaluablePaths(rootInstance); + for (final path in netlistPaths) { + if (!seen.contains(path)) { + computedIds.add(path); + seen.add(path); + } + } + } + + // Debug: check if const_31 signals made it into computedIds + final constDbg = + computedIds.where((id) => id.contains('const_31')).toList(); + if (constDbg.isNotEmpty) { + debugPrint('[CONST-DBG] const_31 signals in computedIds: $constDbg'); + } else { + // Check if it was in 'seen' (already in result from tracked) + final inSeen = seen.where((id) => id.contains('const_31')).toList(); + debugPrint( + '[CONST-DBG] const_31 NOT in computedIds! ' + 'inSeen=$inSeen, total computed=${computedIds.length}, ' + 'skipped=$skipped', + ); + } + + if (computedIds.isEmpty) { + if (skipped > 0) { + debugPrint( + '[BaseApi] Skipped $skipped signals ' + '(unresolvable or slim modules)', + ); + } + return; + } + + final resolved = eval.evaluateBatch(computedIds, snapshotLookup); + + // Debug: check what evaluateBatch returned for const_31 + final constResolved = + resolved.entries.where((e) => e.key.contains('const_31')).toList(); + if (constResolved.isNotEmpty) { + for (final e in constResolved) { + debugPrint( + '[CONST-DBG] evaluateBatch result: ' + '${e.key} => ${e.value}', + ); + } + } else if (constDbg.isNotEmpty) { + debugPrint( + '[CONST-DBG] evaluateBatch returned NOTHING for const_31! ' + 'resolved.length=${resolved.length}', + ); + } + + for (final entry in resolved.entries) { + final signalId = entry.key; + final signal = computedSignals[signalId]; + final width = signal?.width ?? eval.signalWidth(signalId); + result[signalId] = { + 'value': _fmtLV(entry.value), + 'name': signal?.name ?? signalId.split('/').last, + 'width': width, + 'computed': true, + if (signal?.direction != null) 'direction': signal!.direction, + }; + } + + debugPrint( + '[BaseApi] Evaluated ${resolved.length} computed signals ' + 'client-side (${computedIds.length} attempted' + '${skipped > 0 ? ', $skipped skipped' : ''})', + ); + } + + // ───────────────────────────────────────────────────────────────────────── + // Client-side waveform synthesis + // ───────────────────────────────────────────────────────────────────────── + + /// Synthesize a waveform for a computed signal by evaluating the gate + /// graph at each timepoint of its tracked leaf dependencies. + Future _synthesizeClientSide( + NetlistEvaluator eval0, + String signalId, { + int? startTime, + int? endTime, + }) async { + var eval = eval0; + final didExpand = await ensureFullModules(signalId); + if (didExpand) { + _evaluator = null; + sharedEvaluator = null; + evalCache?.reset(); + eval = _getEvaluator()!; + } + + // Stale cache retry. + if (!eval.isComputed(signalId)) { + evalCache?.reset(); + _evaluator = null; + sharedEvaluator = null; + eval = _getEvaluator()!; + } + + if (!eval.isComputed(signalId)) { + debugPrint('[ClientSynth] "$signalId": not computed in evaluator'); + final constResult = eval.evaluate(signalId, (_) => null); + if (constResult != null && !constResult.value.contains('x')) { + debugPrint('[ClientSynth] "$signalId": const => ${constResult.value}'); + return WaveformData( + signalId: signalId, + data: [Data(time: 0, value: constResult.value)], + ); + } + return null; + } + + // Get signal width. + var width = eval.signalWidth(signalId); + final sig = _resolveSignal(_hierarchyService, signalId); + if (sig != null) { + width = sig.width; + } + if (width < 1) { + width = 1; + } + + // Collect tracked leaf dependencies. + final leafIds = eval.collectLeaves(signalId); + if (leafIds.isEmpty) { + final r = eval.evaluate(signalId, (_) => null); + if (r != null) { + debugPrint('[ClientSynth] "$signalId": no leaves => ${r.value}'); + return WaveformData( + signalId: signalId, + data: [Data(time: 0, value: r.value)], + ); + } + return null; + } + + debugPrint( + '[ClientSynth] "$signalId": ' + '${leafIds.length} tracked leaves — fetching waveforms', + ); + + // Fetch leaf waveforms (tracked only — skip derivable partition). + _inSynthesis = true; + List leafWaveforms; + try { + leafWaveforms = await getWaveformData( + signalIds: leafIds.toList(), + startTime: startTime, + endTime: endTime, + ); + } finally { + _inSynthesis = false; + } + + // Build leaf → time-series map and collect all timepoints. + final leafTimeSeries = >{}; + final allTimes = {}; + for (final wf in leafWaveforms) { + leafTimeSeries[wf.signalId] = wf.data; + for (final d in wf.data) { + allTimes.add(d.time); + } + } + + if (allTimes.isEmpty) { + debugPrint( + '[ClientSynth] "$signalId": ' + 'no timepoints from ${leafIds.length} leaves', + ); + return WaveformData(signalId: signalId, data: const []); + } + + final sortedTimes = allTimes.toList()..sort(); + + // Initialize cursors and current snapshot. + final cursors = {}; + final currentSnapshot = {}; + for (final leafId in leafIds) { + cursors[leafId] = 0; + final series = leafTimeSeries[leafId]; + if (series != null && series.isNotEmpty) { + currentSnapshot[leafId] = series.first.value; + } + } + + String? snapshotLookup(String path) => currentSnapshot[path]; + + // Fresh cache fork for time-series evaluation. + final synthEval = NetlistEvaluator( + _schematicModules!, + eval.cache.withSharedStructure(), + ); + + final outputData = []; + String? lastValue; + + for (final time in sortedTimes) { + for (final leafId in leafIds) { + final series = leafTimeSeries[leafId]; + if (series == null) { + continue; + } + var cursor = cursors[leafId]!; + while (cursor < series.length && series[cursor].time <= time) { + currentSnapshot[leafId] = series[cursor].value; + cursor++; + } + cursors[leafId] = cursor; + } + + synthEval.clearValues(); + final r = synthEval.evaluate(signalId, snapshotLookup); + final formatted = r?.value ?? ('x' * width); + + if (formatted != lastValue) { + outputData.add(Data(time: time, value: formatted)); + lastValue = formatted; + } + } + + debugPrint( + '[ClientSynth] "$signalId": ' + '${leafIds.length} leaves, ${sortedTimes.length} timepoints, ' + '${outputData.length} transitions', + ); + + return WaveformData(signalId: signalId, data: outputData); + } + + // ───────────────────────────────────────────────────────────────────────── + // Bit-slice synthesis for struct/array sub-fields + // ───────────────────────────────────────────────────────────────────────── + + /// Separator used to denote a sub-field path within a struct/array signal. + /// + /// Example: `top/counter/fp_out#mantissa` means field "mantissa" of + /// signal `top/counter/fp_out`. Nested: `fp_out#exponent.subfield` or + /// array: `arr#[2]`. + static const String subFieldSeparator = '#'; + + /// Whether [signalId] refers to a sub-field of a struct/array signal. + static bool isSubFieldPath(String signalId) => + signalId.contains(subFieldSeparator); + + /// Splits a sub-field path into (parentSignalPath, fieldPath). + /// + /// Example: `"top/counter/fp_out#mantissa"` → `("top/counter/fp_out", "mantissa")` + /// Nested: `"top/counter/fp_out#exponent.sub"` → `("top/counter/fp_out", "exponent.sub")` + static (String parentPath, String fieldPath) splitSubFieldPath( + String signalId, + ) { + final idx = signalId.indexOf(subFieldSeparator); + assert(idx >= 0, 'Not a sub-field path: $signalId'); + return (signalId.substring(0, idx), signalId.substring(idx + 1)); + } + + /// Resolve a sub-field path to its bit range within the parent signal. + /// + /// Walks the `logicType` metadata following the field path (dot-separated + /// for nested structs, bracket-indexed for arrays). + /// + /// Returns `(startBit, width)` or `null` if resolution fails. + /// Prefix used in sub-field paths to denote flat bitvector access. + /// + /// Examples: + /// - `signal#b[5]` — bit 5 of the flat bitvector + /// - `signal#b[15:8]` — bits 15 down to 8 (inclusive) + /// + /// Structural (array/struct) access uses no prefix: + /// - `signal#[3]` — array element 3 + /// - `signal#fieldName` — struct field + static const String bitvectorPrefix = 'b'; + + /// Resolve sub-field bits for a bitvector or array element access. + ({int startBit, int width})? resolveSubFieldBits(String signalId) { + if (!isSubFieldPath(signalId)) { + return null; + } + final (parentPath, fieldPath) = splitSubFieldPath(signalId); + + // Look up the parent signal's logicType metadata. + final parentSig = _resolveSignal(_hierarchyService, parentPath); + if (parentSig == null) { + return null; + } + + // Bitvector access: "b[N]" or "b[high:low]" — always flat bit extraction, + // regardless of whether the signal is an array or struct. + if (fieldPath.startsWith('$bitvectorPrefix[')) { + final inner = fieldPath.substring(bitvectorPrefix.length); + return _resolvePlainBitRange(inner, parentSig.width); + } + + // Try structured resolution via logicType (struct/array fields). + if (parentSig.logicType != null) { + final resolved = _resolveFieldBits(parentSig.logicType!, fieldPath); + if (resolved != null) { + return resolved; + } + } + + // Fall back to plain bit-range extraction for [N] or [high:low]. + return _resolvePlainBitRange(fieldPath, parentSig.width); + } + + /// Resolve a bit range from a bracket expression. + /// + /// Supports: + /// - `[N]` — single bit extraction (1-bit wide at position N) + /// - `[high:low]` — contiguous bit-range extraction (inclusive) + static ({int startBit, int width})? _resolvePlainBitRange( + String fieldPath, + int parentWidth, + ) { + // Single bit: [N] + final singleMatch = regExpFirstMatch(r'^\[(\d+)\]$', fieldPath); + if (singleMatch != null) { + final bit = int.parse(singleMatch.group(1)!); + if (bit >= parentWidth) { + return null; + } + return (startBit: bit, width: 1); + } + // Bit range: [high:low] + final rangeMatch = regExpFirstMatch(r'^\[(\d+):(\d+)\]$', fieldPath); + if (rangeMatch != null) { + final high = int.parse(rangeMatch.group(1)!); + final low = int.parse(rangeMatch.group(2)!); + if (high >= parentWidth || low >= parentWidth) { + return null; + } + final actualHigh = high > low ? high : low; + final actualLow = high > low ? low : high; + return (startBit: actualLow, width: actualHigh - actualLow + 1); + } + return null; + } + + /// Recursively resolve a field path within a logicType to bit coordinates. + static ({int startBit, int width})? _resolveFieldBits( + Map logicType, + String fieldPath, + ) { + // Split into first segment and remainder. + final dotIdx = fieldPath.indexOf('.'); + final String segment; + final String? remainder; + if (dotIdx >= 0) { + segment = fieldPath.substring(0, dotIdx); + remainder = fieldPath.substring(dotIdx + 1); + } else { + segment = fieldPath; + remainder = null; + } + + // Struct case: look up named field. + final fields = logicType['fields'] as List?; + if (fields != null) { + for (final fieldRaw in fields) { + final field = fieldRaw as Map; + final name = field['name'] as String? ?? ''; + if (name != segment) { + continue; + } + + final bits = field['bits'] as List?; + final width = field['width'] as int? ?? 1; + final startBit = bits != null && bits.isNotEmpty + ? (bits.cast().reduce((a, b) => a < b ? a : b)) + : 0; + + if (remainder == null) { + return (startBit: startBit, width: width); + } + // Recurse into nested type. + final nestedType = field['type'] as Map?; + if (nestedType == null) { + return null; + } + final inner = _resolveFieldBits(nestedType, remainder); + if (inner == null) { + return null; + } + return (startBit: startBit + inner.startBit, width: inner.width); + } + return null; // field not found + } + + // Array case: look up by index [N]. + final arrayDims = logicType['arrayDims'] as List?; + if (arrayDims != null) { + final leafWidth = (logicType['elementWidth'] as int?) ?? 1; + // For multi-dimensional arrays, compute the actual per-element width + // from remaining dimensions. + final remainingDims = + arrayDims.length > 1 ? arrayDims.sublist(1).cast() : []; + final perElementWidth = remainingDims.isEmpty + ? leafWidth + : remainingDims.fold(leafWidth, (acc, d) => acc * d); + final elementType = logicType['elementType'] as Map?; + + // Parse "[N]" from segment. + final match = regExpFirstMatch(r'^\[(\d+)\]$', segment); + if (match == null) { + return null; + } + final index = int.parse(match.group(1)!); + // Bounds check: if the index exceeds the array dimension, fall through + // to the plain bit-range fallback (the path may represent a bit index + // rather than an array element). + final dim = arrayDims[0] as int; + if (index >= dim) { + return null; + } + final startBit = index * perElementWidth; + + if (remainder == null) { + return (startBit: startBit, width: perElementWidth); + } + // For nested resolution: use explicit elementType if available, + // otherwise construct a synthetic sub-type from remaining dims. + final subType = elementType ?? + (remainingDims.isNotEmpty + ? { + 'arrayDims': remainingDims, + 'elementWidth': leafWidth, + 'width': perElementWidth, + } + : null); + if (subType == null) { + return null; + } + final inner = _resolveFieldBits(subType, remainder); + if (inner == null) { + return null; + } + return (startBit: startBit + inner.startBit, width: inner.width); + } + + return null; + } + + /// Synthesize a waveform for a sub-field by bit-slicing the parent's data. + /// + /// This is the "computed waveform" equivalent for struct/array fields: + /// the parent signal is the single leaf dependency, and the evaluation is + /// a simple bit extraction at each timepoint. + Future _synthesizeBitSlice( + String signalId, { + int? startTime, + int? endTime, + }) async { + final resolved = resolveSubFieldBits(signalId); + if (resolved == null) { + debugPrint('[BitSlice] "$signalId": cannot resolve field bits'); + return null; + } + + final (parentPath, _) = splitSubFieldPath(signalId); + final parentWidth = + _resolveSignal(_hierarchyService, parentPath)?.width ?? 1; + + // Fetch the parent waveform. + _inSynthesis = true; + List parentData; + try { + parentData = await getWaveformData( + signalIds: [parentPath], + startTime: startTime, + endTime: endTime, + ); + } finally { + _inSynthesis = false; + } + + if (parentData.isEmpty || parentData.first.data.isEmpty) { + debugPrint('[BitSlice] "$signalId": parent has no data'); + return WaveformData(signalId: signalId, data: const []); + } + + final pData = parentData.first.data; + final lo = resolved.startBit; + final hi = lo + resolved.width - 1; + final fieldWidth = resolved.width; + + // Safety: ensure the resolved bit range fits within the parent width. + if (hi >= parentWidth) { + debugPrint( + '[BitSlice] "$signalId": resolved bits [$hi:$lo] exceed ' + 'parent width $parentWidth — skipping', + ); + return WaveformData(signalId: signalId, data: const []); + } + + // Extract bits at each parent timepoint, deduplicating. + final outputData = []; + String? lastValue; + + for (final point in pData) { + final parentLV = parseHexToLV(point.value, parentWidth); + final sliced = parentLV.getRange(lo, hi + 1); + final formatted = _fmtLV(sliced); + + if (formatted != lastValue) { + outputData.add(Data(time: point.time, value: formatted)); + lastValue = formatted; + } + } + + debugPrint( + '[BitSlice] "$signalId": ' + 'bits [$hi:$lo] of "$parentPath" ($parentWidth bits) → ' + '${outputData.length} transitions (${fieldWidth}b)', + ); + + return WaveformData(signalId: signalId, data: outputData, isComputed: true); + } + + // ───────────────────────────────────────────────────────────────────────── + // On-demand module expansion + // ───────────────────────────────────────────────────────────────────────── + + @override + Future expandAllSlimModules() async { + if (_schematicModules == null || fetchModuleSchematic == null) { + return; + } + final modules = _schematicModules!; + var anyExpanded = false; + for (final entry in modules.entries.toList()) { + final defName = entry.key; + if (_expandedModules.contains(defName)) { + continue; + } + final modData = entry.value as Map; + if (!isSlimModule(modData)) { + continue; + } + final fullData = await _fetchModuleOnce(defName); + if (fullData != null) { + for (final e in fullData.entries) { + modules[e.key] = e.value; + } + _expandedModules.add(defName); + anyExpanded = true; + } + } + if (anyExpanded) { + _evaluator = null; + sharedEvaluator = null; + evalCache?.reset(); + debugPrint( + '[BaseApi] expandAllSlimModules: ' + 'expanded ${_expandedModules.length} modules, cache reset', + ); + } + } + + /// Ensure modules along [signalId]'s path have full connectivity. + Future ensureFullModules(String signalId) async { + if (_schematicModules == null || fetchModuleSchematic == null) { + return false; + } + + final modules = _schematicModules!; + final parts = signalId.split('/'); + if (parts.length < 2) { + return false; + } + + String? topKey; + for (final e in modules.entries) { + final attrs = (e.value as Map)['attributes'] + as Map?; + if (attrs?['top'] == 1) { + topKey = e.key; + break; + } + } + topKey ??= modules.keys.isNotEmpty ? modules.keys.first : null; + if (topKey == null) { + return false; + } + + var expanded = false; + var defName = topKey; + + for (var i = 1; i < parts.length - 1; i++) { + final cellName = parts[i]; + final modData = modules[defName] as Map?; + if (modData == null) { + break; + } + + if (!_expandedModules.contains(defName) && isSlimModule(modData)) { + final fullData = await _fetchModuleOnce(defName); + if (fullData != null) { + for (final entry in fullData.entries) { + modules[entry.key] = entry.value; + } + _expandedModules.add(defName); + expanded = true; + } + } + + final cells = (modules[defName] as Map?)?['cells'] + as Map? ?? + {}; + final cell = cells[cellName] as Map?; + final nextType = cell?['type'] as String?; + if (nextType == null || !modules.containsKey(nextType)) { + break; + } + defName = nextType; + } + + // Also expand the leaf module. + final leafMod = modules[defName] as Map?; + if (leafMod != null && + !_expandedModules.contains(defName) && + isSlimModule(leafMod)) { + final fullData = await _fetchModuleOnce(defName); + if (fullData != null) { + for (final entry in fullData.entries) { + modules[entry.key] = entry.value; + } + _expandedModules.add(defName); + expanded = true; + } + } + + return expanded; + } + + /// Fetch a module's full data, coalescing concurrent requests. + Future?> _fetchModuleOnce(String defName) => + _inFlightExpansions.putIfAbsent(defName, () async { + debugPrint('[BaseApi] Expanding slim module: $defName'); + try { + return await fetchModuleSchematic!(defName); + } finally { + final _ = _inFlightExpansions.remove(defName); + } + }); + + /// Whether a module is slim (cells exist but lack `connections`). + static bool isSlimModule(Map moduleData) { + final cells = moduleData['cells'] as Map? ?? {}; + for (final cellEntry in cells.values) { + final cell = cellEntry as Map; + if (cell.containsKey('connections')) { + return false; + } + } + return cells.isNotEmpty; + } + + // ───────────────────────────────────────────────────────────────────────── + // Evaluator & helpers + // ───────────────────────────────────────────────────────────────────────── + + /// Get or create the client-side [NetlistEvaluator]. + NetlistEvaluator? _getEvaluator() => + sharedEvaluator ?? + (_evaluator ??= _schematicModules != null + ? NetlistEvaluator(_schematicModules!, evalCache) + : null); + + /// Resolve a signal pathname to a [SignalOccurrence]. + static SignalOccurrence? _resolveSignal( + HierarchyService? hs, + String pathname, + ) { + if (hs == null) { + return null; + } + final addr = OccurrenceAddress.tryFromPathname(pathname, hs.root); + if (addr == null) { + return null; + } + return hs.signalByAddress(addr); + } + + /// Format a [LogicValue] as a string. + /// Format a [LogicValue] using the same compact representation as the + /// server-side `WaveformService._formatLogicValue`: + /// - 1-bit: no width prefix ("0", "1", "x", "z") + /// - multi-bit valid: "0xHEX" + /// - multi-bit invalid (x/z): raw string without width prefix + static String _fmtLV(LogicValue lv) { + if (lv.width == 0) { + return ''; + } + return lv.toString(); + } + + /// Clear all cached data. + void clearCache() { + _cachedStructure = null; + _waveformCache.clear(); + _hierarchyService = null; + _evaluator = null; + _expandedModules.clear(); + evalCache?.reset(); + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/design_data_adapter.dart b/rohd_devtools_extension/lib/rohd_devtools/services/design_data_adapter.dart new file mode 100644 index 0000000000..9ebdace891 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/design_data_adapter.dart @@ -0,0 +1,274 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// design_data_adapter.dart +// Unified adapter for parsing design data in any supported format. +// +// 2026 February +// Author: Desmond Kirkpatrick + +import 'dart:convert'; + +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; + +/// Enum representing the detected format of design data. +enum DesignDataFormat { + /// Legacy inspector tree format: `{name, inputs, outputs, subModules}`. + legacyModuleTree, + + /// Yosys netlist format: {modules: {...}} + netlistSchematic, + + /// Unified format: {netlist: {...}} or {schematic: {...}} + unified, +} + +/// Result of parsing design data. +/// +/// Contains the hierarchy service (always present) and optionally +/// schematic data if the input format included connectivity information. +class DesignData { + /// The hierarchy service for module tree navigation. + final HierarchyService hierarchy; + + /// Raw schematic data in Yosys format (if available). + /// This can be passed to NetlistSchematicAdapter for rendering. + final Map? schematicJson; + + /// True if schematic data is available. + bool get hasSchematic => schematicJson != null; + + /// The detected format of the original input. + final DesignDataFormat format; + + /// Optional metadata from the input. + final String? creator; + + /// Optional version from the input. + final String? version; + + /// Creates a DesignData object with the given hierarchy, format, and optional + /// schematic and metadata. + DesignData({ + required this.hierarchy, + required this.format, + this.schematicJson, + this.creator, + this.version, + }); +} + +/// Unified adapter that parses design data in netlist format. +/// +/// Supported formats: +/// 1. **Legacy Module Tree** - `{name, inputs, outputs, subModules}` +/// 2. **Yosys Netlist** - `{modules: {...}}` +/// 3. **Unified** - `{netlist: {...}}` or `{schematic: {...}}` +/// +/// Usage: +/// ```dart +/// final data = DesignDataAdapter.parse(jsonString); +/// final tree = data.hierarchy.root; // Always available +/// if (data.hasSchematic) { +/// final schematic = NetlistSchematicAdapter.fromJson( +/// jsonEncode(data.schematicJson), +/// ); +/// } +/// ``` +class DesignDataAdapter { + DesignDataAdapter._(); + + /// Parse design data from a JSON string. + /// + /// Automatically detects the format and returns a [DesignData] object + /// containing the hierarchy and optional schematic data. + static DesignData parse(String jsonString) { + final json = jsonDecode(jsonString) as Map; + return parseJson(json); + } + + /// Parse design data from a JSON map. + /// + /// Automatically detects the format and returns a [DesignData] object. + static DesignData parseJson(Map json) { + // Check for status: fail like real ROHD inspector service + if (json['status'] == 'fail') { + throw const FormatException('ROHD inspector reported failure'); + } + + final format = detectFormat(json); + + switch (format) { + case DesignDataFormat.legacyModuleTree: + return _parseLegacyModuleTree(json); + + case DesignDataFormat.netlistSchematic: + return _parseNetlistSchematic(json); + + case DesignDataFormat.unified: + return _parseUnified(json); + } + } + + /// Detect the format of the given JSON. + static DesignDataFormat detectFormat(Map json) { + // Legacy inspector format: a recursive module tree without connectivity. + if (json.containsKey('name') && json.containsKey('subModules')) { + return DesignDataFormat.legacyModuleTree; + } + + // Unified format: has 'netlist' or 'schematic' wrapper key. + if (json.containsKey('netlist') || json.containsKey('schematic')) { + return DesignDataFormat.unified; + } + + // Yosys format: has 'modules' key directly. + if (json.containsKey('modules')) { + return DesignDataFormat.netlistSchematic; + } + + throw FormatException( + 'Unsupported design format: expected legacy module tree ' + '({name, subModules: ...}), netlist ({modules: ...}), or unified ' + '({netlist: ...}), got keys: ${json.keys.toList()}', + ); + } + + /// Parse the hierarchy-only tree emitted by the legacy inspector service. + /// + /// This format has no cell or net connectivity, so schematic data remains + /// null and schematic consumers can retain their existing unavailable state. + static DesignData _parseLegacyModuleTree(Map json) { + final root = _legacyOccurrence(json); + return DesignData( + hierarchy: BaseHierarchyAdapter.fromTree(root), + format: DesignDataFormat.legacyModuleTree, + ); + } + + static HierarchyOccurrence _legacyOccurrence(Map json) { + final name = json['name']; + if (name is! String || name.isEmpty) { + throw const FormatException('Legacy module tree node has no name'); + } + + final signals = [ + ..._legacyPorts(json['inputs'], 'input'), + ..._legacyPorts(json['outputs'], 'output'), + ..._legacyPorts(json['inouts'], 'inout'), + ]; + final rawChildren = json['subModules']; + if (rawChildren is! List) { + throw FormatException('Legacy module "$name" has invalid subModules'); + } + + return HierarchyOccurrence( + name: name, + definition: name, + signals: signals, + children: rawChildren.map((child) { + if (child is! Map) { + throw FormatException('Legacy module "$name" has invalid child'); + } + return _legacyOccurrence(Map.from(child)); + }).toList(), + ); + } + + static List _legacyPorts( + Object? rawPorts, + String direction, + ) { + if (rawPorts is! Map) { + return const []; + } + + return rawPorts.entries.indexed.map((entry) { + final portIndex = entry.$1; + final portName = entry.$2.key; + final rawPort = entry.$2.value; + final port = rawPort is Map + ? rawPort + : rawPort is Map + ? Map.from(rawPort) + : const {}; + final declaredName = port['name']; + final width = port['width']; + final value = port['value']; + return SignalOccurrence( + name: declaredName is String ? declaredName : portName.toString(), + width: width is int && width > 0 ? width : 1, + direction: direction, + value: value is String ? value : null, + portIndex: portIndex, + ); + }).toList(); + } + + /// Parse netlist schematic format. + /// + /// This delegates the full hierarchy build to [NetlistHierarchyAdapter] from + /// rohd_hierarchy, avoiding duplication of the netlist parsing logic. + static DesignData _parseNetlistSchematic(Map json) { + final modules = json['modules'] as Map?; + if (modules == null || modules.isEmpty) { + throw const FormatException('Yosys JSON contained no modules'); + } + + final service = NetlistHierarchyAdapter.fromMap(json); + + return DesignData( + hierarchy: service, + schematicJson: json, + format: DesignDataFormat.netlistSchematic, + creator: json['creator'] as String?, + ); + } + + /// Parse unified format with netlist/schematic as the single source + /// of truth. + /// + /// The `netlist` (or `schematic`) section contains the complete module + /// hierarchy with ports, cells, and optionally connectivity. The + /// hierarchy tree is built from this netlist. + static DesignData _parseUnified(Map json) { + // Support both 'schematic' and 'netlist' keys for the netlist section. + final schematicSection = + (json['schematic'] ?? json['netlist']) as Map?; + + if (schematicSection == null) { + throw const FormatException( + 'Unified format missing netlist/schematic section', + ); + } + + // Normalize schematic section to {modules: {...}} format + Map schematicJson; + if (schematicSection.containsKey('modules')) { + schematicJson = schematicSection; + } else { + schematicJson = {'modules': schematicSection}; + } + + final modulesMap = schematicJson['modules'] as Map?; + if (modulesMap == null || modulesMap.isEmpty) { + throw const FormatException( + 'Unified format: netlist/schematic has no modules', + ); + } + + final rootName = schematicJson['rootInstanceName'] as String?; + final service = NetlistHierarchyAdapter.fromMap( + schematicJson, + rootNameOverride: rootName, + ); + + return DesignData( + hierarchy: service, + schematicJson: schematicJson, + format: DesignDataFormat.unified, + version: json['version'] as String?, + creator: json['creator'] as String?, + ); + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/devtools_dtd_connection.dart b/rohd_devtools_extension/lib/rohd_devtools/services/devtools_dtd_connection.dart new file mode 100644 index 0000000000..94ce161d28 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/devtools_dtd_connection.dart @@ -0,0 +1,2 @@ +export 'devtools_dtd_connection_stub.dart' + if (dart.library.js_interop) 'devtools_dtd_connection_web.dart'; diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/devtools_dtd_connection_stub.dart b/rohd_devtools_extension/lib/rohd_devtools/services/devtools_dtd_connection_stub.dart new file mode 100644 index 0000000000..e6cd3ec20e --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/devtools_dtd_connection_stub.dart @@ -0,0 +1,13 @@ +import 'package:dtd/dtd.dart'; +import 'package:flutter/foundation.dart'; +import 'package:vm_service/vm_service.dart'; + +/// DTD connection exposed by DevTools, unavailable on non-web platforms. +final ValueListenable devToolsDtdConnection = + ValueNotifier(null); + +/// VM service exposed by DevTools, unavailable on non-web platforms. +VmService? get devToolsVmService => null; + +/// Main isolate exposed by DevTools, unavailable on non-web platforms. +String? get devToolsMainIsolateId => null; diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/devtools_dtd_connection_web.dart b/rohd_devtools_extension/lib/rohd_devtools/services/devtools_dtd_connection_web.dart new file mode 100644 index 0000000000..e0ea07cfd7 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/devtools_dtd_connection_web.dart @@ -0,0 +1,15 @@ +import 'package:devtools_extensions/devtools_extensions.dart'; +import 'package:dtd/dtd.dart'; +import 'package:flutter/foundation.dart'; +import 'package:vm_service/vm_service.dart'; + +/// DTD connection managed by the containing DevTools application. +ValueListenable get devToolsDtdConnection => + dtdManager.connection; + +/// VM service managed by the containing DevTools application. +VmService? get devToolsVmService => serviceManager.service; + +/// Main isolate managed by the containing DevTools application. +String? get devToolsMainIsolateId => + serviceManager.isolateManager.mainIsolate.value?.id; diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/extension_manager_bridge.dart b/rohd_devtools_extension/lib/rohd_devtools/services/extension_manager_bridge.dart new file mode 100644 index 0000000000..7679c6d471 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/extension_manager_bridge.dart @@ -0,0 +1,2 @@ +export 'extension_manager_bridge_io.dart' + if (dart.library.js_interop) 'extension_manager_bridge_web.dart'; diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/extension_manager_bridge_io.dart b/rohd_devtools_extension/lib/rohd_devtools/services/extension_manager_bridge_io.dart new file mode 100644 index 0000000000..fc08ff7961 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/extension_manager_bridge_io.dart @@ -0,0 +1,5 @@ +/// Sets whether the embedding DevTools extension uses a dark theme. +/// +/// No-op stub for non-web platforms where the extension manager is +/// unavailable. +void setExtensionDarkThemeEnabled({required bool enabled}) {} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/extension_manager_bridge_web.dart b/rohd_devtools_extension/lib/rohd_devtools/services/extension_manager_bridge_web.dart new file mode 100644 index 0000000000..d086f33290 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/extension_manager_bridge_web.dart @@ -0,0 +1,6 @@ +import 'package:devtools_extensions/devtools_extensions.dart'; + +/// Sets whether the embedding DevTools extension uses a dark theme. +void setExtensionDarkThemeEnabled({required bool enabled}) { + extensionManager.darkThemeEnabled.value = enabled; +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/flc_extension_client.dart b/rohd_devtools_extension/lib/rohd_devtools/services/flc_extension_client.dart new file mode 100644 index 0000000000..c46d5d1e2e --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/flc_extension_client.dart @@ -0,0 +1,166 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// flc_extension_client.dart +// RohdExtensionClient implementation backed by the local FlcService. +// +// Used in DevTools-embedded mode and standalone mode when the app is +// connected to a running ROHD VM. The FlcService fetches FLC trace data +// from the live isolate, so the extension is "always available" from the +// perspective of viewers embedded within the DevTools shell. +// +// 2026 May +// Author: Desmond Kirkpatrick + +import 'package:flutter/foundation.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/flc_service.dart'; +import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart'; + +/// [RohdExtensionClient] backed by a [FlcService]. +/// +/// Used in DevTools / standalone mode where the app already has a live +/// connection to the running ROHD VM and can fetch FLC data directly. +/// +/// - [isAvailable] is always `true` once the client is constructed (the +/// DevTools shell is the "extension" in this context). +/// - [queryModule] fetches FLC data for the module and determines which +/// source formats are present. +/// +/// File availability (whether the source file exists on disk) cannot be +/// checked from within the Flutter DevTools app — that is a VS Code +/// host concern. [RohdFormatInfo.fileFound] is therefore always `true` +/// when the format is present in the FLC data (it was found at build time). +class FlcExtensionClient implements RohdExtensionClient { + final FlcService _flcService; + + @override + final isAvailable = ValueNotifier(true); + + @override + final currentModuleInfo = ValueNotifier(null); + + /// Creates an extension client backed by [flcService]. + FlcExtensionClient({required FlcService flcService}) + : _flcService = flcService; + + @override + Future ping() async { + // The FlcService is in-process; always reachable. + isAvailable.value = true; + return true; + } + + @override + Future queryModule( + String module, { + List? instancePath, + }) async { + final fullPath = instancePath?.join('/') ?? ''; + debugPrint( + '[CrossProbe] queryModule: "$module"' + '${instancePath != null ? " instancePath=$fullPath" : ""}', + ); + try { + var formatKeys = await _flcService.getModuleFormats(module); + debugPrint( + '[CrossProbe] queryModule "$module": ' + 'formats by class name = $formatKeys', + ); + + // If no formats found by the definition/class name, fall back to the + // last non-empty segment of instancePath (the instance name). This + // handles the common case where FLC data is indexed by instance name + // (e.g. "serializer") but the schematic passes the class name + // (e.g. "Serializer") as the primary query key. + if (formatKeys.isEmpty && instancePath != null) { + final instanceName = instancePath.lastWhere( + (s) => s.isNotEmpty, + orElse: () => '', + ); + if (instanceName.isNotEmpty && instanceName != module) { + debugPrint( + '[CrossProbe] queryModule "$module": ' + 'trying instance name fallback "$instanceName"', + ); + final fallbackKeys = await _flcService.getModuleFormats(instanceName); + debugPrint( + '[CrossProbe] queryModule fallback "$instanceName": ' + 'formats = $fallbackKeys', + ); + if (fallbackKeys.isNotEmpty) { + formatKeys = fallbackKeys; + } + } + } + + final formats = {}; + + for (final key in formatKeys) { + final fmt = _parseFormat(key); + if (fmt == null) { + continue; + } + // Files were found at compile/trace time; we assume they're present. + formats[fmt] = const RohdFormatInfo(available: true, fileFound: true); + } + + debugPrint( + '[CrossProbe] queryModule result: ' + 'module="$module" ' + 'formats=${formats.keys.map((f) => f.name).toList()}', + ); + final info = RohdModuleInfo( + extensionAvailable: true, + module: module, + formats: formats, + ); + currentModuleInfo.value = info; + return info; + } on Exception catch (e) { + debugPrint('[CrossProbe] queryModule "$module": ERROR $e'); + final info = RohdModuleInfo( + extensionAvailable: true, + module: module, + error: e.toString(), + ); + currentModuleInfo.value = info; + return info; + } + } + + @override + void dispose() { + isAvailable.dispose(); + currentModuleInfo.dispose(); + } + + // In DevTools mode, frame lookup is handled locally by the embedding app + // (confapp / devtools shell) via FlcData — not through this client. + @override + Future>> lookupSignalFrames({ + required List> signals, + String? format, + }) async => + const []; + + @override + void openSourceLocation({ + required String file, + required int line, + int col = 0, + }) { + // In DevTools mode, source navigation is handled by the embedding app. + debugPrint( + '[FlcExtensionClient] openSourceLocation: $file:$line:$col ' + '(no-op in DevTools mode)', + ); + } + + static RohdSourceFormat? _parseFormat(String key) => switch (key) { + 'rohd' => RohdSourceFormat.rohd, + 'sv' => RohdSourceFormat.sv, + 'sc' => RohdSourceFormat.sc, + 'fst' => RohdSourceFormat.fst, + _ => null, + }; +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/flc_service.dart b/rohd_devtools_extension/lib/rohd_devtools/services/flc_service.dart new file mode 100644 index 0000000000..1e19f32086 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/flc_service.dart @@ -0,0 +1,404 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// flc_service.dart +// FLC resolution service — resolves signal names to source frames using +// FLC data fetched from the running ROHD application. +// +// 2026 April 27 +// Author: Desmond Kirkpatrick + +import 'package:flutter/foundation.dart'; +import 'package:rohd_source_navigator/flc_data.dart'; + +/// Fetches per-module FLC JSON from the running ROHD app. +typedef FlcModuleFetcher = Future?> Function( + String definitionName, +); + +/// Fetches the full FLC hierarchy JSON from the running ROHD app. +typedef FlcHierarchyFetcher = Future?> Function(); + +/// Fetches the FLC file path from the running ROHD app. +/// +/// The path is an absolute filesystem path to the `.flc.json` sidecar +/// written by `FlcService.current?.writtenPath` in the live isolate. +typedef FlcPathFetcher = Future Function(); + +/// A resolved source frame ready to be sent to the ROHD VS Code extension. +/// +/// Mirrors the `SourceFrame` interface expected by `rohd.openSourceLocations`. +class SourceFrame { + /// File path (package-relative, e.g. `lib/src/foo.dart`). + final String file; + + /// 1-based line number. + final int line; + + /// 1-based column number. + final int col; + + /// Optional description (e.g. function name from stack trace). + final String? desc; + + /// Frame type: `'sv'` for SystemVerilog, `'rohd'` for ROHD Dart source. + final String type; + + /// Creates a [SourceFrame]. + const SourceFrame({ + required this.file, + required this.line, + required this.col, + this.desc, + this.type = 'rohd', + }); + + /// Serialize to JSON for transmission over DTD. + Map toJson() => { + 'file': file, + 'line': line, + 'col': col, + if (desc != null) 'desc': desc, + 'type': type, + }; +} + +/// Service that resolves signal/instance names to [SourceFrame] lists +/// using FLC data fetched from the running ROHD application via the +/// tree service. +/// +/// Caches [FlcData] per module definition name and provides lookup +/// methods that produce frames compatible with the `rohd.openSourceLocations` +/// VS Code command. +class FlcService { + /// Fetches per-module FLC JSON from the running ROHD app. + final FlcModuleFetcher _fetchModuleFlc; + + /// Fetches the full FLC hierarchy JSON. + final FlcHierarchyFetcher _fetchFlcHierarchy; + + /// Optional fetcher for the FLC file path (used for DTD-based lookup). + final FlcPathFetcher? _fetchFlcFilePath; + + /// Optional callback to clear upstream caches (e.g. TreeService). + final VoidCallback? _onClearCache; + + /// Parsed FLC data, keyed by module definition name. + final _cache = {}; + + /// FLC data parsed from the full hierarchy fetch. + FlcData? _hierarchyFlc; + + /// Cached FLC file path (returned by the VM after writing to disk). + String? _cachedFlcPath; + + /// Creates a [FlcService] with the supplied fetchers. + FlcService({ + required FlcModuleFetcher fetchModuleFlc, + required FlcHierarchyFetcher fetchFlcHierarchy, + FlcPathFetcher? fetchFlcFilePath, + VoidCallback? onClearCache, + }) : _fetchModuleFlc = fetchModuleFlc, + _fetchFlcHierarchy = fetchFlcHierarchy, + _fetchFlcFilePath = fetchFlcFilePath, + _onClearCache = onClearCache; + + /// Resolve a signal to a list of [SourceFrame]s. + /// + /// [moduleName] is the module definition name (e.g. `'AdderModule'`). + /// [signalName] is the signal name within that module (e.g. `'sum'`). + /// + /// Returns an empty list if the signal cannot be resolved. + Future> resolveSignal( + String moduleName, + String signalName, + ) async { + final flcData = await _getFlcData(moduleName); + if (flcData == null) { + return []; + } + + // Try signal lookup first, then instance lookup. + final entry = flcData.lookupSignalEntry(moduleName, signalName) ?? + flcData.lookupInstanceEntry(moduleName, signalName); + if (entry == null) { + debugPrint( + '[FlcService] No FLC entry for ' + '$moduleName.$signalName', + ); + debugPrint('[FlcService] Available modules: ${flcData.moduleNames}'); + debugPrint( + '[FlcService] Signals in $moduleName: ' + '${flcData.signalNamesFor(moduleName)}', + ); + debugPrint( + '[FlcService] Instances in $moduleName: ' + '${flcData.instanceNamesFor(moduleName)}', + ); + return []; + } + + return _entryToFrames(entry, signalName: signalName); + } + + /// Resolve multiple signals at once. + /// + /// Each signal is a map with `'module'` and `'name'` keys. + /// Returns all resolved frames concatenated (suitable for multi-frame + /// navigation in the ROHD VS Code extension). + Future> resolveSignals( + List> signals, + ) async { + final allFrames = []; + for (final signal in signals) { + final module = signal['module'] ?? ''; + final name = signal['name'] ?? ''; + if (module.isEmpty || name.isEmpty) { + continue; + } + final frames = await resolveSignal(module, name); + allFrames.addAll(frames); + } + return allFrames; + } + + /// Parse a signal path (e.g. `"Root/mod1/signalName"`) into a + /// module + signal name pair and resolve it. + /// + /// The module name is the second-to-last segment; the signal name is + /// the last segment. This matches the convention used by the schematic + /// canvas `onGoToSource` callback. + Future> resolveSignalPath(String path) async { + final segments = path.split('/'); + if (segments.length < 2) { + return []; + } + final signalName = segments.last; + final moduleName = segments[segments.length - 2]; + final frames = await resolveSignal(moduleName, signalName); + return frames; + } + + /// Resolve multiple signal paths. + Future> resolveSignalPaths(List paths) async { + final allFrames = []; + for (final path in paths) { + final frames = await resolveSignalPath(path); + allFrames.addAll(frames); + } + return allFrames; + } + + /// Return the set of source format identifiers available for [moduleName]. + /// + /// Scans the FLC data for the module and checks which frame types are + /// present. Returns one or more of `'rohd'`, `'sv'`, `'sc'`, etc. + /// + /// Returns an empty set when the module is unknown or the FLC data + /// has not been loaded yet. + Future> getModuleFormats(String moduleName) async { + final flcData = await _getFlcData(moduleName); + if (flcData == null) { + debugPrint('[FlcService] getModuleFormats($moduleName): flcData is null'); + return const {}; + } + + final signalNames = flcData.signalNamesFor(moduleName); + final instanceNames = flcData.instanceNamesFor(moduleName); + debugPrint( + '[FlcService] getModuleFormats($moduleName): ' + 'flcData.moduleNames=${flcData.moduleNames}, ' + 'signals=${signalNames.length}, instances=${instanceNames.length}', + ); + + final formats = {}; + for (final signal in signalNames) { + final entry = flcData.lookupSignalEntry(moduleName, signal); + if (entry == null) { + continue; + } + if (entry.frames.isNotEmpty) { + formats.add('rohd'); + } + for (final outFrame in entry.outputFrames) { + if (outFrame.type.isNotEmpty) { + formats.add(outFrame.type); + } + } + // Short-circuit: all three main formats found. + if (formats.containsAll(['rohd', 'sv', 'sc'])) { + break; + } + } + + // Also check instance entries (sub-modules expose their own frames). + if (!formats.containsAll(['rohd', 'sv', 'sc'])) { + for (final inst in instanceNames) { + final entry = flcData.lookupInstanceEntry(moduleName, inst); + if (entry == null) { + continue; + } + if (entry.frames.isNotEmpty) { + formats.add('rohd'); + } + for (final outFrame in entry.outputFrames) { + if (outFrame.type.isNotEmpty) { + formats.add(outFrame.type); + } + } + if (formats.containsAll(['rohd', 'sv', 'sc'])) { + break; + } + } + } + + debugPrint('[FlcService] getModuleFormats($moduleName): formats=$formats'); + return formats; + } + + /// Clear all cached FLC data. + /// + /// Call on VM disconnect or debug restart. + void clearCache() { + _cache.clear(); + _hierarchyFlc = null; + _cachedFlcPath = null; + _onClearCache?.call(); + debugPrint('[FlcService] Cache cleared'); + } + + /// Return the FLC file path from the running ROHD app, or `null` if + /// no FLC path fetcher was provided or the fetch fails. + /// + /// The result is cached after the first successful fetch so subsequent + /// calls are effectively free. + Future getFlcPath() async { + if (_cachedFlcPath != null) { + return _cachedFlcPath; + } + if (_fetchFlcFilePath == null) { + return null; + } + _cachedFlcPath = await _fetchFlcFilePath(); + debugPrint('[FlcService] getFlcPath: $_cachedFlcPath'); + return _cachedFlcPath; + } + + // --------------------------------------------------------------------------- + // Internal + // --------------------------------------------------------------------------- + + /// Get parsed FLC data for a module, fetching and caching as needed. + Future _getFlcData(String moduleName) async { + // Check per-module cache. + if (_cache.containsKey(moduleName)) { + debugPrint('[FlcService] _getFlcData($moduleName): per-module cache hit'); + return _cache[moduleName]; + } + + // Check hierarchy-level cache (covers all modules at once). + if (_hierarchyFlc != null && + _hierarchyFlc!.moduleNames.contains(moduleName)) { + debugPrint('[FlcService] _getFlcData($moduleName): hierarchy cache hit'); + return _hierarchyFlc; + } + + // Fetch per-module FLC from the running app. + final json = await _fetchModuleFlc(moduleName); + if (json == null) { + debugPrint( + '[FlcService] _getFlcData($moduleName): ' + 'per-module fetch returned null, trying hierarchy', + ); + // Try hierarchy-level fetch as fallback. + final hierarchy = await _fetchAndCacheHierarchy(moduleName); + return hierarchy; + } + + // Detect error responses from the running app (e.g. + // {"status": "unavailable", "reason": "trace service not registered"}). + if (json.containsKey('status') && json['status'] != 'ok') { + debugPrint( + '[FlcService] _getFlcData($moduleName): ' + 'error response: ${json['status']} — ${json['reason'] ?? ''}', + ); + // Fall through to hierarchy fetch. + final hierarchy = await _fetchAndCacheHierarchy(moduleName); + return hierarchy; + } + + final rawStr = json.toString(); + final rawPreview = rawStr.substring(0, rawStr.length.clamp(0, 300)); + debugPrint( + '[FlcService] _getFlcData($moduleName): ' + 'raw JSON keys=${json.keys.toList()}, ' + 'raw=$rawPreview', + ); + + // Parse and cache. The per-module JSON from TraceService uses the + // trie-based v5 format. + final flcData = FlcData.fromJson(json); + debugPrint( + '[FlcService] _getFlcData($moduleName): ' + 'fetched & parsed, modules=${flcData.moduleNames}', + ); + _cache[moduleName] = flcData; + return flcData; + } + + /// Fetch the full FLC hierarchy and cache it. + Future _fetchAndCacheHierarchy(String moduleName) async { + if (_hierarchyFlc != null) { + return _hierarchyFlc; + } + + final json = await _fetchFlcHierarchy(); + if (json == null) { + return null; + } + + return _hierarchyFlc = FlcData.fromJson(json); + } + + /// Convert an [FlcEntry] to a list of [SourceFrame]s. + /// + /// FLC traces are stored innermost → outermost, but the VS Code extension + /// navigates to frame[0] first. Reverse the ROHD frames so the outermost + /// (user-facing) call site appears first, with deeper implementation + /// frames available via Next/Prev cycling. + /// + /// When [signalName] is provided it is stored in [SourceFrame.desc] so + /// downstream consumers (e.g. the source-frame picker) can derive a + /// highlight prefix for the target line. + List _entryToFrames(FlcEntry entry, {String? signalName}) { + final frames = []; + + // Add ROHD source frames in outermost-first order. + for (final f in entry.frames.reversed) { + frames.add( + SourceFrame( + file: f.file, + line: f.line, + col: f.column, + desc: signalName, + type: f.type, + ), + ); + } + + // Add output-language frames (SV, SC, etc.) if present. + for (final of in entry.outputFrames) { + frames.add( + SourceFrame( + file: of.file, + line: of.line, + col: of.column, + desc: signalName, + type: of.type, + ), + ); + } + + return frames; + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/in_process_transport.dart b/rohd_devtools_extension/lib/rohd_devtools/services/in_process_transport.dart new file mode 100755 index 0000000000..745d49d0c9 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/in_process_transport.dart @@ -0,0 +1,230 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// in_process_transport.dart +// In-process transport — calls WaveformDataService/ModuleServices directly. +// +// This is the loopback counterpart of VmServiceTransport: instead of +// sending RPCs over a WebSocket, it calls the ROHD diagnostics singletons +// directly in the same isolate. +// +// 2026 April +// Author: Desmond Kirkpatrick + +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:rohd/rohd.dart' + show ModuleServices, NetlistService, WaveformDataService; +import 'package:rohd_devtools_extension/rohd_devtools/services/rohd_service_transport.dart'; +import 'package:rohd_waveform/rohd_waveform.dart'; + +/// [RohdServiceTransport] that calls [WaveformDataService] and [ModuleServices] +/// directly in the same process. +/// +/// No WebSocket, no JSON-over-wire — the cheapest possible transport. +/// JSON serialization/deserialization is still needed because the server +/// singletons' public API returns JSON strings. +class InProcessTransport implements RohdServiceTransport { + /// Human-readable name for logging. + final String name; + + bool _connected = true; + int _lastFetchedTime = 0; + + /// Stream controller for update events. + final _updateController = StreamController.broadcast(); + + /// Creates an in-process transport. + InProcessTransport({this.name = 'In-Process'}); + + @override + bool get isConnected => _connected; + + @override + String get modeDescription => 'In-Process ($name)'; + + @override + int get lastFetchedTime => _lastFetchedTime; + + @override + Stream get liveUpdates => _updateController.stream; + + /// Fetch current time and emit an update event. + Future fetchAndEmitCurrentTime() async { + final time = await getCurrentTime(); + if (time != null && time > _lastFetchedTime) { + _lastFetchedTime = time; + _updateController.add( + WaveformUpdateEvent( + incrementalData: const [], + reason: WaveformUpdateReason.periodic, + upToTime: time, + ), + ); + } + } + + // ───────────────────────────────────────────────────────────────────────── + // Waveform RPCs + // ───────────────────────────────────────────────────────────────────────── + + @override + Future getCurrentTime() async { + if (!_connected) { + return null; + } + try { + return WaveformDataService.instance.currentTime; + } on Exception catch (e) { + debugPrint('[InProcessTransport] getCurrentTime error: $e'); + return null; + } + } + + @override + Future?> getSnapshotCompact(int time) async { + if (!_connected) { + return null; + } + try { + final jsonStr = WaveformDataService.instance.getSnapshotCompactJSON(time); + return jsonDecode(jsonStr) as Map; + } on Exception catch (e) { + debugPrint('[InProcessTransport] getSnapshotCompact error: $e'); + return null; + } + } + + @override + Future> getWaveformDataCompact({ + required List signalAddresses, + required Map addressToSignalId, + int? startTime, + int? endTime, + }) async { + if (!_connected) { + return const []; + } + try { + final jsonStr = WaveformDataService.instance.getWaveformsCompactJSON( + jsonEncode(signalAddresses), + startTime ?? 0, + endTime ?? -1, + ); + final list = jsonDecode(jsonStr) as List; + return _parseCompactWaveformData(list, addressToSignalId); + } on Exception catch (e) { + debugPrint('[InProcessTransport] getWaveformDataCompact error: $e'); + return const []; + } + } + + @override + Future> getWaveformDataWithTimepointsCompact({ + required Map signalTimepoints, + required Map addressToSignalId, + }) async { + if (!_connected) { + return const []; + } + try { + final jsonStr = WaveformDataService.instance + .getDataWithTimepointsCompactJSON(jsonEncode(signalTimepoints)); + final list = jsonDecode(jsonStr) as List; + return _parseCompactWaveformData(list, addressToSignalId); + } on Exception catch (e) { + debugPrint( + '[InProcessTransport] ' + 'getWaveformDataWithTimepointsCompact error: $e', + ); + return const []; + } + } + + // ───────────────────────────────────────────────────────────────────────── + // Hierarchy RPCs + // ───────────────────────────────────────────────────────────────────────── + + @override + Future?> getModuleTree() async { + if (!_connected) { + return null; + } + try { + final jsonString = NetlistService.current?.slimJson ?? + ModuleServices.instance.hierarchyJson; + return jsonDecode(jsonString) as Map; + } on Exception catch (e) { + debugPrint('[InProcessTransport] getModuleTree error: $e'); + return null; + } + } + + @override + Future?> getModuleNetlist(String definitionName) async { + if (!_connected) { + return null; + } + try { + final jsonString = NetlistService.current?.moduleJson(definitionName); + if (jsonString == null) { + return null; + } + final decoded = jsonDecode(jsonString) as Map; + if (decoded.containsKey('status')) { + return null; + } + // New format wraps module data under a 'modules' key. + if (decoded.containsKey('modules') && + !decoded.containsKey(definitionName)) { + return decoded['modules'] as Map; + } + return decoded; + } on Exception catch (e) { + debugPrint('[InProcessTransport] getModuleNetlist error: $e'); + return null; + } + } + + // ───────────────────────────────────────────────────────────────────────── + // Lifecycle + // ───────────────────────────────────────────────────────────────────────── + + @override + Future dispose() async { + _connected = false; + await _updateController.close(); + } + + // ───────────────────────────────────────────────────────────────────────── + // Parsing helpers + // ───────────────────────────────────────────────────────────────────────── + + /// Parse compact (address-keyed) waveform JSON into [WaveformData] list. + /// + /// The compact format uses abbreviated keys: `i` (address), `d` (data + /// array), `t` (time), `v` (value). + List _parseCompactWaveformData( + List list, + Map addressToSignalId, + ) { + final result = []; + for (final item in list) { + final map = item as Map; + final addr = map['i'] as String; + final signalId = addressToSignalId[addr]; + if (signalId == null) { + continue; + } + final rawData = map['d'] as List? ?? const []; + final dataPoints = rawData.map((d) { + final dp = d as Map; + return Data(time: dp['t'] as int, value: dp['v'].toString()); + }).toList(); + result.add(WaveformData(signalId: signalId, data: dataPoints)); + } + return result; + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/in_process_tree_data_source.dart b/rohd_devtools_extension/lib/rohd_devtools/services/in_process_tree_data_source.dart new file mode 100644 index 0000000000..2f97209b04 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/in_process_tree_data_source.dart @@ -0,0 +1,221 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// in_process_tree_data_source.dart +// Tree data source that calls ModuleServices.instance directly (in-process). +// +// 2026 April +// Author: Desmond Kirkpatrick + +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:rohd/rohd.dart' + show ModuleServices, NetlistService, TraceService; +import 'package:rohd_devtools_extension/rohd_devtools/models/tree_model.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/design_data_adapter.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/tree_data_source.dart'; + +/// [TreeDataSource] that calls [ModuleServices] directly in the same process. +/// +/// This replaces the VM-service path for loopback/demo mode: instead of +/// sending JSON over WebSocket → evaluate() → parse, it calls the ROHD +/// diagnostics singletons directly. +/// +/// Requires that the ROHD module has been built and waveform dumping has been +/// initialized so the ROHD services are available. +class InProcessTreeDataSource implements TreeDataSource { + /// Human-readable name for this data source. + final String name; + + bool _isRunning = true; + + /// Cached schematic JSON from the last load. + Map? _cachedSchematicJson; + + /// Creates an in-process tree data source. + InProcessTreeDataSource({this.name = 'In-Process'}); + + @override + bool get isConnected => _isRunning; + + @override + String get modeDescription => 'In-Process ($name)'; + + @override + Map? getSchematicJson() => _cachedSchematicJson; + + @override + Future evalModuleTree() async { + if (!_isRunning) { + return null; + } + + try { + // Read the unified netlist directly — same as what + // VmServiceTreeDataSource does via evaluate(). + final jsonString = NetlistService.current?.slimJson ?? + ModuleServices.instance.hierarchyJson; + final jsonMap = jsonDecode(jsonString) as Map; + + if (jsonMap['status'] == 'fail') { + debugPrint('[InProcessTree] ModuleServices returned status=fail'); + return null; + } + + final designData = DesignDataAdapter.parseJson(jsonMap); + _cachedSchematicJson = designData.schematicJson; + + debugPrint( + '[InProcessTree] Loaded tree: ' + '${designData.hierarchy.root.name} ' + '(schematic: ${_cachedSchematicJson != null})', + ); + + return designData.hierarchy.root; + } on Object catch (error, stackTrace) { + debugPrint('[InProcessTree] evalModuleTree error: $error\n$stackTrace'); + return null; + } + } + + @override + Future refreshModuleTree() { + _cachedSchematicJson = null; + return evalModuleTree(); + } + + @override + Future?> fetchModuleSchematic( + String definitionName, + ) async { + if (!_isRunning) { + return null; + } + + try { + // Read the per-module netlist directly — same as + // VmServiceTreeDataSource's incremental loading. + final jsonString = NetlistService.current?.moduleJson(definitionName); + if (jsonString == null) { + return null; + } + + var result = jsonDecode(jsonString) as Map; + + if (result.containsKey('status')) { + debugPrint( + '[InProcessTree] fetchModuleSchematic: ' + '"$definitionName" not found', + ); + return null; + } + + // New format wraps module data under a 'modules' key. + if (result.containsKey('modules') && + !result.containsKey(definitionName)) { + result = result['modules'] as Map; + } + + debugPrint( + '[InProcessTree] fetchModuleSchematic: ' + '"$definitionName" → ${jsonEncode(result).length} bytes', + ); + + // Also update the cached schematic with the expanded module data. + if (_cachedSchematicJson != null) { + final modules = + _cachedSchematicJson!['modules'] as Map?; + if (modules != null && result.containsKey(definitionName)) { + modules[definitionName] = result[definitionName]; + } + } + + return result; + } on Exception catch (e) { + debugPrint('[InProcessTree] fetchModuleSchematic error: $e'); + return null; + } + } + + @override + Future dispose() async { + _isRunning = false; + _cachedSchematicJson = null; + } + + // ─── FLC (source cross-probe) ────────────────────────────────────── + + /// Fetch per-module FLC JSON by calling `ModuleServices` directly. + Future?> fetchModuleFlc(String definitionName) async { + if (!_isRunning) { + return null; + } + try { + final jsonString = TraceService.current?.flcModuleJson(definitionName) ?? + '{"status":"unavailable"}'; + final result = jsonDecode(jsonString) as Map; + if (result.containsKey('status') && result['status'] != 'ok') { + debugPrint( + '[InProcessTree] fetchModuleFlc: ' + '"$definitionName" → ${result['status']}', + ); + return null; + } + return result; + } on Exception catch (e) { + debugPrint('[InProcessTree] fetchModuleFlc error: $e'); + return null; + } + } + + /// Fetch the full FLC hierarchy JSON by calling `ModuleServices` directly. + Future?> fetchFlcHierarchy() async { + if (!_isRunning) { + return null; + } + try { + final jsonString = + TraceService.current?.flcJson ?? '{"status":"unavailable"}'; + final result = jsonDecode(jsonString) as Map; + if (result.containsKey('status') && result['status'] != 'ok') { + debugPrint('[InProcessTree] fetchFlcHierarchy: ${result['status']}'); + return null; + } + return result; + } on Exception catch (e) { + debugPrint('[InProcessTree] fetchFlcHierarchy error: $e'); + return null; + } + } + + /// Clear upstream FLC caches (no-op for in-process). + void clearFlcCache() { + // Nothing to clear — ModuleServices always returns fresh data. + } + + /// Returns the FLC file path by delegating to `ModuleServices.instance`. + /// + /// In in-process mode the running ROHD app is in the same isolate, so we can + /// call `TraceService.current?.writtenPath ?? '{"status":"unavailable"}'` + /// directly. + Future fetchFlcFilePath() async { + if (!_isRunning) { + return null; + } + try { + final path = + TraceService.current?.writtenPath ?? '{"status":"unavailable"}'; + // The getter returns a JSON error string on failure. + if (path.startsWith('{')) { + debugPrint('[InProcessTree] fetchFlcFilePath: unavailable: $path'); + return null; + } + debugPrint('[InProcessTree] fetchFlcFilePath: $path'); + return path; + } on Exception catch (e) { + debugPrint('[InProcessTree] fetchFlcFilePath error: $e'); + return null; + } + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/in_process_waveform_data_source.dart b/rohd_devtools_extension/lib/rohd_devtools/services/in_process_waveform_data_source.dart new file mode 100755 index 0000000000..167a996244 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/in_process_waveform_data_source.dart @@ -0,0 +1,304 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// in_process_waveform_data_source.dart +// Waveform data source that calls WaveformDataService directly (in-process). +// +// 2026 April +// Author: Desmond Kirkpatrick + +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:rohd/rohd.dart' show WaveformDataService; +import 'package:rohd_devtools_extension/rohd_devtools/services/waveform_data_source.dart'; +import 'package:rohd_waveform/rohd_waveform.dart'; + +/// [WaveformDataSource] that calls [WaveformDataService] directly in the same +/// process. +/// +/// Mirrors the VM-service-backed waveform data source but bypasses the VM +/// service WebSocket protocol entirely. JSON serialization/deserialization is +/// still used because [WaveformDataService]'s public API returns JSON strings +/// (the same format as the `ext.rohd.*` service extensions). +/// +/// This is the waveform-side counterpart of the in-process tree data source. +class InProcessWaveformDataSource implements WaveformDataSource { + /// Human-readable name for this data source. + final String name; + + bool _connected = true; + + /// Monotonic ID for compact waveform debug logs. + int _compactRequestSequence = 0; + + int _lastFetchedTime = 0; + + /// Stream controller for update events. + final _updateController = StreamController.broadcast(); + + /// Creates an in-process waveform data source. + InProcessWaveformDataSource({this.name = 'In-Process'}); + + @override + bool get isConnected => _connected; + + @override + String get modeDescription => 'In-Process ($name)'; + + @override + int get lastFetchedTime => _lastFetchedTime; + + @override + Stream get liveUpdates => _updateController.stream; + + // ───────────────────────────────────────────────────────────────────────── + // Current time + // ───────────────────────────────────────────────────────────────────────── + + @override + Future getCurrentTime() async { + if (!_connected) { + return null; + } + try { + return WaveformDataService.instance.currentTime; + } on Exception catch (e) { + debugPrint('[InProcessWaveform] getCurrentTime error: $e'); + return null; + } + } + + /// Fetch current time and emit an update event (mirrors + /// VmServiceWaveformDataSource.fetchAndEmitCurrentTime). + Future fetchAndEmitCurrentTime() async { + final time = await getCurrentTime(); + if (time != null && time > _lastFetchedTime) { + _lastFetchedTime = time; + _updateController.add( + WaveformUpdateEvent( + incrementalData: const [], + reason: WaveformUpdateReason.periodic, + upToTime: time, + ), + ); + } + } + + // ───────────────────────────────────────────────────────────────────────── + // Snapshots + // ───────────────────────────────────────────────────────────────────────── + + @override + // Not used — compact snapshot is preferred. + Future>?> getSnapshot(int time) async => + null; + + @override + Future?> getSnapshotCompact(int time) async { + if (!_connected) { + return null; + } + try { + final jsonStr = WaveformDataService.instance.getSnapshotCompactJSON(time); + return jsonDecode(jsonStr) as Map; + } on Exception catch (e) { + debugPrint('[InProcessWaveform] getSnapshotCompact error: $e'); + return null; + } + } + + // ───────────────────────────────────────────────────────────────────────── + // Waveform data (legacy string-keyed) + // ───────────────────────────────────────────────────────────────────────── + + @override + Future> getWaveformData({ + required List signalIds, + int? startTime, + int? endTime, + }) { + // Delegate to the timepoint-based path which calls WaveformDataService. + final timepoints = { + for (final id in signalIds) id: startTime ?? 0, + }; + return getWaveformDataWithTimepoints(signalTimepoints: timepoints); + } + + @override + Future> getWaveformDataSince({ + required List signalIds, + required int sinceTime, + }) { + // Build per-signal timepoints and delegate. + final timepoints = {for (final id in signalIds) id: sinceTime}; + return getWaveformDataWithTimepoints(signalTimepoints: timepoints); + } + + @override + Future> getWaveformDataWithTimepoints({ + required Map signalTimepoints, + }) async { + if (!_connected) { + return const []; + } + try { + final jsonStr = WaveformDataService.instance.getDataWithTimepointsJSON( + jsonEncode(signalTimepoints), + ); + final list = jsonDecode(jsonStr) as List; + return list.map((e) { + final map = e as Map; + return WaveformData.fromJson(map); + }).toList(); + } on Exception catch (e) { + debugPrint('[InProcessWaveform] getWaveformDataWithTimepoints error: $e'); + return const []; + } + } + + // ───────────────────────────────────────────────────────────────────────── + // Waveform data (compact address-keyed) + // ───────────────────────────────────────────────────────────────────────── + + @override + Future> getWaveformDataCompact({ + required List signalAddresses, + required Map addressToSignalId, + int? startTime, + int? endTime, + }) async { + final requestId = ++_compactRequestSequence; + if (!_connected) { + debugPrint( + '[InProcessWaveform][$requestId] compact request skipped: ' + 'disconnected', + ); + return const []; + } + try { + debugPrint( + '[InProcessWaveform][$requestId] compact request: ' + '${signalAddresses.length} addresses, ' + 'range=${startTime ?? 0}..${endTime ?? -1}, ' + 'sample=${signalAddresses.take(5).join(", ")}', + ); + final jsonStr = WaveformDataService.instance.getWaveformsCompactJSON( + jsonEncode(signalAddresses), + startTime ?? 0, + endTime ?? -1, + ); + final list = jsonDecode(jsonStr) as List; + final parsed = _parseCompactWaveformData(list, addressToSignalId); + final pointCount = parsed.fold( + 0, + (total, waveform) => total + waveform.data.length, + ); + debugPrint( + '[InProcessWaveform][$requestId] compact parsed: ' + '${parsed.length} waveforms / $pointCount points', + ); + return parsed; + } on Exception catch (e) { + debugPrint('[InProcessWaveform] getWaveformDataCompact error: $e'); + return const []; + } + } + + @override + Future> getWaveformDataWithTimepointsCompact({ + required Map signalTimepoints, + required Map addressToSignalId, + }) async { + final requestId = ++_compactRequestSequence; + if (!_connected) { + debugPrint( + '[InProcessWaveform][$requestId] compact timepoint request skipped: ' + 'disconnected', + ); + return const []; + } + try { + debugPrint( + '[InProcessWaveform][$requestId] compact timepoint request: ' + '${signalTimepoints.length} addresses, ' + 'sample=${signalTimepoints.keys.take(5).join(", ")}', + ); + final jsonStr = WaveformDataService.instance + .getDataWithTimepointsCompactJSON(jsonEncode(signalTimepoints)); + final list = jsonDecode(jsonStr) as List; + final parsed = _parseCompactWaveformData(list, addressToSignalId); + final pointCount = parsed.fold( + 0, + (total, waveform) => total + waveform.data.length, + ); + debugPrint( + '[InProcessWaveform][$requestId] compact timepoint parsed: ' + '${parsed.length} waveforms / $pointCount points', + ); + return parsed; + } on Exception catch (e) { + debugPrint( + '[InProcessWaveform] getWaveformDataWithTimepointsCompact ' + 'error: $e', + ); + return const []; + } + } + + // ───────────────────────────────────────────────────────────────────────── + // Signal dictionary + // ───────────────────────────────────────────────────────────────────────── + + // Dictionary is derived locally from ModuleStructure — + // same as VmServiceWaveformDataSource. + @override + Future>?> getSignalDictionary() async => null; + + // ───────────────────────────────────────────────────────────────────────── + // Helpers + // ───────────────────────────────────────────────────────────────────────── + + /// Parse compact waveform JSON: `[{"i": addr, "d": [{"t":, "v":}]}]`. + List _parseCompactWaveformData( + List list, + Map addressToSignalId, + ) { + final result = []; + var unmappedCount = 0; + for (final entry in list) { + final map = entry as Map; + final addr = map['i'] as String; + final signalId = addressToSignalId[addr]; + if (signalId == null) { + unmappedCount++; + continue; + } + final dataList = map['d'] as List? ?? []; + final data = dataList.map((d) { + final dm = d as Map; + return Data(time: dm['t'] as int, value: dm['v'].toString()); + }).toList(); + result.add(WaveformData(signalId: signalId, data: data)); + } + if (unmappedCount > 0) { + debugPrint( + '[InProcessWaveform] compact parse skipped $unmappedCount unmapped ' + 'addresses from ${list.length} rows', + ); + } + return result; + } + + /// Clear cached data and reset last fetched time. + void clearCache() { + _lastFetchedTime = 0; + } + + @override + Future dispose() async { + _connected = false; + await _updateController.close(); + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/io_vm_connection_strategy.dart b/rohd_devtools_extension/lib/rohd_devtools/services/io_vm_connection_strategy.dart index 05c460f4de..078658ba3f 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/services/io_vm_connection_strategy.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/services/io_vm_connection_strategy.dart @@ -11,7 +11,7 @@ import 'dart:async'; import 'package:logging/logging.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/ui/ui.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/vm_connection_strategy.dart'; import 'package:vm_service/vm_service.dart'; import 'package:vm_service/vm_service_io.dart'; @@ -49,10 +49,8 @@ class IoVmConnectionStrategy extends VmConnectionStrategy { throw Exception('Invalid URI format'); } - final vmService = await _connectUri( - normalizedUri.toString(), - _StdoutLog(), - ).timeout( + final vmService = + await _connectUri(normalizedUri.toString(), _StdoutLog()).timeout( const Duration(seconds: 10), onTimeout: () => throw TimeoutException('VM connection timed out after 10 s'), diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/loopback_signal_waveform_api.dart b/rohd_devtools_extension/lib/rohd_devtools/services/loopback_signal_waveform_api.dart new file mode 100644 index 0000000000..c03e6bc8a8 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/loopback_signal_waveform_api.dart @@ -0,0 +1,57 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// loopback_signal_rohd_waveform.dart +// Loopback adapter — thin subclass of BaseSignalWaveformApi. +// +// All shared algorithm (snapshot expansion, evaluator, synthesis, module +// expansion) lives in BaseSignalWaveformApi. This subclass adds only +// loopback-specific behavior: refresh with incremental fetch, dispose, +// and stream merging for live updates. +// +// Used for in-process (loopback) and file-backed (VCD/GHW) modes. +// +// 2026 January +// Author: Desmond Kirkpatrick + +import 'package:rohd_devtools_extension/rohd_devtools/services/base_signal_waveform_api.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/rohd_service_transport.dart'; +import 'package:rohd_waveform/rohd_waveform.dart'; + +/// Loopback adapter that wraps any [RohdServiceTransport] via +/// [BaseSignalWaveformApi]. +/// +/// Used for in-process (loopback) and file-backed (VCD/GHW) modes. +/// Module structure is injected via [setExternalStructure] from the +/// hierarchy path — the waveform API only handles signal *values*. +/// +/// All shared algorithm lives in the base class. This subclass adds: +/// - `refresh()` for incremental data fetch +/// - `dispose()` for resource cleanup +class LoopbackSignalWaveformApi extends BaseSignalWaveformApi { + /// Creates a new loopback adapter for the given transport. + LoopbackSignalWaveformApi(super.transport); + + /// Last fetched time (delegates to transport). + int get lastFetchedTime => transport.lastFetchedTime; + + /// Advance simulation time and get new waveform data. + /// + /// Returns the incremental waveform data for all cached signals. + Future> refresh([int? timeIncrement]) async { + final signalIds = cachedSignalIds.toList(); + if (signalIds.isEmpty) { + return const []; + } + + // Get fresh data for all cached signals. + final newData = await getWaveformData(signalIds: signalIds); + return newData; + } + + /// Dispose resources. + Future dispose() async { + await transport.dispose(); + clearCache(); + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/netlist_const_extractor.dart b/rohd_devtools_extension/lib/rohd_devtools/services/netlist_const_extractor.dart new file mode 100644 index 0000000000..15c29e7fab --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/netlist_const_extractor.dart @@ -0,0 +1,252 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// netlist_const_extractor.dart +// Extracts constant signal values from a Yosys-format netlist JSON. +// +// 2026 March +// Author: Desmond Kirkpatrick + +import 'package:rohd/rohd.dart'; +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; + +/// Extracts constant signal values from a Yosys-format netlist JSON. +/// +/// Walks all modules recursively, finds `$const` cells, resolves which +/// signal each constant drives (via the bit→netname mapping), and returns +/// a map of `{ signalPath: { 'value': '0xFFFE', 'width': 16, 'name': ..., +/// 'computed': true } }` suitable for merging into a snapshot result. +class NetlistConstExtractor { + NetlistConstExtractor._(); + + /// Extract constant signal values from [netlistJson]. + /// + /// [rootName] is the top-level instance name used as path prefix + /// (e.g. `"FilterBank"`). The netlist is walked recursively so that + /// constants inside sub-modules get fully-qualified paths like + /// `"FilterBank/ch0/coeffTap1"`. + static Map> extract( + Map netlistJson, + String rootName, + ) { + final modules = netlistJson['modules'] as Map? ?? {}; + if (modules.isEmpty) { + return const {}; + } + + // Find the top module (marked with top=1 attribute, or first). + String? topName; + for (final entry in modules.entries) { + final attrs = (entry.value as Map)['attributes'] + as Map?; + if (attrs?['top'] == 1) { + topName = entry.key; + break; + } + } + topName ??= modules.keys.first; + + final result = >{}; + + void walkModule(String path, Map moduleData) { + final cells = moduleData['cells'] as Map? ?? {}; + final netnames = moduleData['netnames'] as Map? ?? {}; + final ports = moduleData['ports'] as Map? ?? {}; + + // Build bit → signal-path map for this module scope. + // + // Register narrower signals first so that array elements (e.g. + // `coefficients0_0_`, 16-bit) claim their bits before the wider + // parent signal (e.g. `coefficients0`, 48-bit). This ensures + // that `$const` cells driving individual elements resolve to the + // correct sub-signal path rather than the parent. + final bitToSignal = {}; + + void registerBits(String sigPath, List bits) { + for (final bit in bits) { + if (bit is int) { + bitToSignal.putIfAbsent(bit, () => sigPath); + } + } + } + + for (final entry in ports.entries) { + final pData = entry.value as Map; + final bits = pData['bits'] as List? ?? []; + registerBits('$path/${entry.key}', bits); + } + + // Sort netnames by width (ascending) so narrower sub-signals + // register their bits before wider parent signals. + final sortedNetnames = netnames.entries.toList() + ..sort((a, b) { + final aBits = (a.value as Map)['bits'] as List?; + final bBits = (b.value as Map)['bits'] as List?; + return (aBits?.length ?? 0).compareTo(bBits?.length ?? 0); + }); + + // Also collect width info for parent-composition pass below. + final netnameWidths = {}; + final netnameBits = >{}; + + for (final entry in sortedNetnames) { + final nData = entry.value as Map; + final bits = nData['bits'] as List? ?? []; + final intBits = bits.whereType().toList(); + final sigPath = '$path/${entry.key}'; + netnameWidths[sigPath] = intBits.length; + netnameBits[sigPath] = intBits; + registerBits(sigPath, bits); + } + + for (final cellEntry in cells.entries) { + final cellName = cellEntry.key; + final cellData = cellEntry.value as Map; + final cellType = cellData['type']?.toString() ?? ''; + final connections = + cellData['connections'] as Map? ?? {}; + final portDirs = + cellData['port_directions'] as Map? ?? {}; + + if (cellType == r'$const') { + // Extract constant value from the port name (Verilog literal). + for (final portName in portDirs.keys) { + if (portDirs[portName] != 'output') { + continue; + } + final bits = connections[portName] as List? ?? []; + final outputSig = _resolveSignal(bits, bitToSignal); + if (outputSig == null) { + continue; + } + final width = bits.whereType().length; + final hexValue = _parseVerilogLiteralToHex(portName, width); + + result[outputSig] = { + 'value': hexValue, + 'width': width, + 'name': outputSig.split('/').last, + 'computed': true, + }; + } + } else if (modules.containsKey(cellType) && + !HierarchyOccurrence.isPrimitiveType(cellType)) { + // Recurse into sub-module instances. + walkModule( + '$path/$cellName', + modules[cellType] as Map, + ); + } + } + + // ── Compose parent signals from constant-driven sub-signals ── + // + // When a parent signal (e.g. `coefficients0`, 48-bit) is composed + // entirely of sub-signals that are all constants, compose the + // parent's value by concatenating the sub-signal constants in bit + // order. This allows the schematic hover to show the full value + // for array/structure parents. + for (final entry in sortedNetnames) { + final sigPath = '$path/${entry.key}'; + final sigBits = netnameBits[sigPath]; + if (sigBits == null || sigBits.isEmpty) { + continue; + } + // Skip if this signal already has a constant from a $const cell. + if (result.containsKey(sigPath)) { + continue; + } + final sigWidth = sigBits.length; + // Only consider signals wider than any sub-signal that covers + // some of the same bits — i.e. potential parent signals. + // Check if all bits are covered by sub-signals that have + // constant values. + var allBitsCovered = true; + var composedValue = BigInt.zero; + for (var bitIdx = 0; bitIdx < sigBits.length; bitIdx++) { + final bit = sigBits[bitIdx]; + final subSig = bitToSignal[bit]; + if (subSig == null || subSig == sigPath) { + allBitsCovered = false; + break; + } + final subConst = result[subSig]; + if (subConst == null) { + allBitsCovered = false; + break; + } + // Find the bit's position within the sub-signal. + final subBits = netnameBits[subSig]; + if (subBits == null) { + allBitsCovered = false; + break; + } + final posInSub = subBits.indexOf(bit); + if (posInSub < 0) { + allBitsCovered = false; + break; + } + // Extract the bit value from the sub-signal's hex constant. + final subHex = subConst['value'] as String? ?? "1'h0"; + BigInt subVal; + try { + subVal = LogicValue.ofRadixString(subHex).toBigInt(); + } on Object { + subVal = BigInt.zero; + } + final bitVal = (subVal >> posInSub) & BigInt.one; + composedValue |= bitVal << bitIdx; + } + if (allBitsCovered && sigWidth > 0) { + final lv = LogicValue.ofBigInt(composedValue, sigWidth); + result[sigPath] = { + 'value': lv.toString(), + 'width': sigWidth, + 'name': sigPath.split('/').last, + 'computed': true, + }; + } + } + } + + walkModule(rootName, modules[topName] as Map); + return result; + } + + /// Resolve a list of bit indices to a single signal path. + /// Returns null if bits span multiple signals or none. + static String? _resolveSignal( + List bits, + Map bitToSignal, + ) { + String? signal; + for (final bit in bits) { + if (bit is int) { + final sig = bitToSignal[bit]; + if (sig == null) { + return null; + } + signal ??= sig; + if (sig != signal) { + return null; + } + } + } + return signal; + } + + /// Parse a Verilog-style literal (e.g. `"16'hfffe"`) to radixString + /// format. The input is already in a format compatible with + /// [LogicValue.ofRadixString]; this method validates and normalises it. + /// Falls back to `"1'h0"` if unparseable. + static String _parseVerilogLiteralToHex(String literal, int fallbackWidth) { + try { + return LogicValue.ofRadixString(literal).toString(); + } on Object { + return LogicValue.ofBigInt( + BigInt.zero, + fallbackWidth < 1 ? 1 : fallbackWidth, + ).toString(); + } + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/netlist_evaluator.dart b/rohd_devtools_extension/lib/rohd_devtools/services/netlist_evaluator.dart new file mode 100644 index 0000000000..7c3ccfc202 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/netlist_evaluator.dart @@ -0,0 +1,1722 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// netlist_evaluator.dart +// Evaluates signal values from Yosys JSON netlist on a per-module basis. +// +// All evaluation operates within a single Yosys module definition at a time. +// Keys in internal maps are LOCAL signal/port names (not full hierarchy paths). +// Module index structures are cached per definition name so all instances of +// the same module type share one index. +// +// 2026 March +// Author: Desmond Kirkpatrick + +import 'package:flutter/foundation.dart' show debugPrint; +import 'package:rohd/rohd.dart' show LogicValue; +import 'package:rohd_devtools_extension/rohd_devtools/utils/regex_utils.dart'; + +/// Matches array element netnames of the form `parent_N_`. +/// +/// Group 1: parent signal name (e.g. `data_0__0_`) +/// Group 2: element index (e.g. `0`) +const _arrayElementPattern = r'^(.+)_(\d+)_$'; + +// Yosys cell type → evaluable op name +// --------------------------------------------------------------------------- +const _cellTypeToOp = { + r'$and': 'and', + r'$or': 'or', + r'$xor': 'xor', + r'$not': 'not', + r'$buf': 'buf', + r'$mux': 'mux', + r'$reduce_or': 'uor', + r'$reduce_and': 'uand', + r'$reduce_xor': 'uxor', + r'$reduce_bool': 'uor', // same as $reduce_or for evaluation + r'$eq': 'eq', + r'$ne': 'ne', + r'$shl': 'sll', + r'$shr': 'srl', + r'$sshl': 'sll', // signed same bit-ops for unsigned eval + r'$sshr': 'ssrl', + r'$ge': 'gte', + r'$gt': 'gt', + r'$le': 'le', + r'$lt': 'lt', + r'$add': 'add', + r'$sub': 'sub', + r'$mul': 'mul', + r'$neg': 'neg', + r'$pos': 'buf', // $pos is identity + r'$logic_not': 'lnot', + r'$logic_and': 'land', + r'$logic_or': 'lor', + // $concat, $slice, $struct_field, $struct_compose, $struct_unpack, + // $struct_pack, $const, $dff handled specially. +}; + +// --------------------------------------------------------------------------- +// Shared helpers — single source of truth for top-key lookup, index +// caching, stale-cache detection, and path resolution. +// --------------------------------------------------------------------------- + +/// Find the module definition marked `top`, or fall back to the first key. +String? _findTopKey(Map modules) { + for (final e in modules.entries) { + final attrs = (e.value as Map)['attributes'] + as Map?; + if (attrs?['top'] == 1) { + return e.key; + } + } + return modules.keys.isNotEmpty ? modules.keys.first : null; +} + +/// Retrieve or build the [_ModuleIndex] for [moduleKey], applying a +/// stale-cache guard so that a slim→full module upgrade is detected +/// automatically. +_ModuleIndex _getOrBuildIndex( + Map modData, + Map cells, + String moduleKey, + EvalOnDemandCache? cache, +) { + var idx = + cache?._moduleIndices[moduleKey] ?? _buildModuleIndex(modData, cells); + // Stale-cache guard: if the cached index has no drivers but cells now + // have port_directions (module was upgraded from slim → full since the + // index was built), rebuild the index. + if (idx.driverOf.isEmpty && cells.isNotEmpty) { + final firstCell = cells.values.first as Map; + if (firstCell.containsKey('port_directions')) { + idx = _buildModuleIndex(modData, cells); + cache?._moduleIndices[moduleKey] = idx; + } + } + cache?._moduleIndices[moduleKey] ??= idx; + return idx; +} + +/// Walk a split signal path through the module hierarchy, returning the +/// resolved module definition, instance path, and cached index. +/// +/// Returns `null` when the path cannot be resolved (missing module, missing +/// cell, cell type not in [modules], etc.). +/// +/// When a `$const` cell is encountered during the walk the parsed constant +/// value is returned via [constResult] (if non-null) so that callers can +/// short-circuit without a separate path walk. +_ResolvedModule? _resolveModulePath( + Map modules, + List parts, + EvalOnDemandCache? cache, { + _Box<({String value, int width})?>? constResult, +}) { + final topKey = _findTopKey(modules); + if (topKey == null) { + return null; + } + var moduleKey = topKey; + var instancePath = parts[0]; + for (var i = 1; i < parts.length - 1; i++) { + final cellName = parts[i]; + final modData = modules[moduleKey] as Map?; + if (modData == null) { + return null; + } + final cells = modData['cells'] as Map? ?? {}; + final cell = cells[cellName] as Map?; + if (cell == null) { + return null; + } + final nextType = cell['type'] as String?; + // $const cell: the output port name IS the Verilog constant literal. + if (nextType == r'$const' && constResult != null) { + try { + final lv = LogicValue.ofRadixString(parts.last); + constResult.value = (value: lv.toString(), width: lv.width); + } on Object { + constResult.value = null; + } + return null; + } + if (nextType == null || !modules.containsKey(nextType)) { + return null; + } + moduleKey = nextType; + // Repeated concatenation is clearer here because each segment is retained. + // ignore: use_string_buffers + instancePath = '$instancePath/$cellName'; + } + final modData = modules[moduleKey] as Map?; + if (modData == null) { + return null; + } + final cells = modData['cells'] as Map? ?? {}; + final idx = _getOrBuildIndex(modData, cells, moduleKey, cache); + return _ResolvedModule( + moduleKey: moduleKey, + instancePath: instancePath, + index: idx, + ); +} + +/// Tiny mutable box for returning a secondary result from [_resolveModulePath]. +class _Box { + T value; + _Box(this.value); +} + +// --------------------------------------------------------------------------- +// Per-module index +// --------------------------------------------------------------------------- + +/// Per-module index structures cached across evaluation calls. +class _ModuleIndex { + final Map bitToSig; + final Map> sigBits; + final Map> bitIndexInSig; + final Map> driverOf; + final Map ports; + final Map netnames; + final Map cells; + + _ModuleIndex({ + required this.bitToSig, + required this.sigBits, + required this.bitIndexInSig, + required this.driverOf, + required this.ports, + required this.netnames, + required this.cells, + }); +} + +// --------------------------------------------------------------------------- +// On-demand evaluation cache +// --------------------------------------------------------------------------- + +/// Cross-call cache for signal evaluation. +/// +/// Holds per-module index structures and resolved signal values so that +/// evaluating many signals in the same module doesn't rebuild index maps +/// or re-evaluate shared sub-expressions. +/// +/// Create a fresh instance for each snapshot time (or call [clear] when +/// the snapshot changes). +class EvalOnDemandCache { + final Map _moduleIndices; + final _resolvedValues = {}; + + /// Creates a new, empty cache. + EvalOnDemandCache() : _moduleIndices = {}; + + /// Internal: shares `_moduleIndices` reference from the parent cache. + EvalOnDemandCache._shared(this._moduleIndices); + + /// Create a lightweight cache that shares the structural (module index) + /// data with this instance but has its own resolved-value store. + /// + /// Use this for time-series evaluation (waveform synthesis) where + /// resolved values change at each timepoint and must not pollute + /// the point-in-time cache used by hover / details pane. + EvalOnDemandCache withSharedStructure() => + EvalOnDemandCache._shared(_moduleIndices); + + /// Clear resolved values (e.g. when snapshot time changes). + /// + /// Module indices are kept for performance. If a module is upgraded + /// from slim to full between calls, the stale-cache guard in + /// [_getOrBuildIndex] will detect the mismatch and rebuild. + void clear() { + _resolvedValues.clear(); + } + + /// Full reset — also discards module indices (e.g. after hierarchy reload). + void reset() { + _moduleIndices.clear(); + _resolvedValues.clear(); + } +} + +// --------------------------------------------------------------------------- +// NetlistEvaluator — thin wrapper around per-module evaluation +// --------------------------------------------------------------------------- + +/// Evaluates computed signal values from a Yosys JSON netlist. +/// +/// All evaluation operates per-module using [evaluateSignalOnDemand]. +/// Module index structures ([_ModuleIndex]) are built lazily and cached +/// per definition name, so all instances of the same module type share +/// one index — no O(total signals) path expansion. +class NetlistEvaluator { + /// Module definitions: `{ moduleName: moduleData }`. + final Map _modules; + + /// Shared cache for module index structures and resolved values. + final EvalOnDemandCache _cache; + + /// Creates an evaluator for the given Yosys module definitions. + /// + /// `modules` is the `modules` section of a Yosys JSON netlist. + /// `cache` is an optional shared cache; a new one is created if omitted. + NetlistEvaluator(this._modules, [EvalOnDemandCache? cache]) + : _cache = cache ?? EvalOnDemandCache(); + + /// The shared cache (exposed for callers that need + /// [EvalOnDemandCache.withSharedStructure]). + EvalOnDemandCache get cache => _cache; + + /// Evaluate a single signal and return its value as a formatted string. + ({String value, int width})? evaluate( + String rerootedPath, + String? Function(String fullPath) snapshotLookup, + ) => + evaluateSignalOnDemand( + modules: _modules, + rerootedPath: rerootedPath, + snapshotLookup: snapshotLookup, + evalCache: _cache, + ); + + /// Evaluate multiple signals, returning a map of signalPath -> LogicValue. + Map evaluateBatch( + Iterable signalPaths, + String? Function(String fullPath) snapshotLookup, + ) { + final results = {}; + for (final path in signalPaths) { + final r = evaluateSignalOnDemand( + modules: _modules, + rerootedPath: path, + snapshotLookup: snapshotLookup, + evalCache: _cache, + ); + if (r != null) { + results[path] = parseHexToLV(r.value, r.width); + } else if (path.contains('const_31')) { + debugPrint( + '[CONST-DBG] evaluateSignalOnDemand returned NULL ' + 'for: $path', + ); + } + } + return results; + } + + /// Collect tracked leaf signal IDs that [signalPath] depends on. + Set collectLeaves(String signalPath) { + final parts = signalPath.split('/'); + if (parts.length < 2) { + return {}; + } + final resolved = _resolveModulePath(_modules, parts, _cache); + if (resolved == null) { + return {}; + } + final idx = resolved.index; + final instancePath = resolved.instancePath; + final signalName = parts.last; + final leaves = {}; + final visited = {}; + + void walk(String name) { + if (visited.contains(name)) { + return; + } + visited.add(name); + final driver = idx.driverOf[name]; + if (driver == null) { + // No cell driver. Check if this is a connection net whose bits + // trace to another named signal (wire alias). If so, walk the + // source signal(s) instead of treating self as a leaf — otherwise + // we'd request waveform data for the alias itself, which the + // server doesn't track. + final bits = idx.sigBits[name]; + if (bits != null) { + var foundAlias = false; + for (final b in bits) { + final traceSig = idx.bitToSig[b]; + if (traceSig != null && traceSig != name) { + walk(traceSig); + foundAlias = true; + } + } + if (foundAlias) { + return; + } + } + // Array element: walk the parent signal's leaves. + final arrayMatch = regExpFirstMatch(_arrayElementPattern, name); + if (arrayMatch != null) { + final parentName = arrayMatch.group(1)!; + if (idx.sigBits.containsKey(parentName)) { + walk(parentName); + return; + } + } + leaves.add('$instancePath/$name'); + return; + } + final ct = driver['type']?.toString() ?? ''; + final conns = driver['connections'] as Map? ?? {}; + final pDirs = driver['port_directions'] as Map? ?? {}; + + if (ct == r'$dff') { + // The DFF output netname (e.g. `_q`) is a synthesizer-generated + // connection net — not directly tracked by the server. The + // tracked signal lives at the cell-level path: + // $instancePath/$cellName/$outputPort + // This mirrors the evaluate() $dff handler which looks up + // snapshotLookup('$instancePath/$cellName/$pn'). + String? cellName; + for (final ce in idx.cells.entries) { + if (identical(ce.value, driver)) { + cellName = ce.key; + break; + } + } + if (cellName != null) { + final targetBits = idx.sigBits[name] ?? []; + for (final pn in pDirs.keys) { + if (pDirs[pn] != 'output') { + continue; + } + final outBits = conns[pn] as List? ?? []; + final outBitSet = outBits.whereType().toSet(); + if (targetBits.isNotEmpty && targetBits.every(outBitSet.contains)) { + leaves.add('$instancePath/$cellName/$pn'); + return; + } + } + } + leaves.add('$instancePath/$name'); + return; + } + if (ct == r'$const') { + return; + } + if (!ct.startsWith(r'$') || !_cellTypeToOp.containsKey(ct)) { + if (ct != r'$concat' && + ct != r'$slice' && + ct != r'$struct_field' && + ct != r'$struct_compose' && + ct != r'$struct_unpack' && + ct != r'$struct_pack') { + // Sub-module cell: the leaf is the submodule's output port + // that drives this signal, not the parent-level connection net. + if (_modules.containsKey(ct)) { + String? cellName; + for (final ce in idx.cells.entries) { + if (identical(ce.value, driver)) { + cellName = ce.key; + break; + } + } + if (cellName != null) { + final targetBits = idx.sigBits[name] ?? []; + for (final pn in pDirs.keys) { + if (pDirs[pn] != 'output') { + continue; + } + final outBits = conns[pn] as List? ?? []; + final outBitSet = outBits.whereType().toSet(); + if (targetBits.every(outBitSet.contains)) { + leaves.add('$instancePath/$cellName/$pn'); + return; + } + } + } + } + leaves.add('$instancePath/$name'); + return; + } + } + for (final pName in pDirs.keys) { + if (pDirs[pName] == 'output') { + continue; + } + final bits = conns[pName] as List? ?? []; + for (final b in bits) { + if (b is int) { + final sig = idx.bitToSig[b]; + if (sig != null) { + walk(sig); + } + } + } + } + } + + walk(signalName); + return leaves; + } + + /// Whether the given signal can be evaluated locally. + /// + /// Returns true when: + /// - a cell drives it (`driverOf` has an entry), or + /// - it names a `$const` cell, or + /// - it is a netname/port whose bits trace to other signals in the + /// same module (connection net / wire alias). + bool isComputed(String signalPath) { + final parts = signalPath.split('/'); + if (parts.length < 2) { + return false; + } + final resolved = _resolveModulePath(_modules, parts, _cache); + if (resolved == null) { + return false; + } + final signalName = parts.last; + if (resolved.index.driverOf.containsKey(signalName)) { + return true; + } + final cell = resolved.index.cells[signalName] as Map?; + if (cell != null && cell['type'] == r'$const') { + return true; + } + // Connection net: a netname (or port) whose bits trace to other + // named signals via the bit-connectivity graph. These are wires + // the synthesizer created to connect parent ports to submodule ports. + final bits = resolved.index.sigBits[signalName]; + if (bits != null && bits.isNotEmpty) { + for (final b in bits) { + final traceSig = resolved.index.bitToSig[b]; + if (traceSig != null && traceSig != signalName) { + return true; + } + } + } + // Array element: name matches `parent_N_` and parent exists. + final arrayMatch = regExpFirstMatch(_arrayElementPattern, signalName); + if (arrayMatch != null) { + final parentName = arrayMatch.group(1)!; + if (resolved.index.sigBits.containsKey(parentName)) { + return true; + } + } + return false; + } + + /// Whether the signal's containing module can be resolved and has + /// full connectivity data (not slim, not a primitive cell path). + /// + /// Use this as a cheap pre-filter before batch evaluation to avoid + /// feeding signals that will always BAIL. + bool canEvaluate(String signalPath) { + final parts = signalPath.split('/'); + if (parts.length < 2) { + return false; + } + final resolved = _resolveModulePath(_modules, parts, _cache); + if (resolved == null) { + return false; + } + // Check for slim modules (cells exist but lack connections). + final cells = resolved.index.cells; + if (cells.isNotEmpty) { + final firstCell = cells.values.first as Map; + if (!firstCell.containsKey('connections')) { + // Even in slim modules, array sub-elements can be resolved + // from the parent port's snapshot value. + final signalName = parts.last; + final arrayMatch = regExpFirstMatch(_arrayElementPattern, signalName); + if (arrayMatch != null) { + final parentName = arrayMatch.group(1)!; + if (resolved.index.sigBits.containsKey(parentName)) { + return true; + } + } + return false; + } + } + return true; + } + + /// Get signal width from its containing module's metadata. + int signalWidth(String signalPath) { + final parts = signalPath.split('/'); + if (parts.length < 2) { + return 0; + } + final resolved = _resolveModulePath(_modules, parts, _cache); + if (resolved == null) { + return 0; + } + final signalName = parts.last; + final nnData = resolved.index.netnames[signalName] as Map?; + if (nnData != null) { + return (nnData['bits'] as List?)?.whereType().length ?? 1; + } + final pData = resolved.index.ports[signalName] as Map?; + if (pData != null) { + return (pData['bits'] as List?)?.whereType().length ?? 1; + } + return 0; + } + + /// Enumerate all evaluable signal paths under [rootInstance]. + /// + /// Walks the module hierarchy recursively, collecting netname signals + /// that have driver cells (computed signals not already tracked as ports). + /// Returns full paths like `rootInstance/signal` or + /// `rootInstance/subcell/signal`. + /// + /// This discovers signals that exist in the netlist but are absent from + /// the hierarchy tree (e.g. structure field extractions like `a_mantissa`). + Set allEvaluablePaths(String rootInstance) { + final result = {}; + final topKey = _findTopKey(_modules); + if (topKey == null) { + return result; + } + _collectEvaluablePaths(topKey, rootInstance, result); + return result; + } + + void _collectEvaluablePaths( + String moduleKey, + String instancePath, + Set result, + ) { + final modData = _modules[moduleKey] as Map?; + if (modData == null) { + return; + } + final cells = modData['cells'] as Map? ?? {}; + + // Skip slim modules (cells without connections). + if (cells.isNotEmpty) { + final firstCell = cells.values.first as Map; + if (!firstCell.containsKey('connections')) { + return; + } + } + + final idx = _getOrBuildIndex(modData, cells, moduleKey, _cache); + + // Add netnames that have driver cells (computed signals) + // and array sub-element netnames whose parent is resolvable. + for (final name in idx.netnames.keys) { + if (idx.driverOf.containsKey(name)) { + result.add('$instancePath/$name'); + continue; + } + // Array element: include if parent exists in this module. + final arrayMatch = regExpFirstMatch(_arrayElementPattern, name); + if (arrayMatch != null) { + final parentName = arrayMatch.group(1)!; + if (idx.sigBits.containsKey(parentName)) { + result.add('$instancePath/$name'); + } + } + } + + // Recurse into sub-module cells. + for (final cellEntry in cells.entries) { + final cellData = cellEntry.value as Map; + final cellType = cellData['type'] as String?; + if (cellType != null && _modules.containsKey(cellType)) { + _collectEvaluablePaths( + cellType, + '$instancePath/${cellEntry.key}', + result, + ); + } + } + } + + /// Clear all resolved values from the cache. + void clearValues() => _cache.clear(); + + /// Reset the cache (clears resolved values and module indices). + void reset() => _cache.reset(); +} + +class _ResolvedModule { + final String moduleKey; + final String instancePath; + final _ModuleIndex index; + _ResolvedModule({ + required this.moduleKey, + required this.instancePath, + required this.index, + }); +} + +// --------------------------------------------------------------------------- +// evaluateSignalOnDemand +// --------------------------------------------------------------------------- + +/// Evaluate a single signal on-demand within one Yosys module definition. +/// +/// Given the full `modules` map, a re-rooted signal path, and a function +/// that looks up snapshot values, traces backwards through cells in the +/// signal's immediate module definition until it hits tracked values (ports +/// or snapshot entries), then evaluates forward. +/// +/// Works within a **single level of hierarchy** — never expands into +/// sub-module definitions. Ports are assumed to have values in the snapshot. +/// +/// Returns `(value, width)` or `null` if the signal can't be evaluated. +({String value, int width})? evaluateSignalOnDemand({ + required Map modules, + required String rerootedPath, + required String? Function(String fullPath) snapshotLookup, + EvalOnDemandCache? evalCache, +}) { + final parts = rerootedPath.split('/'); + if (parts.length < 2) { + return null; + } + + // Resolve path through the hierarchy. The constResult box lets us + // short-circuit when a $const cell is encountered during the walk. + // ignore: no_leading_underscores_for_local_identifiers + final _isConstDbg = rerootedPath.contains('const_31'); + final constBox = _Box<({String value, int width})?>(null); + final resolved = _resolveModulePath( + modules, + parts, + evalCache, + constResult: constBox, + ); + if (constBox.value != null) { + if (_isConstDbg) { + debugPrint( + '[CONST-DBG] $rerootedPath: constBox shortcut => ' + '${constBox.value}', + ); + } + return constBox.value; + } + if (resolved == null) { + if (_isConstDbg) { + debugPrint( + '[CONST-DBG] $rerootedPath: _resolveModulePath returned NULL ' + '(parts=$parts)', + ); + } + return null; + } + + final signalName = parts.last; + final instancePath = resolved.instancePath; + final idx = resolved.index; + final cells = idx.cells; + + // ── Lightweight snapshot-only resolution ────────────────────────── + // For port-level signals (including array sub-elements), we can + // resolve values directly from the snapshot without needing full + // module connectivity. This avoids bailing on slim modules for + // signals that are purely port decompositions. + final sigBits = idx.sigBits; + + // Determine signal width from netnames/ports metadata. + int targetWidthOf(String name) { + final nnData = idx.netnames[name] as Map?; + if (nnData != null) { + return (nnData['bits'] as List?)?.whereType().length ?? 1; + } + final pData = idx.ports[name] as Map?; + if (pData != null) { + return (pData['bits'] as List?)?.whereType().length ?? 1; + } + return 0; + } + + // Try resolving from snapshot: direct lookup or array element slicing. + LogicValue? resolveFromSnapshot(String name, int fw) { + // Direct snapshot match. + final fullPath = '$instancePath/$name'; + final snapVal = snapshotLookup(fullPath); + if (snapVal != null) { + return parseHexToLV(snapVal, fw); + } + // Array element pattern: resolve parent from snapshot recursively. + final m = regExpFirstMatch(_arrayElementPattern, name); + if (m != null) { + final parentName = m.group(1)!; + final elementIndex = int.parse(m.group(2)!); + final parentBits = sigBits[parentName]; + if (parentBits != null && parentBits.isNotEmpty) { + final parentWidth = parentBits.length; + final offset = elementIndex * fw; + if (offset + fw <= parentWidth) { + final parentVal = resolveFromSnapshot(parentName, parentWidth); + if (parentVal != null) { + return parentVal.getRange(offset, offset + fw); + } + } + } + } + return null; + } + + final tw = targetWidthOf(signalName); + if (tw > 0) { + final snapshotResult = resolveFromSnapshot(signalName, tw); + if (snapshotResult != null) { + return (value: snapshotResult.toString(), width: tw); + } + } + + // Bail on empty or slim modules (cells exist but lack connections). + if (cells.isEmpty) { + if (_isConstDbg) { + debugPrint('[CONST-DBG] $rerootedPath: BAIL cells.isEmpty'); + } + return null; + } + if (cells.isNotEmpty) { + final firstCell = cells.values.first as Map; + if (!firstCell.containsKey('connections')) { + if (_isConstDbg) { + debugPrint( + '[CONST-DBG] $rerootedPath: BAIL slim module ' + '(no connections in first cell)', + ); + } + return null; + } + } + + final ports = idx.ports; + final netnames = idx.netnames; + final bitToSig = idx.bitToSig; + final bitIndexInSig = idx.bitIndexInSig; + final driverOf = idx.driverOf; + + // DFS evaluation with memoization (cross-call via evalCache). + // Key resolved values by "$instancePath/$signalName" so different + // instances of the same module definition don't collide. + final cache = {}; + // Seed from cross-call cache. + if (evalCache != null) { + final prefix = '$instancePath/'; + evalCache._resolvedValues.forEach((key, value) { + if (key.startsWith(prefix)) { + cache[key.substring(prefix.length)] = value; + } + }); + } + final resolving = {}; + + LogicValue resolve(String name, int fw) { + if (cache.containsKey(name)) { + return cache[name]!; + } + + // Check snapshot (full re-rooted path). + final fullPath = '$instancePath/$name'; + final snapVal = snapshotLookup(fullPath); + if (snapVal != null) { + final lv = parseHexToLV(snapVal, fw); + cache[name] = lv; + return lv; + } + + if (resolving.contains(name)) { + return LogicValue.filled(fw, LogicValue.x); + } + resolving.add(name); + + try { + final driver = driverOf[name]; + + if (_isConstDbg && name.contains('const_31')) { + debugPrint( + '[CONST-DBG] resolve("$name", $fw): ' + 'driver=${driver != null ? driver["type"] : "NULL"}, ' + 'cellExists=${cells.containsKey(name)}', + ); + } + + if (driver == null) { + // The signal name may be a $const cell exposed as a + // hierarchy signal. Look it up in cells and extract the + // value from the output port name (a Verilog literal). + final cell = cells[name] as Map?; + if (cell != null && cell['type'] == r'$const') { + final cpDirs = cell['port_directions'] as Map? ?? {}; + if (_isConstDbg && name.contains('const_31')) { + debugPrint( + '[CONST-DBG] resolve("$name"): \$const cell path, ' + 'cpDirs=$cpDirs', + ); + } + for (final p in cpDirs.keys) { + if (cpDirs[p] != 'output') { + continue; + } + try { + final lv = LogicValue.ofRadixString(p); + cache[name] = lv; + return lv; + } on Object { + if (_isConstDbg && name.contains('const_31')) { + debugPrint( + '[CONST-DBG] resolve("$name"): ' + 'ofRadixString("$p") FAILED', + ); + } + // not parseable — fall through + } + } + } + + // Transitive array-element resolution: if the signal name + // matches the pattern `parentName_N_` (LogicArray element + // naming), recursively resolve the parent and extract the + // sub-range. This handles arrays with depth > 2 where + // only the first $slice level has an explicit cell. + // This runs BEFORE wire-alias because registration order in + // bitToSig can cause a smaller child to be found as alias, + // producing 'x' for uncovered bits. + final arrayMatch = regExpFirstMatch(_arrayElementPattern, name); + if (arrayMatch != null) { + final parentName = arrayMatch.group(1)!; + final elementIndex = int.parse(arrayMatch.group(2)!); + final parentBits = sigBits[parentName]; + if (parentBits != null && parentBits.isNotEmpty) { + final parentWidth = parentBits.length; + final offset = elementIndex * fw; + if (offset + fw <= parentWidth) { + final parentVal = resolve(parentName, parentWidth); + final slice = parentVal.getRange(offset, offset + fw); + cache[name] = slice; + return slice; + } + } + } + + // Wire alias: bits trace to another named signal (e.g. + // sample0_data shares bits with sampleIn0). Resolve the + // canonical signal instead of returning 'x'. + final bits = sigBits[name]; + if (bits != null && bits.isNotEmpty) { + String? aliasName; + for (final b in bits) { + final traceSig = bitToSig[b]; + if (traceSig != null && traceSig != name) { + aliasName = traceSig; + break; + } + } + if (aliasName != null) { + final aliasBits = sigBits[aliasName]; + final aliasWidth = aliasBits?.length ?? fw; + final aliasLV = resolve(aliasName, aliasWidth); + // If the alias covers exactly the same bits, return as-is. + if (aliasWidth == fw) { + cache[name] = aliasLV; + return aliasLV; + } + // Extract the relevant bit positions from the alias. + final idxMap = bitIndexInSig[aliasName] ?? {}; + final bitVals = []; + for (final b in bits) { + final i = idxMap[b]; + if (i != null && i < aliasLV.width) { + bitVals.add(aliasLV.getRange(i, i + 1)); + } else { + bitVals.add(LogicValue.x); + } + } + final result = LogicValue.ofIterable(bitVals); + cache[name] = result; + return result; + } + } + + return LogicValue.filled(fw, LogicValue.x); + } + + final ct = driver['type']?.toString() ?? ''; + final conns = driver['connections'] as Map? ?? {}; + final pDirs = driver['port_directions'] as Map? ?? {}; + final params = driver['parameters'] as Map? ?? {}; + + LogicValue resolveConnectionBits(List bits) { + if (bits.isEmpty) { + return LogicValue.ofString('0'); + } + final bitVals = []; + for (final b in bits) { + if (b is String) { + final s = b.toLowerCase(); + if (s == '1') { + bitVals.add(LogicValue.one); + } else if (s == 'x' || s == 'z') { + bitVals.add(LogicValue.x); + } else { + bitVals.add(LogicValue.zero); + } + continue; + } + if (b is! int) { + return LogicValue.filled(bits.length, LogicValue.x); + } + final sig = bitToSig[b]; + if (sig == null) { + return LogicValue.filled(bits.length, LogicValue.x); + } + final sigWidth = sigBits[sig]?.length ?? 1; + final sigVal = resolve(sig, sigWidth); + final bitIndex = bitIndexInSig[sig]?[b]; + if (bitIndex == null || bitIndex >= sigVal.width) { + bitVals.add(LogicValue.x); + } else { + bitVals.add(sigVal.getRange(bitIndex, bitIndex + 1)); + } + } + return LogicValue.ofIterable(bitVals); + } + + // $dff: sequential — try to look up the output from the snapshot + // (the flip-flop's Q port is tracked by WaveformService). + if (ct == r'$dff') { + String? cellName; + for (final ce in cells.entries) { + if (identical(ce.value, driver)) { + cellName = ce.key; + break; + } + } + if (cellName != null) { + for (final pn in pDirs.keys) { + if (pDirs[pn] != 'output') { + continue; + } + final outBits = conns[pn] as List? ?? []; + final targetBits = sigBits[name] ?? []; + if (targetBits.isEmpty) { + continue; + } + final outBitSet = outBits.whereType().toSet(); + if (!targetBits.every(outBitSet.contains)) { + continue; + } + + final portPath = '$instancePath/$cellName/$pn'; + final portSnap = snapshotLookup(portPath); + if (portSnap != null) { + final portWidth = outBits.whereType().length; + final portLV = parseHexToLV(portSnap, portWidth); + if (portWidth == fw) { + cache[name] = portLV; + return portLV; + } + final outBitList = outBits.whereType().toList(); + final bitVals = []; + for (final tb in targetBits) { + final i = outBitList.indexOf(tb); + if (i >= 0 && i < portLV.width) { + bitVals.add(portLV.getRange(i, i + 1)); + } else { + bitVals.add(LogicValue.x); + } + } + final result = LogicValue.ofIterable(bitVals); + cache[name] = result; + return result; + } + } + } + return LogicValue.filled(fw, LogicValue.x); + } + + // $const: output port name is the constant literal. + if (ct == r'$const') { + if (_isConstDbg && name.contains('const_31')) { + debugPrint( + '[CONST-DBG] resolve("$name"): driver IS \$const, ' + 'pDirs=$pDirs', + ); + } + for (final p in pDirs.keys) { + if (pDirs[p] != 'output') { + continue; + } + try { + final lv = LogicValue.ofRadixString(p); + cache[name] = lv; + return lv; + } on Object { + if (_isConstDbg && name.contains('const_31')) { + debugPrint( + '[CONST-DBG] resolve("$name"): ' + 'ofRadixString("$p") as driver FAILED', + ); + } + /* ignore parse failure */ + } + } + return LogicValue.filled(fw, LogicValue.x); + } + + // $concat: Y = {B(MSB), A(LSB)} + if (ct == r'$concat') { + final inputPorts = pDirs.entries + .where((entry) => entry.value == 'input') + .map((entry) => entry.key) + .toList(); + if (inputPorts.contains('A') && inputPorts.contains('B')) { + inputPorts + ..remove('A') + ..remove('B') + ..insertAll(0, ['A', 'B']); + } else { + int rangeOffset(String port) { + final match = regExpFirstMatch(r'^\[(\d+):(\d+)\]$', port); + if (match == null) { + return inputPorts.indexOf(port); + } + return int.parse(match.group(2)!); + } + + inputPorts.sort( + (first, second) => + rangeOffset(first).compareTo(rangeOffset(second)), + ); + } + final inputValues = inputPorts.map((port) { + final bits = conns[port] as List? ?? []; + final value = resolveConnectionBits(bits.cast()); + return value.getRange(0, value.width); + }); + final result = LogicValue.ofIterable(inputValues); + cache[name] = result; + return result; + } + + // $slice / $struct_field: extract bits [offset..offset+width-1] from A. + // $struct_compose: A (field) → Y (port sub-range), same bit-copy logic. + // + // NOTE: ROHD's LeafCellMapper emits $slice with OFFSET set to the + // ROHD-level bit position, but the A *connection wires* already + // reference the sliced bits. When OFFSET is out of range for the + // resolved A value, the connection bits are the final answer. + if (ct == r'$slice' || + ct == r'$struct_field' || + ct == r'$struct_compose') { + final aB = conns['A'] as List? ?? []; + final aVal = resolveConnectionBits(aB.cast()); + final offset = params['OFFSET'] as int? ?? 0; + if (offset + fw <= aVal.width) { + final slice = aVal.getRange(offset, offset + fw); + cache[name] = slice; + return slice; + } + // OFFSET out of range — ROHD pre-sliced the connection wires. + if (aVal.width == fw) { + cache[name] = aVal; + return aVal; + } + if (aVal.width > fw) { + final slice = aVal.getRange(0, fw); + cache[name] = slice; + return slice; + } + return LogicValue.filled(fw, LogicValue.x); + } + + // $struct_unpack: A (packed) → multiple named field outputs. + if (ct == r'$struct_unpack') { + final aB = conns['A'] as List? ?? []; + final aVal = resolveConnectionBits(aB.cast()); + final targetBits = sigBits[name] ?? []; + final fieldCount = params['FIELD_COUNT'] as int? ?? 0; + var outPortIdx = 0; + for (final pn in pDirs.keys) { + if (pDirs[pn] != 'output') { + continue; + } + final outBits = (conns[pn] as List? ?? []).whereType().toSet(); + if (targetBits.isNotEmpty && targetBits.every(outBits.contains)) { + int? offset; + int? width; + for (var i = 0; i < fieldCount; i++) { + if (params['FIELD_${i}_NAME'] == pn) { + offset = params['FIELD_${i}_OFFSET'] as int?; + width = params['FIELD_${i}_WIDTH'] as int?; + break; + } + } + offset ??= outPortIdx < fieldCount + ? params['FIELD_${outPortIdx}_OFFSET'] as int? + : null; + width ??= outPortIdx < fieldCount + ? params['FIELD_${outPortIdx}_WIDTH'] as int? + : null; + offset ??= 0; + width ??= fw; + if (offset + width <= aVal.width) { + final slice = aVal.getRange(offset, offset + width); + cache[name] = slice; + return slice; + } + break; + } + outPortIdx++; + } + if (aVal.width == fw) { + cache[name] = aVal; + return aVal; + } + if (aVal.width > fw) { + final slice = aVal.getRange(0, fw); + cache[name] = slice; + return slice; + } + return LogicValue.filled(fw, LogicValue.x); + } + + // $struct_pack: multiple named field inputs → Y (packed output). + if (ct == r'$struct_pack') { + final fieldCount = params['FIELD_COUNT'] as int? ?? 0; + final bits = List.generate( + fw, + (_) => LogicValue.filled(1, LogicValue.x), + ); + for (var i = 0; i < fieldCount; i++) { + final fName = params['FIELD_${i}_NAME'] as String?; + final offset = params['FIELD_${i}_OFFSET'] as int? ?? 0; + final width = params['FIELD_${i}_WIDTH'] as int? ?? 0; + if (fName == null) { + continue; + } + for (final pn in pDirs.keys) { + if (pDirs[pn] != 'input') { + continue; + } + if (pn == fName || pn.startsWith('${fName}_')) { + final portBits = conns[pn] as List? ?? []; + final fVal = resolveConnectionBits(portBits.cast()); + for (var j = 0; + j < width && j < fVal.width && offset + j < fw; + j++) { + bits[offset + j] = fVal.getRange(j, j + 1); + } + break; + } + } + } + final result = LogicValue.ofIterable(bits); + cache[name] = result; + return result; + } + + // Standard gate ops. + final op = _cellTypeToOp[ct]; + if (op == null) { + // Sub-module cell: if the cell type is a module definition, + // look up the output port's value via the snapshot. + if (modules.containsKey(ct)) { + String? cellName; + for (final ce in cells.entries) { + if (identical(ce.value, driver)) { + cellName = ce.key; + break; + } + } + if (cellName != null) { + for (final pn in pDirs.keys) { + if (pDirs[pn] != 'output') { + continue; + } + final outBits = conns[pn] as List? ?? []; + final targetBits = sigBits[name] ?? []; + if (targetBits.isEmpty) { + continue; + } + final outBitSet = outBits.whereType().toSet(); + if (!targetBits.every(outBitSet.contains)) { + continue; + } + final portPath = '$instancePath/$cellName/$pn'; + final portSnap = snapshotLookup(portPath); + var portValue = portSnap; + + // If snapshot doesn't have the port value, recursively + // evaluate into the sub-module. + if (portValue == null) { + final sub = evaluateSignalOnDemand( + modules: modules, + rerootedPath: portPath, + snapshotLookup: snapshotLookup, + evalCache: evalCache, + ); + if (sub != null) { + portValue = sub.value; + } + } + + if (portValue != null) { + final portWidth = outBits.whereType().length; + final portLV = parseHexToLV(portValue, portWidth); + if (portWidth == fw) { + cache[name] = portLV; + return portLV; + } + final outBitList = outBits.whereType().toList(); + final bitVals = []; + for (final tb in targetBits) { + final i = outBitList.indexOf(tb); + if (i >= 0 && i < portLV.width) { + bitVals.add(portLV.getRange(i, i + 1)); + } else { + bitVals.add(LogicValue.x); + } + } + final result = LogicValue.ofIterable(bitVals); + cache[name] = result; + return result; + } + } + } + } + return LogicValue.filled(fw, LogicValue.x); + } + + // Gather inputs. For $mux: order S, A, B. + final orderedPorts = []; + if (ct == r'$mux') { + for (final n in ['S', 'A', 'B']) { + if (pDirs.containsKey(n)) { + orderedPorts.add(n); + } + } + } + for (final n in pDirs.keys) { + if (!orderedPorts.contains(n)) { + orderedPorts.add(n); + } + } + + final inVals = []; + for (final pName in orderedPorts) { + if (pDirs[pName] == 'output') { + continue; + } + final bits = conns[pName] as List? ?? []; + inVals.add(resolveConnectionBits(bits.cast())); + } + + if (inVals.isEmpty) { + return LogicValue.filled(fw, LogicValue.x); + } + + final gate = {'op': op, 'w': fw}; + final result = evalOp(op, inVals, fw, gate); + cache[name] = result; + return result; + } finally { + resolving.remove(name); + } + } + + // Get target signal width from the netlist bit-array length. + var targetWidth = 1; + final nnData = netnames[signalName] as Map?; + if (nnData != null) { + targetWidth = (nnData['bits'] as List?)?.whereType().length ?? 1; + } else { + final pData = ports[signalName] as Map?; + if (pData != null) { + targetWidth = (pData['bits'] as List?)?.whereType().length ?? 1; + } + } + + final result = resolve(signalName, targetWidth); + + // Store all newly resolved values back into the cross-call cache. + if (evalCache != null) { + for (final e in cache.entries) { + evalCache._resolvedValues['$instancePath/${e.key}'] = e.value; + } + } + + return (value: result.toString(), width: result.width); +} + +// --------------------------------------------------------------------------- +// Build module index from raw JSON +// --------------------------------------------------------------------------- + +/// Build [_ModuleIndex] from raw module JSON data. +_ModuleIndex _buildModuleIndex( + Map modData, + Map cells, +) { + final ports = modData['ports'] as Map? ?? {}; + final netnames = modData['netnames'] as Map? ?? {}; + final bitToSig = {}; + final sigBits = >{}; + final bitIndexInSig = >{}; + + void regBits(String name, List bits) { + final intBits = []; + for (final b in bits) { + if (b is int) { + bitToSig.putIfAbsent(b, () => name); + intBits.add(b); + } + } + if (intBits.isNotEmpty) { + sigBits[name] = intBits; + final indexMap = {}; + for (var i = 0; i < intBits.length; i++) { + indexMap[intBits[i]] = i; + } + bitIndexInSig[name] = indexMap; + } + } + + for (final e in ports.entries) { + regBits(e.key, (e.value as Map)['bits'] as List? ?? []); + } + for (final e in netnames.entries) { + regBits(e.key, (e.value as Map)['bits'] as List? ?? []); + } + + // Build driver map: localSignalName → cell data. + // Detect multi-driver conflicts (multiple cells driving the same signal). + final driverOf = >{}; + final driverCellNames = {}; // sig → first driver instance + final multiDriverWarnings = >{}; + bool hasSameBits(List signalBits, List outputBits) { + if (signalBits.length != outputBits.length) { + return false; + } + final sortedSignalBits = [...signalBits]..sort(); + final sortedOutputBits = [...outputBits]..sort(); + for (var i = 0; i < sortedSignalBits.length; i++) { + if (sortedSignalBits[i] != sortedOutputBits[i]) { + return false; + } + } + return true; + } + + for (final cellEntry in cells.entries) { + final cellName = cellEntry.key; + final cellData = cellEntry.value as Map; + final conns = cellData['connections'] as Map? ?? {}; + final pDirs = cellData['port_directions'] as Map? ?? {}; + for (final pName in pDirs.keys) { + if (pDirs[pName] != 'output') { + continue; + } + final bits = conns[pName] as List? ?? []; + final outputBits = bits.whereType().toList(); + final outSigs = sigBits.entries + .where((entry) => hasSameBits(entry.value, outputBits)) + .map((entry) => entry.key) + .toSet(); + if (outSigs.isEmpty) { + for (final bit in outputBits) { + final sig = bitToSig[bit]; + if (sig != null) { + outSigs.add(sig); + } + } + } + for (final sig in outSigs) { + if (driverOf.containsKey(sig)) { + // Multi-driver conflict detected. + final prevInstance = driverCellNames[sig] ?? '?'; + multiDriverWarnings + .putIfAbsent(sig, () => [prevInstance]) + .add(cellName); + } + driverOf[sig] = cellData; + driverCellNames.putIfAbsent(sig, () => cellName); + } + } + } + + if (multiDriverWarnings.isNotEmpty) { + debugPrint( + '[NetlistValidation] WARNING: ${multiDriverWarnings.length} signal(s) ' + 'have multiple drivers:', + ); + for (final entry in multiDriverWarnings.entries) { + debugPrint( + ' "${entry.key}" driven by ${entry.value.length} cells: ' + '${entry.value.join(", ")}', + ); + } + } + + return _ModuleIndex( + bitToSig: bitToSig, + sigBits: sigBits, + bitIndexInSig: bitIndexInSig, + driverOf: driverOf, + ports: ports, + netnames: netnames, + cells: cells, + ); +} + +/// Parse a hex value string to [LogicValue]. +LogicValue parseHexToLV(String value, int width) { + final w = width < 1 ? 1 : width; + try { + final lv = LogicValue.ofRadixString(value); + if (lv.width == w) { + return lv; + } + if (lv.width < w) { + return lv.zeroExtend(w); + } + return lv.getRange(0, w); + } on Object { + /* fall through to manual parse */ + } + final lower = value.toLowerCase(); + if (lower.replaceAll('z', '').replaceAll('x', '').isEmpty) { + return LogicValue.filled(w, LogicValue.x); + } + final hex = lower.startsWith('0x') ? value.substring(2) : value; + final bi = BigInt.tryParse(hex, radix: 16) ?? BigInt.zero; + return LogicValue.ofBigInt(bi, w); +} + +// --------------------------------------------------------------------------- +// Gate evaluation +// --------------------------------------------------------------------------- + +/// Match a LogicValue to target width. +LogicValue matchWidth(LogicValue lv, int w) { + if (lv.width == w) { + return lv; + } + if (lv.width < w) { + return lv.zeroExtend(w); + } + return lv.getRange(0, w); +} + +/// Evaluate a gate op (package-visible for on-demand eval). +LogicValue evalOp( + String op, + List inputs, + int width, + Map gate, +) { + final xOut = LogicValue.filled(width, LogicValue.x); + switch (op) { + case 'and': + if (inputs.length != 2) { + return xOut; + } + return matchWidth(inputs[0], width) & matchWidth(inputs[1], width); + case 'or': + if (inputs.length != 2) { + return xOut; + } + return matchWidth(inputs[0], width) | matchWidth(inputs[1], width); + case 'xor': + if (inputs.length != 2) { + return xOut; + } + return matchWidth(inputs[0], width) ^ matchWidth(inputs[1], width); + case 'not': + if (inputs.isEmpty) { + return xOut; + } + return ~matchWidth(inputs[0], width); + case 'buf': + if (inputs.isEmpty) { + return xOut; + } + return matchWidth(inputs[0], width); + case 'mux': + if (inputs.length != 3) { + return xOut; + } + final ctrl = inputs[0]; + final d0 = matchWidth(inputs[1], width); + final d1 = matchWidth(inputs[2], width); + if (!ctrl.isValid) { + return d0 == d1 ? d0 : xOut; + } + return ctrl[0] == LogicValue.zero ? d0 : d1; + case 'uor': + if (inputs.isEmpty) { + return xOut; + } + return inputs[0].or(); + case 'uand': + if (inputs.isEmpty) { + return xOut; + } + return inputs[0].and(); + case 'uxor': + if (inputs.isEmpty) { + return xOut; + } + return inputs[0].xor(); + case 'eq': + if (inputs.length != 2) { + return xOut; + } + final a = inputs[0]; + final b = matchWidth(inputs[1], a.width); + if (!a.isValid || !b.isValid) { + return xOut; + } + return a == b ? LogicValue.one : LogicValue.zero; + case 'ne': + if (inputs.length != 2) { + return xOut; + } + final a = inputs[0]; + final b = matchWidth(inputs[1], a.width); + if (!a.isValid || !b.isValid) { + return xOut; + } + return a != b ? LogicValue.one : LogicValue.zero; + case 'sll': + if (inputs.length != 2) { + return xOut; + } + if (!inputs[1].isValid) { + return xOut; + } + return matchWidth(inputs[0], width) << inputs[1]; + case 'srl': + if (inputs.length != 2) { + return xOut; + } + if (!inputs[1].isValid) { + return xOut; + } + return matchWidth(inputs[0], width) >>> inputs[1]; + case 'gte': + if (inputs.length != 2) { + return xOut; + } + final w2 = + inputs[0].width > inputs[1].width ? inputs[0].width : inputs[1].width; + return matchWidth(inputs[0], w2) >= matchWidth(inputs[1], w2); + case 'lt': + if (inputs.length != 2) { + return xOut; + } + final w2 = + inputs[0].width > inputs[1].width ? inputs[0].width : inputs[1].width; + return matchWidth(inputs[0], w2) < matchWidth(inputs[1], w2); + case 'add': + if (inputs.length != 2) { + return xOut; + } + return matchWidth(inputs[0], width) + matchWidth(inputs[1], width); + case 'sub': + if (inputs.length != 2) { + return xOut; + } + return matchWidth(inputs[0], width) - matchWidth(inputs[1], width); + case 'mul': + if (inputs.length != 2) { + return xOut; + } + return matchWidth(inputs[0], width) * matchWidth(inputs[1], width); + case 'neg': + if (inputs.isEmpty) { + return xOut; + } + return ~matchWidth(inputs[0], width) + LogicValue.ofInt(1, width); + case 'gt': + if (inputs.length != 2) { + return xOut; + } + final w2 = + inputs[0].width > inputs[1].width ? inputs[0].width : inputs[1].width; + return matchWidth(inputs[0], w2) > matchWidth(inputs[1], w2); + case 'le': + if (inputs.length != 2) { + return xOut; + } + final w2 = + inputs[0].width > inputs[1].width ? inputs[0].width : inputs[1].width; + return matchWidth(inputs[0], w2) <= matchWidth(inputs[1], w2); + case 'ssrl': + if (inputs.length != 2) { + return xOut; + } + if (!inputs[1].isValid) { + return xOut; + } + return matchWidth(inputs[0], width) >> inputs[1]; + case 'lnot': + if (inputs.isEmpty) { + return xOut; + } + final v = inputs[0]; + if (!v.isValid) { + return xOut; + } + return v == LogicValue.filled(v.width, LogicValue.zero) + ? LogicValue.one + : LogicValue.zero; + case 'land': + if (inputs.length != 2) { + return xOut; + } + if (!inputs[0].isValid || !inputs[1].isValid) { + return xOut; + } + final a0 = + inputs[0] != LogicValue.filled(inputs[0].width, LogicValue.zero); + final b0 = + inputs[1] != LogicValue.filled(inputs[1].width, LogicValue.zero); + return (a0 && b0) ? LogicValue.one : LogicValue.zero; + case 'lor': + if (inputs.length != 2) { + return xOut; + } + if (!inputs[0].isValid || !inputs[1].isValid) { + return xOut; + } + final a0 = + inputs[0] != LogicValue.filled(inputs[0].width, LogicValue.zero); + final b0 = + inputs[1] != LogicValue.filled(inputs[1].width, LogicValue.zero); + return (a0 || b0) ? LogicValue.one : LogicValue.zero; + case 'bus': + if (inputs.isEmpty) { + return xOut; + } + final lo = gate['lo'] as int; + final hi = gate['hi'] as int? ?? (lo + width - 1); + final rev = gate['rev'] as bool? ?? false; + final needed = hi + 1; + final src = + inputs[0].width >= needed ? inputs[0] : matchWidth(inputs[0], needed); + final slice = src.getRange(lo, hi + 1); + return rev ? slice.reversed : slice; + case 'swz': + final inputWidths = (gate['iw'] as List?)?.cast(); + if (inputWidths == null || inputWidths.length != inputs.length) { + return xOut; + } + final parts = []; + for (var i = inputs.length - 1; i >= 0; i--) { + final iw = inputWidths[i]; + final src = + inputs[i].width >= iw ? inputs[i] : matchWidth(inputs[i], iw); + parts.add(src.getRange(0, iw)); + } + return parts.length == 1 + ? parts.first + : LogicValue.ofIterable(parts.reversed); + default: + return xOut; + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/platform_vm_connection_strategy.dart b/rohd_devtools_extension/lib/rohd_devtools/services/platform_vm_connection_strategy.dart index 59b3ed4781..2961c36fe6 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/services/platform_vm_connection_strategy.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/services/platform_vm_connection_strategy.dart @@ -11,7 +11,7 @@ import 'package:rohd_devtools_extension/rohd_devtools/services/platform_vm_connection_strategy_stub.dart' if (dart.library.io) 'package:rohd_devtools_extension/rohd_devtools/services/io_vm_connection_strategy.dart' if (dart.library.js_interop) 'package:rohd_devtools_extension/rohd_devtools/services/web_vm_connection_strategy.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/ui/ui.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/vm_connection_strategy.dart'; /// Returns the platform-appropriate [VmConnectionStrategy]. /// diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/platform_vm_connection_strategy_stub.dart b/rohd_devtools_extension/lib/rohd_devtools/services/platform_vm_connection_strategy_stub.dart index 8e56964d06..197fe1d0fa 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/services/platform_vm_connection_strategy_stub.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/services/platform_vm_connection_strategy_stub.dart @@ -10,7 +10,7 @@ // 2026 June // Author: Desmond Kirkpatrick -import 'package:rohd_devtools_extension/rohd_devtools/ui/ui.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/vm_connection_strategy.dart'; /// Stub that throws when neither `dart:io` nor `dart:js_interop` is available. /// Returns the platform VM connection strategy, or throws on unsupported diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/rohd_service_transport.dart b/rohd_devtools_extension/lib/rohd_devtools/services/rohd_service_transport.dart new file mode 100755 index 0000000000..90e3ede388 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/rohd_service_transport.dart @@ -0,0 +1,121 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// rohd_service_transport.dart +// Abstract transport interface for ROHD service communication. +// +// Defines the 6 RPCs that form the boundary between client-side algorithm +// (snapshot expansion, evaluator, synthesis) and the transport mechanism +// (VM service WebSocket vs in-process direct calls). +// +// 2026 April +// Author: Desmond Kirkpatrick + +import 'package:rohd_waveform/rohd_waveform.dart'; + +/// Abstract transport interface for ROHD service communication. +/// +/// Implementations handle the mechanics of invoking server-side methods +/// and returning decoded Dart objects. The client-side algorithm +/// (`BaseSignalWaveformApi`) consumes this interface without knowing +/// whether the calls go over a WebSocket or happen in-process. +/// +/// **Waveform RPCs** (from `WaveformService`): +/// +/// | Method | Server-side | Returns | +/// |--------|------------|---------| +/// | [getCurrentTime] | `WaveformDataService.instance.currentTime` | `int?` | +/// | [getSnapshotCompact] | `getSnapshotCompactJSON(time)` | decoded `Map` | +// ignore: lines_longer_than_80_chars +/// | [getWaveformDataCompact] | `getWaveformsCompactJSON(...)` | `List` | +// ignore: lines_longer_than_80_chars +/// | [getWaveformDataWithTimepointsCompact] | `getDataWithTimepointsCompactJSON(...)` | `List` | +/// +/// **Hierarchy RPCs** (from `NetlistService`): +/// +/// | Method | Server-side | Returns | +/// |--------|------------|--------| +/// | [getModuleTree] | `NetlistService.current?.slimJson` | decoded `Map` | +// ignore: lines_longer_than_80_chars +/// | [getModuleNetlist] | `NetlistService.current?.moduleJson(name)` | decoded `Map?` | +abstract class RohdServiceTransport { + /// Whether the transport is currently connected and operational. + bool get isConnected; + + /// Human-readable description of the transport mode. + String get modeDescription; + + /// The last simulation time for which we have complete data. + int get lastFetchedTime; + + /// Stream of live waveform updates (breakpoint pauses, simulation + /// completion, etc.). Returns `null` if this transport doesn't + /// support live update events. + Stream? get liveUpdates; + + // ───────────────────────────────────────────────────────────────────────── + // Waveform RPCs + // ───────────────────────────────────────────────────────────────────────── + + /// Get the current simulation endpoint time. + /// + /// Returns `null` if the time cannot be determined. + Future getCurrentTime(); + + /// Get a compact (address-keyed) snapshot of all signal values at [time]. + /// + /// Returns a decoded map: + /// ```json + /// { "time": int, "v": { "0.2.4": "val", ... } } + /// ``` + /// or `null` if unavailable. + Future?> getSnapshotCompact(int time); + + /// Fetch waveform data for signals identified by compact addresses. + /// + /// [signalAddresses] — dot-separated `OccurrenceAddress` strings. + /// [addressToSignalId] — maps each address back to its full signal ID. + /// [startTime], [endTime] — optional time range. + /// + /// Returns decoded [WaveformData] objects with signal IDs restored. + Future> getWaveformDataCompact({ + required List signalAddresses, + required Map addressToSignalId, + int? startTime, + int? endTime, + }); + + /// Fetch incremental waveform data using per-signal timepoints. + /// + /// [signalTimepoints] — map of address → last-fetched timepoint. + /// [addressToSignalId] — maps each address back to its full signal ID. + /// + /// Returns only data points AFTER each signal's last timepoint. + Future> getWaveformDataWithTimepointsCompact({ + required Map signalTimepoints, + required Map addressToSignalId, + }); + + // ───────────────────────────────────────────────────────────────────────── + // Hierarchy RPCs + // ───────────────────────────────────────────────────────────────────────── + + /// Fetch the full module tree (hierarchy + slim schematic). + /// + /// Returns the decoded JSON from `NetlistService.current?.slimJson` + /// (falling back to `ModuleServices.instance.hierarchyJson`), + /// or `null` if unavailable. + Future?> getModuleTree(); + + /// Fetch the full schematic data for a single module definition. + /// + /// Returns `{"DefinitionName": { ports, cells, netnames }}` or `null`. + Future?> getModuleNetlist(String definitionName); + + // ───────────────────────────────────────────────────────────────────────── + // Lifecycle + // ───────────────────────────────────────────────────────────────────────── + + /// Release resources held by this transport. + Future dispose(); +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/services.dart b/rohd_devtools_extension/lib/rohd_devtools/services/services.dart index 1445ae9748..0cf07ebce8 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/services/services.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/services/services.dart @@ -4,13 +4,34 @@ // services.dart // Barrel file for rohd_devtools services. // +// 2026 August +// Author: Desmond Kirkpatrick +// // NOTE: io_vm_connection_strategy.dart and web_vm_connection_strategy.dart // are excluded because they have platform-specific dependencies. +export 'base_signal_waveform_api.dart'; export 'connection_state_machine.dart'; +export 'flc_extension_client.dart'; +export 'flc_service.dart'; +export 'in_process_transport.dart'; +export 'in_process_tree_data_source.dart'; +export 'in_process_waveform_data_source.dart'; +export 'loopback_signal_waveform_api.dart'; +export 'netlist_evaluator.dart'; export 'platform_vm_connection_strategy.dart'; export 'service_manager_bridge.dart'; export 'signal_service.dart'; export 'signal_value_source.dart'; +export 'signal_value_source_binding.dart'; +export 'source_navigation_service.dart'; +export 'static_json_tree_data_source.dart'; +export 'tree_data_source.dart'; export 'tree_service.dart'; +export 'vm_connection_strategy.dart'; export 'vm_service_signal_value_source.dart'; +export 'vm_service_signal_waveform_api.dart'; +export 'vm_service_transport.dart'; +export 'vm_service_tree_data_source.dart'; +export 'waveform_signal_value_source.dart'; +export 'wellen_backed_waveform_data_source.dart'; diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/signal_selection_bus.dart b/rohd_devtools_extension/lib/rohd_devtools/services/signal_selection_bus.dart new file mode 100644 index 0000000000..c2a750b92d --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/signal_selection_bus.dart @@ -0,0 +1,79 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// signal_selection_bus.dart +// Cross-widget signal selection bus for cross-probing between +// schematic viewer, waveform viewer, and other panels. + +import 'package:flutter/widgets.dart'; + +/// A signal sent on the [SignalSelectionBus]. +/// +/// Each signal path is a hierarchy path like `"module/sub/signal_name"`. +class SignalSelectionMessage { + /// The hierarchy paths of the selected signals. + final List signalPaths; + + /// Which widget originated this message (so receivers can ignore their own). + final String source; + + /// Creates a [SignalSelectionMessage]. + const SignalSelectionMessage({ + required this.signalPaths, + required this.source, + }); + + @override + String toString() => + 'SignalSelectionMessage(source: $source, paths: $signalPaths)'; +} + +/// A shared bus that widgets use to send and receive signal selections +/// for cross-probing. +/// +/// Usage: +/// - Call [send] to broadcast a set of signal paths. +/// - Listen via [addListener] (inherited from [ChangeNotifier]). +/// - Read [lastMessage] to get the most recent broadcast. +class SignalSelectionBus extends ChangeNotifier { + SignalSelectionMessage? _lastMessage; + + /// The most recently sent message, or `null` if nothing has been sent. + SignalSelectionMessage? get lastMessage => _lastMessage; + + /// Broadcast [signalPaths] from [source] to all listeners. + void send({required List signalPaths, required String source}) { + if (signalPaths.isEmpty) { + return; + } + _lastMessage = SignalSelectionMessage( + signalPaths: signalPaths, + source: source, + ); + notifyListeners(); + } +} + +/// Provides a [SignalSelectionBus] to the widget tree. +class SignalSelectionBusProvider extends InheritedWidget { + /// The shared bus instance. + final SignalSelectionBus _bus; + + /// Creates a [SignalSelectionBusProvider]. + const SignalSelectionBusProvider({ + required SignalSelectionBus bus, + required super.child, + super.key, + }) : _bus = bus; + + /// Retrieve the bus from the nearest ancestor, or `null` if none. + static SignalSelectionBus? of(BuildContext context) { + final provider = context + .dependOnInheritedWidgetOfExactType(); + return provider?._bus; + } + + @override + bool updateShouldNotify(SignalSelectionBusProvider oldWidget) => + _bus != oldWidget._bus; +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/signal_value_source_binding.dart b/rohd_devtools_extension/lib/rohd_devtools/services/signal_value_source_binding.dart index 79e883bfce..c5c7e362e9 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/services/signal_value_source_binding.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/services/signal_value_source_binding.dart @@ -6,25 +6,19 @@ import 'package:rohd_devtools_extension/rohd_devtools/services/signal_value_source.dart'; import 'package:rohd_devtools_extension/rohd_devtools/services/tree_service.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/services/vm_service_signal_value_source.dart'; import 'package:vm_service/vm_service.dart' as vm; /// Creates the repo-specific live signal value source for [treeService]. +/// +/// The local overlay keeps live-value production in the waveform stack, so the +/// cubit-level binding is currently absent. SignalValueSource? createSignalValueSourceBinding({ required TreeService treeService, required vm.VmService vmService, }) => - VmServiceSignalValueSource( - rohdControllerEval: treeService.rohdControllerEval, - evalDisposable: treeService.evalDisposable, - vmService: vmService, - ); + null; /// Dispose any repo-specific live signal value source instance. Future disposeSignalValueSourceBinding( SignalValueSource? signalValueSource, -) async { - if (signalValueSource is VmServiceSignalValueSource) { - await signalValueSource.dispose(); - } -} +) async {} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/source_navigation_service.dart b/rohd_devtools_extension/lib/rohd_devtools/services/source_navigation_service.dart new file mode 100755 index 0000000000..02e3edc2cf --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/source_navigation_service.dart @@ -0,0 +1,886 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// source_navigation_service.dart +// Service for sending cross-probe source navigation requests from the +// DevTools extension to the ROHD VS Code extension via DTD. +// +// Resolves signals to SourceFrames via the ROHD extension's DTD +// `rohd.lookupSignal` service, then sends frames to `rohd.goToSource`. +// +// 2026 April 27 +// Author: Desmond Kirkpatrick + +import 'package:dtd/dtd.dart'; +import 'package:flutter/foundation.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/flc_service.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/utils/regex_utils.dart'; +import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart' + show RohdSourceFormat; +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; + +/// Callback signature for fetching a source line from a file. +/// +/// [fileUri] is the package-relative path (e.g. `lib/src/counter.dart`). +/// [line] is the 1-based line number. +/// Returns the source line text, or `null` if unavailable. +typedef SourceLineFetcher = Future Function(String fileUri, int line); + +/// A [SourceFrame] enriched with enclosing method/class names resolved +/// by the ROHD VS Code extension via the Dart language server. +class EnrichedFrame { + /// The underlying source frame. + final SourceFrame frame; + + /// Enclosing method/function name (e.g. `"build"`). + final String? methodName; + + /// Enclosing class name (e.g. `"Serializer"`). + final String? className; + + /// Human-readable label for UI display. + final String label; + + /// Creates an [EnrichedFrame]. + const EnrichedFrame({ + required this.frame, + required this.label, + this.methodName, + this.className, + }); + + /// Decode an [EnrichedFrame] from a JSON map produced by the + /// ROHD VS Code extension or compatible tooling. + factory EnrichedFrame.fromJson(Map json) => EnrichedFrame( + frame: SourceFrame( + file: json['file'] as String? ?? '', + line: json['line'] as int? ?? 0, + col: json['col'] as int? ?? 0, + desc: json['desc'] as String?, + type: json['type'] as String? ?? 'rohd', + ), + methodName: json['methodName'] as String?, + className: json['className'] as String?, + label: json['label'] as String? ?? '${json['file']}:${json['line']}', + ); + + /// Text prefix to highlight on the target source line. + /// + /// Extraction priority: + /// 1. Method name (per-frame, most differentiating across the stack). + /// 2. Class name (if method is absent but class is available). + /// 3. SignalOccurrence name (`frame.desc`) — same for all frames in a trace, + /// so used only as a last resort. + /// 4. Label truncated at the first interesting separator (`.` or `(`). + String? get highlight { + // Method/class name from enrichment — unique per frame. + if (methodName != null && methodName!.isNotEmpty) { + return methodName; + } + if (className != null && className!.isNotEmpty) { + return className; + } + + // SignalOccurrence name from FLC (same for every frame in a stack trace). + final desc = frame.desc; + if (desc != null && desc.isNotEmpty) { + return desc; + } + + // Truncate label at first interesting separator. + for (final sep in ['.', '(']) { + final idx = label.indexOf(sep); + if (idx > 0) { + return label.substring(0, idx); + } + } + + return null; + } +} + +/// Service that orchestrates cross-probe source navigation: +/// +/// 1. Resolves signal paths → [SourceFrame] lists via DTD `rohd.lookupSignal` +/// or, when DTD is unavailable, via a local [FlcService] (loopback mode) +/// 2. Sends frames to `rohd.goToSource` DTD service (registered by +/// the ROHD VS Code extension) when DTD is available +/// +/// Handles DTD unavailability gracefully — lookup still works via +/// [FlcService] so the picker UI can display resolved frames even +/// when no VS Code editor is reachable. +class SourceNavigationService { + /// The DTD connection, supplied externally (shared with standalone shell + /// or obtained from dtdManager in extension mode). + DartToolingDaemon? _dtd; + + /// Local FLC service for in-process lookup (loopback mode). + /// Used as a fallback when DTD is unavailable. + FlcService? _flcService; + + /// Optional hierarchy for translating instance paths → definition paths. + HierarchyService? _hierarchy; + + /// Optional callback for fetching source lines from the running app. + /// When set, enriched frames include a source-line prefix for highlighting. + SourceLineFetcher? sourceLineFetcher; + + /// Creates a [SourceNavigationService] with no DTD or FLC bound. + SourceNavigationService(); + + /// Clear the source line fetcher. Call on VM disconnect. + void clearSourceLineFetcher() { + sourceLineFetcher = null; + } + + /// Set the DTD connection. Call when DTD becomes available. + void setDtd(DartToolingDaemon dtd) { + _dtd = dtd; + debugPrint('[SourceNav] DTD connection set'); + } + + /// Clear the DTD connection. Call on DTD disconnect. + void clearDtd() { + _dtd = null; + debugPrint('[SourceNav] DTD connection cleared'); + } + + /// Set the local FLC service (loopback / in-process fallback). + void setFlcService(FlcService flcService) { + _flcService = flcService; + debugPrint('[SourceNav] FlcService set (local fallback)'); + } + + /// Clear the local FLC service. + void clearFlcService() { + _flcService?.clearCache(); + _flcService = null; + debugPrint('[SourceNav] FlcService cleared'); + } + + /// Set the hierarchy service for instance→definition path translation. + void setHierarchy(HierarchyService hierarchy) { + _hierarchy = hierarchy; + debugPrint('[SourceNav] Hierarchy set'); + } + + /// Clear the hierarchy. Call on VM disconnect. + void clearHierarchy() { + _hierarchy = null; + } + + /// Whether DTD is connected. + bool get _hasDtd => _dtd != null && !_dtd!.isClosed; + + /// Whether signal lookup can be performed (DTD or local FlcService). + bool get isAvailable => _hasDtd || _flcService != null; + + /// Navigate to source for a list of signal paths. + /// + /// SignalOccurrence paths can be either instance paths (`serializer/equalsMax`) + /// or definition paths (`Serializer_W80_8/equalsMax`). When a + /// [HierarchyService] is set, instance paths are translated to + /// definition paths automatically using [HierarchyOccurrence.definition]. + /// + /// Returns `true` if navigation succeeded, `false` if DTD is + /// unavailable or no frames could be resolved. + Future goToSourceFromPaths(List signalPaths) async { + if (!isAvailable) { + debugPrint('[SourceNav] Neither DTD nor FlcService available'); + return false; + } + + // Translate instance paths → definition paths if hierarchy is available, + // but retain the original instance path as a fallback candidate. Some + // FLC payloads are keyed by generated instance/module names even when the + // hierarchy can report a richer definition name. + final pathCandidates = signalPaths.map(_candidateLookupPaths).toList(); + final paths = pathCandidates.map((candidates) => candidates.first).toList(); + debugPrint( + '[SourceNav] goToSourceFromPaths: ' + 'hierarchy=${_hierarchy != null}, ' + 'input=$signalPaths, translated=$paths, candidates=$pathCandidates', + ); + + // Resolve frames — DTD first, FlcService fallback. + final frames = await _lookupSignalsForPathCandidates(pathCandidates); + if (frames.isEmpty) { + debugPrint('[SourceNav] No frames resolved for: $paths'); + return false; + } + + final navigated = await _sendGoToSource(frames); + return navigated; + } + + /// Translate an instance-based path to a definition-based path. + /// + /// Given `serializer/equalsMax`, walks the hierarchy to find the + /// `serializer` node, reads its `.definition` (`Serializer_W80_8`), and + /// returns `Serializer_W80_8/equalsMax`. + /// + /// Returns the original path unchanged when: + /// - No hierarchy is set + /// - The path has fewer than 2 segments + /// - The parent node isn't found or has no `.definition` + String _instanceToDefPath(String path) { + if (_hierarchy == null) { + return path; + } + + final segments = path.split('/'); + if (segments.length < 2) { + return path; + } + + // The parent module is everything except the last segment (signal name). + final modulePath = segments.sublist(0, segments.length - 1).join('/'); + final signalName = segments.last; + + final node = _hierarchy!.occurrenceByPathname(modulePath); + final owner = _nearestLookupOwner(node, signalName); + debugPrint( + '[SourceNav] _instanceToDefPath: ' + 'modulePath=$modulePath, node=${node?.name}, ' + 'type=${node?.definition}, owner=${owner?.path()}, ' + 'ownerType=${owner?.definition}, signal=$signalName', + ); + if (owner == null || owner.definition == null) { + return path; + } + + final defPath = '${owner.definition}/$signalName'; + if (defPath != path) { + debugPrint('[SourceNav] Translated: $path → $defPath'); + } + return defPath; + } + + List _candidateLookupPaths(String path) { + final translated = _instanceToDefPath(path); + if (translated == path) { + return [path]; + } + return [translated, path]; + } + + HierarchyOccurrence? _nearestLookupOwner( + HierarchyOccurrence? node, + String name, + ) { + var current = node; + while (current != null) { + if (current.signalIndexByName(name) >= 0 || + current.childIndexByName(name) >= 0) { + return current; + } + current = current.parent; + } + return node; + } + + /// Navigate to source for a list of module+signal name pairs. + /// + /// Each entry should have `'module'` and `'name'` keys. + Future goToSourceFromSignals(List> signals) async { + if (!isAvailable) { + debugPrint('[SourceNav] Neither DTD nor FlcService available'); + return false; + } + + // Convert to paths for lookup. + final paths = signals + .map((s) => '${s['module'] ?? ''}/${s['name'] ?? ''}') + .where((p) => p.length > 1) + .toList(); + + final frames = await _lookupSignals(paths); + if (frames.isEmpty) { + debugPrint('[SourceNav] No frames resolved for: $signals'); + return false; + } + + final navigated = await _sendGoToSource(frames); + return navigated; + } + + // ------------------------------------------------------------------------- + // SignalOccurrence lookup: DTD → FlcService fallback + // ------------------------------------------------------------------------- + + /// Resolve signal paths to [SourceFrame]s. + /// + /// Prefers DTD `rohd.lookupSignal` when DTD is available, passing the FLC + /// file path obtained from the running ROHD app via [FlcService.getFlcPath]. + /// Falls back to the local [FlcService] (in-process lookup) when DTD is + /// unavailable. + Future> _lookupSignals( + List paths, { + RohdSourceFormat? format, + }) async { + if (_hasDtd) { + final frames = await _lookupSignalsViaDtd(paths, format: format); + if (frames.isNotEmpty) { + return frames; + } + if (_flcService != null) { + debugPrint( + '[SourceNav] DTD lookup returned no frames; ' + 'falling back to FlcService', + ); + final frames = await _lookupSignalsViaFlcService(paths, format: format); + return frames; + } + return const []; + } + if (_flcService != null) { + final frames = await _lookupSignalsViaFlcService(paths, format: format); + return frames; + } + return const []; + } + + Future> _lookupSignalsForPathCandidates( + List> pathCandidates, { + RohdSourceFormat? format, + }) async { + final allFrames = []; + for (final candidates in pathCandidates) { + for (final path in candidates) { + final frames = await _lookupSignals([path], format: format); + if (frames.isNotEmpty) { + allFrames.addAll(frames); + break; + } + } + } + return allFrames; + } + + /// Resolve via local [FlcService] (in-process / loopback fallback). + Future> _lookupSignalsViaFlcService( + List paths, { + RohdSourceFormat? format, + }) async { + final allFrames = []; + for (final path in paths) { + final lookup = _splitLookupPath(path); + if (lookup == null) { + continue; + } + final frames = await _flcService!.resolveSignal( + lookup.moduleName, + lookup.signalName, + ); + allFrames.addAll( + format == null + ? frames + : frames.where((frame) => frame.type == format.name), + ); + } + debugPrint( + '[SourceNav] FlcService lookup: ' + '${paths.length} path(s) → ${allFrames.length} frame(s)', + ); + return allFrames; + } + + /// Resolve via DTD `rohd.lookupSignal` (ROHD extension has the FLC). + /// + + ({String moduleName, String signalName})? _splitLookupPath(String path) { + final segments = path.split('/'); + if (segments.length < 2) { + return null; + } + return ( + moduleName: segments[segments.length - 2], + signalName: segments.last, + ); + } + + /// Each path is `"ModuleName/signalName"`. The `flcPath` (absolute path to + /// the `.flc.json` file on disk) is fetched once from the running ROHD app + /// via [FlcService.getFlcPath] and cached for the session. + Future> _lookupSignalsViaDtd( + List paths, { + RohdSourceFormat? format, + }) async { + // Obtain the FLC file path from the running app (tiny string, cached). + final flcPath = await _flcService?.getFlcPath(); + if (flcPath == null || flcPath.isEmpty) { + debugPrint('[SourceNav] DTD lookup skipped: flcPath unavailable'); + return const []; + } + final allFrames = []; + for (final path in paths) { + final lookup = _splitLookupPath(path); + if (lookup == null) { + continue; + } + final signalName = lookup.signalName; + final moduleName = lookup.moduleName; + + final frames = await _lookupSignalViaDtd( + flcPath: flcPath, + moduleName: moduleName, + signalName: signalName, + format: format, + ); + if (frames.isNotEmpty) { + allFrames.addAll(frames); + continue; + } + + // Per-definition FLC sidecars may be keyed by the generated master + // definition while schematic paths use instance names. If the exact + // module filter misses, search the current FLC file for the signal. + final unscopedFrames = await _lookupSignalViaDtd( + flcPath: flcPath, + moduleName: null, + signalName: signalName, + format: format, + ); + allFrames.addAll(unscopedFrames); + } + return allFrames; + } + + Future> _lookupSignalViaDtd({ + required String flcPath, + required String? moduleName, + required String signalName, + RohdSourceFormat? format, + }) async { + final frames = []; + + try { + final response = await _dtd!.call( + 'rohd', + 'lookupSignal', + params: { + 'signal': signalName, + if (moduleName != null) 'module': moduleName, + 'flcPath': flcPath, + if (format != null) 'format': format.name, + }, + ); + + final result = response.result; + final status = result['status'] as String?; + if (status == 'ok' || status == 'partial') { + final framesList = result['frames'] as List? ?? []; + // Reverse to outermost-first order (the ROHD extension returns + // innermost-first, matching raw stack-trace order). + for (final f in framesList.reversed) { + final map = f as Map; + frames.add( + SourceFrame( + file: map['file'] as String? ?? '', + line: map['line'] as int? ?? 0, + col: map['col'] as int? ?? 0, + desc: map['desc'] as String?, + type: map['type'] as String? ?? 'rohd', + ), + ); + } + debugPrint( + '[SourceNav] DTD lookupSignal(' + '${moduleName ?? ''}/$signalName): ' + '${framesList.length} frame(s)', + ); + } else { + debugPrint( + '[SourceNav] DTD lookupSignal(' + '${moduleName ?? ''}/$signalName): ' + '$status — ${result['message'] ?? ''}', + ); + } + } on DartToolingDaemonConnectionException catch (e) { + // The ROHD extension may omit the DTD 'type' field in its response. + // When the data is otherwise valid, parse frames from the error's + // embedded JSON rather than discarding a successful lookup. + if (e.errorCode == + DartToolingDaemonConnectionException.callParamsMissingTypeError) { + final parsed = _extractFramesFromMissingTypeError(e); + if (parsed.isNotEmpty) { + // Reverse to outermost-first (same as the normal path). + frames.addAll(parsed.reversed); + debugPrint( + '[SourceNav] DTD lookupSignal(' + '${moduleName ?? ''}/$signalName): ' + '${parsed.length} frame(s) (missing-type workaround)', + ); + return frames; + } + } + debugPrint( + '[SourceNav] DTD lookupSignal failed for ' + '${moduleName ?? ''}/$signalName: $e', + ); + } on Exception catch (e) { + debugPrint( + '[SourceNav] DTD lookupSignal error for ' + '${moduleName ?? ''}/$signalName: $e', + ); + } + return frames; + } + + /// Extract [SourceFrame]s from a [DartToolingDaemonConnectionException] + /// thrown because the response lacked a `type` field but otherwise + /// contained valid frame data. + /// + /// The error message embeds the raw JSON: + /// `"... Got: {status: ok, frames: [...]}"`. + /// We parse the `frames` list out of the response map when possible. + List _extractFramesFromMissingTypeError( + DartToolingDaemonConnectionException e, + ) { + try { + // The exception message format is: + // "call received an invalid response, it is missing the 'type' param. + // Got: {status: ok, frames: [...]}" + // The "Got:" payload is a Dart Map.toString() output, which is not valid + // JSON. Instead, we look for 'frames' in the message and try a + // RegExp-based extraction. + // + // However, the DTD client actually stores the raw parsed JSON map + // inside the error. We cannot access it directly from the exception + // message alone, so as a best-effort we extract frame maps using a + // simple pattern. + final msg = e.message; + final framesMatch = regExpFirstMatch( + r'frames:\s*\[(.+)\]', + msg, + dotAll: true, + ); + if (framesMatch == null) { + return []; + } + + // The innermost 'frames' list: find all {file: ..., line: ...} entries. + const framePattern = r'\{file:\s*([^,]+),\s*line:\s*(\d+),\s*col:\s*(\d+)' + r'(?:,\s*desc:\s*([^,\}]+))?' + r'(?:,\s*type:\s*([^,\}]+))?\}'; + final frames = []; + for (final m in regExpAllMatches(framePattern, framesMatch.group(1)!)) { + frames.add( + SourceFrame( + file: m.group(1)!.trim(), + line: int.tryParse(m.group(2)!) ?? 0, + col: int.tryParse(m.group(3)!) ?? 0, + desc: m.group(4)?.trim(), + type: m.group(5)?.trim() ?? 'rohd', + ), + ); + } + return frames; + } on Exception { + return []; + } + } + + /// Send resolved frames to the ROHD VS Code extension via DTD. + /// + /// [method] defaults to `'goToSource'`. + /// + /// The client performs type filtering before calling this method. + /// + /// Returns `false` (without error) when DTD is unavailable — the frames + /// are still resolved and can be used by the picker UI. + Future _sendGoToSource( + List frames, { + int index = 0, + String? highlight, + String method = 'goToSource', + }) async { + if (!_hasDtd) { + debugPrint( + '[SourceNav] No DTD — cannot send $method ' + '(${frames.length} frames resolved but no editor reachable)', + ); + return false; + } + try { + final response = await _dtd!.call( + 'rohd', + method, + params: { + 'frames': frames.map((f) => f.toJson()).toList(), + 'index': index, + if (highlight != null) 'highlight': highlight, + }, + ); + + final result = response.result; + final status = result['status']; + if (status == 'ok') { + debugPrint( + '[SourceNav] Navigation successful ' + '(${frames.length} frames, index=$index)', + ); + return true; + } else { + debugPrint('[SourceNav] Navigation response: $result'); + if (method != 'goToSource') { + debugPrint( + '[SourceNav] Falling back to goToSource ' + '(unsupported method: $method)', + ); + final navigated = await _sendGoToSource( + frames, + index: index, + highlight: highlight, + ); + return navigated; + } + return false; + } + } on DartToolingDaemonConnectionException catch (e) { + // The ROHD VS Code extension processes the request (editors open) + // but its response omits the DTD 'type' field, causing the DTD + // client to throw. Treat missing-type as success. + if (e.errorCode == + DartToolingDaemonConnectionException.callParamsMissingTypeError) { + debugPrint( + '[SourceNav] Navigation sent ' + '(${frames.length} frames, index=$index)', + ); + return true; + } + if (method != 'goToSource') { + debugPrint( + '[SourceNav] Falling back to goToSource after DTD error ' + 'for $method: $e', + ); + final navigated = await _sendGoToSource( + frames, + index: index, + highlight: highlight, + ); + return navigated; + } + debugPrint('[SourceNav] Failed to send goToSource: $e'); + return false; + } on Exception catch (e) { + if (method != 'goToSource') { + debugPrint( + '[SourceNav] Falling back to goToSource after error ' + 'for $method: $e', + ); + final navigated = await _sendGoToSource( + frames, + index: index, + highlight: highlight, + ); + return navigated; + } + debugPrint('[SourceNav] Failed to send goToSource: $e'); + return false; + } + } + + // ------------------------------------------------------------------------- + // Two-step resolve → pick → navigate API + // ------------------------------------------------------------------------- + + /// Resolve signal paths to enriched frames with method/class names. + /// + /// Step 1 of the two-step flow: + /// 1. Resolve frames via DTD or local FlcService + /// 2. Optionally filter to [format] + /// 3. Enrich with source line prefix for highlighting + /// 4. Return enriched frames for UI display in a picker + /// + /// Returns an empty list if neither DTD nor FlcService is available. + Future> resolveSourceFrames( + List signalPaths, { + RohdSourceFormat? format, + }) async { + if (!isAvailable) { + debugPrint('[SourceNav] Neither DTD nor FlcService available'); + return []; + } + + final pathCandidates = signalPaths.map(_candidateLookupPaths).toList(); + final paths = pathCandidates.map((candidates) => candidates.first).toList(); + debugPrint( + '[SourceNav] resolveSourceFrames: ' + 'input=$signalPaths, translated=$paths, candidates=$pathCandidates', + ); + + final frames = await _lookupSignalsForPathCandidates( + pathCandidates, + format: format, + ); + if (frames.isEmpty) { + debugPrint('[SourceNav] No FLC frames to resolve for: $paths'); + return []; + } + + final filteredFrames = format == null + ? frames + : frames.where((f) => f.type == format.name).toList(); + if (filteredFrames.isEmpty) { + final formatName = format?.name ?? 'any'; + debugPrint('[SourceNav] No $formatName frames resolved for: $paths'); + return []; + } + + final enriched = await _enrichFrames(filteredFrames); + return enriched; + } + + /// DTD service method name used to navigate to [format]. + /// + /// We filter frames by format on the client before sending, then always + /// call `goToSource`. This avoids silent no-op behavior in older or + /// inconsistent bridges where format-specific methods can return success + /// even when no navigation occurs. + static String _methodForFormat(RohdSourceFormat format) => 'goToSource'; + + /// Navigate to a specific enriched frame by index for an arbitrary source + /// [format] (e.g. ROHD, SV, SystemC). + /// + /// This is the generalized entry point used by every viewer's cross-probe + /// menu; `navigateToRohd`/`navigateToSv` are thin convenience wrappers. + Future navigateToFormat( + List enrichedFrames, + int index, + RohdSourceFormat format, + ) async { + if (!isAvailable) { + return false; + } + final frames = enrichedFrames.map((e) => e.frame).toList(); + final highlight = enrichedFrames[index].highlight; + final navigated = await _sendGoToSource( + frames, + index: index, + highlight: highlight, + method: _methodForFormat(format), + ); + return navigated; + } + + /// Navigate to a specific enriched frame by index (both ROHD + SV). + Future navigateToFrame( + List enrichedFrames, + int index, + ) async { + if (!isAvailable) { + return false; + } + final frames = enrichedFrames.map((e) => e.frame).toList(); + final highlight = enrichedFrames[index].highlight; + final navigated = await _sendGoToSource( + frames, + index: index, + highlight: highlight, + ); + return navigated; + } + + /// Send frames to `rohd.resolveFrames` and parse enriched results. + /// + /// Uses the VM service source line fetcher (when available) to extract + /// a source-line prefix for each frame. Falls back to file:line labels + /// when the fetcher is unavailable. + Future> _enrichFrames(List frames) async { + final enriched = []; + for (final f in frames) { + final shortFile = f.file.split('/').last; + String? prefix; + if (sourceLineFetcher != null) { + final line = await sourceLineFetcher!(f.file, f.line); + if (line != null) { + prefix = _extractPrefix(line, f.col); + debugPrint( + '[SourceNav] enrichFrame: ${f.file}:${f.line}:${f.col} ' + '→ prefix="$prefix" (line: "${line.trim()}")', + ); + } else { + debugPrint( + '[SourceNav] enrichFrame: ${f.file}:${f.line} ' + '→ source line not found', + ); + } + } else { + debugPrint('[SourceNav] enrichFrame: no source line fetcher'); + } + enriched.add( + EnrichedFrame( + frame: f, + label: '$shortFile:${f.line}', + methodName: prefix, + ), + ); + } + return enriched; + } + + /// Extract a meaningful prefix from a source line for highlighting. + /// + /// Strategy: + /// - If [col] > 1, use the column to find the symbol starting there and + /// include to the end of that identifier token. + /// - Otherwise, trim the line and take up to the first separator + /// (`.`, `(`, `{`, `;`), then trim trailing whitespace. + /// - Cap at 60 characters to keep the UI compact. + String? _extractPrefix(String line, int col) { + final trimmed = line.trimLeft(); + if (trimmed.isEmpty) { + return null; + } + + // If column info is valid, start from that position. + if (col > 1 && col <= line.length) { + // col is 1-based; convert to 0-based. + var start = col - 1; + // Walk BACKWARD to find the true start of the identifier so that a + // column pointing mid-word (e.g. col=4 in "assign") returns the full + // word rather than a suffix like "ign". + while (start > 0 && + (_isIdentChar(line.codeUnitAt(start - 1)) || + line.codeUnitAt(start - 1) == 0x2E /* . */)) { + start--; + } + // Walk forward to the end of the identifier. + var end = start; + while (end < line.length) { + final ch = line.codeUnitAt(end); + if (_isIdentChar(ch) || ch == 0x2E /* . */) { + end++; + } else { + break; + } + } + if (end > start) { + final symbol = line.substring(start, end).trim(); + if (symbol.isNotEmpty) { + return _cap(symbol); + } + } + } + + // Fallback: take up to the first interesting separator. + for (final sep in ['.', '(', '{', ';']) { + final idx = trimmed.indexOf(sep); + if (idx > 0) { + return _cap(trimmed.substring(0, idx).trimRight()); + } + } + + // Last resort: take the whole trimmed line, capped. + return _cap(trimmed); + } + + static bool _isIdentChar(int ch) => + (ch >= 0x41 && ch <= 0x5A) || // A-Z + (ch >= 0x61 && ch <= 0x7A) || // a-z + (ch >= 0x30 && ch <= 0x39) || // 0-9 + ch == 0x5F; // _ + + static String _cap(String s) => s.length <= 60 ? s : s.substring(0, 60); +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/standalone_tree_service.dart b/rohd_devtools_extension/lib/rohd_devtools/services/standalone_tree_service.dart new file mode 100644 index 0000000000..f3fa7c5dd4 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/standalone_tree_service.dart @@ -0,0 +1,135 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// standalone_tree_service.dart +// Tree service for standalone (non-web) builds using vm_service directly. +// +// 2026 January +// Author: Desmond Kirkpatrick + +import 'dart:convert'; + +import 'package:rohd_devtools_extension/rohd_devtools/models/tree_model.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/design_data_adapter.dart'; +import 'package:vm_service/vm_service.dart'; + +/// Tree service that uses VmService directly without devtools_app_shared. +class StandaloneTreeService { + /// The connected VM service. + final VmService vmService; + + /// The isolate ID of the ROHD application. + final String isolateId; + + static const _unifiedFunc = 'NetlistService.current?.slimJson ?? ' + 'ModuleServices.instance.hierarchyJson'; + + /// Cached schematic JSON from the last eval/refresh. + Map? _cachedSchematicJson; + + /// Get the cached schematic JSON from the last eval/refresh. + Map? getSchematicJson() => _cachedSchematicJson; + + /// Creates a [StandaloneTreeService] with the given VM service and isolate + /// ID. + StandaloneTreeService({required this.vmService, required this.isolateId}); + + /// Evaluate the module tree from the connected ROHD application. + Future evalModuleTree() async { + try { + // Find the ROHD library in the isolate + final isolate = await vmService.getIsolate(isolateId); + final libraries = isolate.libraries ?? []; + + Library? rohdLibrary; + for (final libRef in libraries) { + final uri = libRef.uri; + if (uri != null && + uri.contains('rohd') && + uri.contains('inspector_service')) { + rohdLibrary = + await vmService.getObject(isolateId, libRef.id!) as Library; + break; + } + } + + if (rohdLibrary == null) { + // Try to find it by evaluating on the isolate + return await _evalOnIsolate(); + } + + // Evaluate unified format (contains both hierarchy and schematic) + final result = await vmService.evaluate( + isolateId, + rohdLibrary.id!, + _unifiedFunc, + ); + return _parseResult(result); + } on Exception { + final tree = await _evalOnIsolate(); + return tree; + } + } + + /// Fallback: try to evaluate on the isolate directly + Future _evalOnIsolate() async { + try { + // Get the root library and evaluate + final isolate = await vmService.getIsolate(isolateId); + final rootLibRef = isolate.rootLib; + + if (rootLibRef == null) { + return null; + } + + // Evaluate unified format + final result = await vmService.evaluate( + isolateId, + rootLibRef.id!, + '(() { ' + 'try { ' + 'return NetlistService.current?.slimJson ?? ' + 'ModuleServices.instance.hierarchyJson; ' + '} catch (e) { ' + 'return \'{"status": "fail", "error": "\$e"}\'; ' + '} ' + '})()', + ); + + return _parseResult(result); + } on Exception { + return null; + } + } + + TreeModel? _parseResult(Response result) { + if (result is InstanceRef) { + final valueStr = result.valueAsString; + if (valueStr == null) { + return null; + } + + try { + final treeObj = jsonDecode(valueStr) as Map; + + if (treeObj['status'] == 'fail') { + return null; + } + + // Use DesignDataAdapter for consistent parsing across all services + final designData = DesignDataAdapter.parseJson(treeObj); + _cachedSchematicJson = designData.schematicJson; + return designData.hierarchy.root; + } on Exception { + return null; + } + } else if (result is ErrorRef) { + return null; + } else { + return null; + } + } + + /// Refresh the module tree + Future refreshModuleTree() => evalModuleTree(); +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/static_json_tree_data_source.dart b/rohd_devtools_extension/lib/rohd_devtools/services/static_json_tree_data_source.dart new file mode 100644 index 0000000000..a1d2e35999 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/static_json_tree_data_source.dart @@ -0,0 +1,102 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// static_json_tree_data_source.dart +// Tree data source backed by a pre-loaded JSON map (for file loading). +// +// 2026 April +// Author: Desmond Kirkpatrick + +import 'package:flutter/foundation.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/models/tree_model.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/design_data_adapter.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/tree_data_source.dart'; + +/// [TreeDataSource] backed by a static JSON map. +/// +/// Used when loading a design JSON file from disk. The JSON is parsed +/// once via [DesignDataAdapter] and the resulting hierarchy + schematic +/// are cached for the lifetime of this data source. +class StaticJsonTreeDataSource implements TreeDataSource { + final Map _json; + + /// Human-readable name for this data source. + final String name; + + TreeModel? _cachedTree; + Map? _cachedSchematicJson; + bool _isRunning = true; + + /// Creates a tree data source backed by static JSON. + StaticJsonTreeDataSource(this._json, {this.name = 'Static JSON'}); + + @override + bool get isConnected => _isRunning; + + @override + String get modeDescription => 'Static JSON ($name)'; + + @override + Map? getSchematicJson() => _cachedSchematicJson; + + @override + Future evalModuleTree() async { + if (!_isRunning) { + return null; + } + if (_cachedTree != null) { + return _cachedTree; + } + + try { + if (_json['status'] == 'fail') { + return null; + } + + final designData = DesignDataAdapter.parseJson(_json); + _cachedSchematicJson = designData.schematicJson; + _cachedTree = designData.hierarchy.root; + + debugPrint( + '[StaticJsonTree] Loaded: ${_cachedTree?.name} ' + '(schematic: ${_cachedSchematicJson != null})', + ); + return _cachedTree; + } on Exception catch (e) { + debugPrint('[StaticJsonTree] Parse error: $e'); + return null; + } + } + + @override + Future refreshModuleTree() { + _cachedTree = null; + return evalModuleTree(); + } + + @override + Future?> fetchModuleSchematic( + String definitionName, + ) async { + final modules = _cachedSchematicJson?['modules'] as Map?; + if (modules == null) { + return null; + } + + final moduleData = modules[definitionName]; + if (moduleData == null) { + return null; + } + + return { + 'modules': {definitionName: moduleData}, + }; + } + + @override + Future dispose() async { + _isRunning = false; + _cachedTree = null; + _cachedSchematicJson = null; + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/third_party_license_registry.dart b/rohd_devtools_extension/lib/rohd_devtools/services/third_party_license_registry.dart new file mode 100644 index 0000000000..111e661d3b --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/third_party_license_registry.dart @@ -0,0 +1,52 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +bool _registeredBundledThirdPartyLicenses = false; + +/// Registers license text for non-pub assets bundled by the viewer packages. +void registerBundledThirdPartyLicenses() { + if (_registeredBundledThirdPartyLicenses) { + return; + } + _registeredBundledThirdPartyLicenses = true; + + LicenseRegistry.addLicense(() async* { + for (final bundledLicense in _bundledLicenses) { + yield LicenseEntryWithLineBreaks([ + bundledLicense.packageName, + ], await _loadLicenseText(bundledLicense)); + } + }); +} + +Future _loadLicenseText(_BundledLicense bundledLicense) async { + try { + return await rootBundle.loadString(bundledLicense.assetPath); + } on Object catch (error) { + return 'Unable to load bundled license text from ' + '${bundledLicense.assetPath}: $error'; + } +} + +const _bundledLicenses = <_BundledLicense>[ + _BundledLicense( + packageName: 'ELK JavaScript layout engine', + assetPath: + 'packages/rohd_schematic_viewer/assets/licenses/elkjs_LICENSES.txt', + ), + _BundledLicense( + packageName: 'Wellen waveform bridge', + assetPath: + 'packages/rohd_wave_viewer/assets/licenses/wellen_bridge_LICENSES.txt', + ), +]; + +class _BundledLicense { + final String packageName; + final String assetPath; + + const _BundledLicense({required this.packageName, required this.assetPath}); +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/tree_data_source.dart b/rohd_devtools_extension/lib/rohd_devtools/services/tree_data_source.dart new file mode 100644 index 0000000000..1014376d92 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/tree_data_source.dart @@ -0,0 +1,46 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// tree_data_source.dart +// Abstract interface for tree hierarchy data sources. +// Enables switching between DTD/VM connection and loopback modes. +// +// 2026 January +// Author: Desmond Kirkpatrick + +import 'package:rohd_devtools_extension/rohd_devtools/models/tree_model.dart'; + +/// Abstract interface for obtaining module tree hierarchy data. +/// +/// This enables rapid development without needing a separate debugging session. +abstract class TreeDataSource { + /// Whether this data source is currently connected/ready. + bool get isConnected; + + /// Human-readable description of the data source mode. + String get modeDescription; + + /// Get the cached schematic JSON from the last eval/refresh. + /// Returns null if no schematic data is available or hasn't been loaded yet. + Map? getSchematicJson(); + + /// Evaluate and return the module tree hierarchy. + /// Returns null if no tree is available. + Future evalModuleTree(); + + /// Refresh and return the updated module tree. + Future refreshModuleTree(); + + /// Fetch the full schematic JSON for a single module definition. + /// + /// Used for incremental loading: after the initial hierarchy-slim load, + /// callers request full connectivity for individual modules as the user + /// expands them in the schematic viewer. + /// + /// Returns a JSON map `{"DefinitionName": { ports, cells, netnames }}` + /// or `null` if the module is not found or incremental data is unavailable. + Future?> fetchModuleSchematic(String definitionName); + + /// Dispose any resources held by this data source. + Future dispose(); +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/tree_service.dart b/rohd_devtools_extension/lib/rohd_devtools/services/tree_service.dart index 0165d152c1..119654d0a0 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/services/tree_service.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/services/tree_service.dart @@ -1,4 +1,4 @@ -// Copyright (C) 2024-2026 Intel Corporation +// Copyright (C) 2024-2025 Intel Corporation // SPDX-License-Identifier: BSD-3-Clause // // tree_service.dart @@ -13,88 +13,373 @@ import 'package:devtools_app_shared/service.dart'; import 'package:devtools_app_shared/utils.dart'; import 'package:flutter/foundation.dart'; import 'package:rohd_devtools_extension/rohd_devtools/models/tree_model.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/design_data_adapter.dart'; import 'package:vm_service/vm_service.dart'; -/// Service helpers for evaluating and filtering the ROHD module tree. +/// Service for managing the module tree. class TreeService { - /// Expression for retrieving the module hierarchy JSON. - static const _hierarchyExpression = 'ModuleTree.instance.hierarchyJson'; + /// Unified format containing hierarchy + optional schematic. + static const _unifiedFunc = 'NetlistService.current?.slimJson ?? ' + 'ModuleServices.instance.hierarchyJson'; - /// Eval wrapper for accessing ROHD code in the target isolate. + /// The ROHD controller eval instance. final EvalOnDartLibrary rohdControllerEval; - /// Disposable token used to keep the eval alive. + /// The disposable to check if the eval is still alive. final Disposable evalDisposable; + final Future Function(String, {required Disposable? isAlive}) + _evalInstance; + + /// Cached schematic JSON from the last eval/refresh. + Map? _cachedSchematicJson; + + /// Cached FLC hierarchy JSON, keyed by module definition name. + final Map> _cachedFlcJson = {}; + /// Optional VM service for source-line lookups (cross-probe). final VmService? vmService; - /// Optional isolate ID used with [vmService]. + /// Optional isolate ID used with [vmService] for source-line lookups. final String? isolateId; - /// Creates a tree service around the given eval wrapper. - TreeService(this.rohdControllerEval, this.evalDisposable, - {this.vmService, this.isolateId}); + /// Cached script source text, keyed by the file URI used to look it up. + final _scriptSourceCache = {}; + + /// Cached list of [ScriptRef]s for the [isolateId]. + List? _scriptRefs; + + /// Creates a [TreeService] with the given ROHD controller eval and + /// disposable. + /// + /// Optionally accepts a [vmService] + [isolateId] pair, which enables + /// [fetchSourceLine] for cross-probe source-line enrichment. + TreeService( + this.rohdControllerEval, + this.evalDisposable, { + this.vmService, + this.isolateId, + Future Function( + String expression, { + required Disposable? isAlive, + })? evalInstance, + }) : _evalInstance = evalInstance ?? rohdControllerEval.evalInstance; - /// Evaluates the module tree from the ROHD service. + /// Get the cached schematic JSON from the last eval/refresh. + /// Returns null if no schematic data is available or hasn't been loaded yet. + Map? getSchematicJson() => _cachedSchematicJson; + + /// Evaluate the module tree from the connected ROHD application. + /// + /// Evaluates `NetlistService.current?.slimJson` (falling back to + /// `ModuleServices.instance.hierarchyJson`) which returns a unified + /// netlist format containing hierarchy and schematic data. Future evalModuleTree() async { - final payload = await _evalTreePayload(); - if (payload == null || payload.isEmpty) { - debugPrint('[TreeService] evalModuleTree failed: empty payload'); + try { + final instance = await _evalInstance( + _unifiedFunc, + isAlive: evalDisposable, + ); + final payload = instance.valueAsString; + if (payload == null || payload.isEmpty) { + debugPrint('[TreeService] evalModuleTree failed: empty payload'); + return null; + } + + final decoded = jsonDecode(payload); + if (decoded is! Map) { + debugPrint( + '[TreeService] evalModuleTree failed: unexpected payload type ' + '${decoded.runtimeType}', + ); + return null; + } + if (decoded['status'] == 'fail' || decoded['status'] == 'unavailable') { + final message = + decoded['message'] ?? decoded['reason'] ?? decoded['error']; + debugPrint('[TreeService] evalModuleTree failed: $message'); + return null; + } + + final designData = DesignDataAdapter.parseJson(decoded); + _cachedSchematicJson = designData.schematicJson; + return designData.hierarchy.root; + } on Exception catch (error) { + debugPrint('[TreeService] Eval failed for "$_unifiedFunc": $error'); return null; } + } + + /// Refresh the module tree from the connected ROHD application. + /// + /// Uses the same unified → fallback strategy as [evalModuleTree]. + Future refreshModuleTree() async { + final treeModel = await evalModuleTree(); + if (treeModel == null) { + throw StateError('Failed to refresh module tree.'); + } + return treeModel; + } - final decoded = jsonDecode(payload); - if (decoded is! Map) { - debugPrint('[TreeService] evalModuleTree failed: unexpected payload type ' - '${decoded.runtimeType}'); + /// Fetch the full schematic JSON for a single module definition. + /// + /// Evaluates `NetlistService.current?.moduleJson('name')` in the + /// connected ROHD application. Returns `null` when the module is not + /// found or incremental data is unavailable. + Future?> fetchModuleSchematic( + String definitionName, + ) async { + try { + // Sanitize to prevent injection in the eval expression. + final safeName = definitionName.replaceAll("'", r"\'"); + final expr = "NetlistService.current?.moduleJson('$safeName')"; + final instance = await rohdControllerEval.evalInstance( + expr, + isAlive: evalDisposable, + ); + final raw = instance.valueAsString; + if (raw == null || raw == 'null') { + debugPrint( + '[INCREMENTAL][TreeService] fetchModuleSchematic: ' + '"$definitionName" — returned null', + ); + return null; + } + debugPrint( + '[INCREMENTAL][TreeService] fetchModuleSchematic: ' + '"$definitionName" → ' + '${(raw.length / 1024).toStringAsFixed(1)} KB', + ); + final decoded = jsonDecode(raw) as Map; + // New format wraps module data under a 'modules' key. + if (decoded.containsKey('modules') && + !decoded.containsKey(definitionName)) { + return decoded['modules'] as Map; + } + return decoded; + } on Exception catch (e) { + debugPrint( + '[INCREMENTAL][TreeService] fetchModuleSchematic ' + 'error: $e', + ); return null; } + } - final treeObj = decoded; + /// Fetch FLC (File-Line-Column) data for a single module definition. + /// + /// Evaluates the registered FlcService in the connected ROHD application. + /// Returns `null` when the FLC service is not registered or the module has + /// no FLC data. + /// + /// Results are cached per module definition name. + Future?> fetchModuleFlc(String definitionName) async { + // Return cached if available. + final cached = _cachedFlcJson[definitionName]; + if (cached != null) { + return cached; + } + + try { + final safeName = definitionName.replaceAll("'", r"\'"); + final expr = "TraceService.current?.flcModuleJson('$safeName') ?? " + "'{\"status\":\"unavailable\"}'"; + final instance = await rohdControllerEval.evalInstance( + expr, + isAlive: evalDisposable, + ); + final raw = instance.valueAsString; + if (raw == null || raw == 'null') { + debugPrint( + '[TreeService] fetchModuleFlc: ' + '"$definitionName" — returned null', + ); + return null; + } + final json = jsonDecode(raw) as Map; - if (treeObj['status'] == 'fail' || treeObj['status'] == 'unavailable') { - final message = - treeObj['message'] ?? treeObj['reason'] ?? treeObj['error']; - debugPrint('[TreeService] evalModuleTree failed: $message'); + // Check for unavailable status. + if (json['status'] == 'unavailable') { + debugPrint( + '[TreeService] fetchModuleFlc: ' + '"$definitionName" — ${json['reason']}', + ); + return null; + } + + debugPrint( + '[TreeService] fetchModuleFlc: ' + '"$definitionName" → ' + '${(raw.length / 1024).toStringAsFixed(1)} KB', + ); + _cachedFlcJson[definitionName] = json; + return json; + } on Exception catch (e) { + debugPrint('[TreeService] fetchModuleFlc error: $e'); return null; } + } - return TreeModel.fromJson(treeObj); + /// Fetch FLC data for the full module hierarchy. + /// + /// Evaluates the registered FLC provider in the connected app. + Future?> fetchFlcHierarchy() async { + try { + const expr = 'TraceService.current?.flcJson ?? ' + "'{\"status\":\"unavailable\"}'"; + final instance = await rohdControllerEval.evalInstance( + expr, + isAlive: evalDisposable, + ); + final raw = instance.valueAsString; + if (raw == null || raw == 'null') { + return null; + } + final json = jsonDecode(raw) as Map; + if (json['status'] == 'unavailable') { + debugPrint('[TreeService] fetchFlcHierarchy: ${json['reason']}'); + return null; + } + debugPrint( + '[TreeService] fetchFlcHierarchy: ' + '${(raw.length / 1024).toStringAsFixed(1)} KB', + ); + return json; + } on Exception catch (e) { + debugPrint('[TreeService] fetchFlcHierarchy error: $e'); + return null; + } + } + + /// Clear all cached FLC data. + /// + /// Call on VM disconnect or debug restart so stale data is not reused. + void clearFlcCache() { + _cachedFlcJson.clear(); + _scriptSourceCache.clear(); + _scriptRefs = null; + debugPrint('[TreeService] FLC cache cleared'); } - Future _evalTreePayload() async { + /// Fetch the source line for a given file URI and line number. + /// + /// [fileUri] is the package-relative path from FLC (e.g. + /// `lib/src/counter.dart`). Internally we search for a matching Script + /// in the isolate and retrieve its source text. + /// + /// Returns `null` if [vmService]/[isolateId] are not set, the script + /// cannot be found, or the line is out of range. + Future fetchSourceLine(String fileUri, int line) async { + if (vmService == null || isolateId == null) { + return null; + } try { - final treeInstance = await rohdControllerEval - .evalInstance(_hierarchyExpression, isAlive: evalDisposable); - return treeInstance.valueAsString; + final source = await _getScriptSource(fileUri); + if (source == null) { + return null; + } + final lines = source.split('\n'); + if (line < 1 || line > lines.length) { + return null; + } + return lines[line - 1]; } on Exception catch (e) { - debugPrint('[TreeService] Eval failed for "$_hierarchyExpression": $e'); + debugPrint('[TreeService] fetchSourceLine error: $e'); return null; } } - /// Returns whether the current module or any descendant matches the search. - static bool isNodeOrDescendentMatching( - TreeModel module, String? treeSearchTerm) { - if (module.name.toLowerCase().contains(treeSearchTerm!.toLowerCase())) { - return true; + /// Get cached script source, fetching from VM service if needed. + Future _getScriptSource(String fileUri) async { + if (_scriptSourceCache.containsKey(fileUri)) { + return _scriptSourceCache[fileUri]; + } + final svc = vmService!; + final isoId = isolateId!; + + _scriptRefs ??= (await svc.getScripts(isoId)).scripts ?? []; + + final normalized = _normalizePath(fileUri); + String suffix; + final libIdx = normalized.lastIndexOf('lib/'); + if (libIdx >= 0) { + suffix = normalized.substring(libIdx + 4); + } else { + suffix = normalized.split('/').last; } - for (final childModule in module.subModules) { - if (isNodeOrDescendentMatching(childModule, treeSearchTerm)) { - return true; + final ref = _scriptRefs!.cast().firstWhere((s) { + final uri = s!.uri; + if (uri == null) { + return false; } + return uri.endsWith(suffix); + }, orElse: () => null); + + if (ref == null || ref.id == null) { + debugPrint( + '[TreeService] _getScriptSource: ' + 'no script matching "$fileUri" (normalized: "$normalized", ' + 'suffix: "$suffix")', + ); + _scriptSourceCache[fileUri] = null; + return null; } - return false; + + final obj = await svc.getObject(isoId, ref.id!); + if (obj is Script && obj.source != null) { + _scriptSourceCache[fileUri] = obj.source; + return obj.source; + } + + debugPrint( + '[TreeService] _getScriptSource: ' + 'no source in script for "$fileUri"', + ); + _scriptSourceCache[fileUri] = null; + return null; } - /// Refreshes the module tree from the ROHD service. - Future refreshModuleTree() async { - final treeModel = await evalModuleTree(); - if (treeModel == null) { - throw StateError('Failed to refresh module tree.'); + /// Normalize a relative file path by resolving `..` segments. + /// + /// e.g. `.dart_tool/../lib/src/counter.dart` → `lib/src/counter.dart` + static String _normalizePath(String path) { + final segments = path.split('/'); + final resolved = []; + for (final seg in segments) { + if (seg == '..') { + if (resolved.isNotEmpty) { + resolved.removeLast(); + } + } else if (seg != '.' && seg.isNotEmpty) { + resolved.add(seg); + } + } + return resolved.join('/'); + } + + /// Fetch the path to the FLC file on disk for the running ROHD app. + /// + /// Evaluates the registered FlcService for the absolute path of the FLC + /// hierarchy file written to disk. Returns `null` when the FLC service is + /// not registered or nothing has been written. + Future fetchFlcFilePath() async { + try { + const expr = 'TraceService.current?.writtenPath'; + final instance = await rohdControllerEval.evalInstance( + expr, + isAlive: evalDisposable, + ); + final raw = instance.valueAsString; + if (raw == null || raw == 'null' || raw.startsWith('{')) { + debugPrint('[TreeService] fetchFlcFilePath: unavailable: $raw'); + return null; + } + debugPrint('[TreeService] fetchFlcFilePath: $raw'); + return raw; + } on Exception catch (e) { + debugPrint('[TreeService] fetchFlcFilePath error: $e'); + return null; } - return treeModel; } } diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/vm_connection_strategy.dart b/rohd_devtools_extension/lib/rohd_devtools/services/vm_connection_strategy.dart new file mode 100644 index 0000000000..83a8894934 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/vm_connection_strategy.dart @@ -0,0 +1,46 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// vm_connection_strategy.dart +// Platform-neutral contract for connecting to an ROHD VM service. +// +// 2026 August +// Author: Desmond Kirkpatrick + +import 'package:vm_service/vm_service.dart'; + +/// Abstract base for VM connection strategies. +abstract class VmConnectionStrategy { + /// Connects to a VM service at [uri]. + Future connect(String uri); + + /// Normalizes an HTTP or WebSocket endpoint to the VM WebSocket form. + Uri? normalizeUri(String value) { + try { + var uri = Uri.parse(value.trim()); + if (uri.scheme == 'http') { + uri = uri.replace(scheme: 'ws'); + } else if (uri.scheme == 'https') { + uri = uri.replace(scheme: 'wss'); + } + if (!uri.path.endsWith('/ws')) { + uri = uri.replace(path: '${uri.path}ws'); + } + return uri; + } on FormatException { + return null; + } + } +} + +/// Result of a successful VM connection attempt. +class VmConnectionResult { + /// Creates a connection result for [vmService] and its ROHD [isolateId]. + VmConnectionResult({required this.vmService, required this.isolateId}); + + /// Connected VM service. + final VmService vmService; + + /// Isolate that hosts the ROHD inspector service. + final String isolateId; +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_signal_value_source.dart b/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_signal_value_source.dart index 46ca39cddb..5eca42f33d 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_signal_value_source.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_signal_value_source.dart @@ -78,10 +78,7 @@ class VmServiceSignalValueSource implements SignalValueSource { for (final expression in _currentTimeExpressions) { try { - final value = await _evalInstance( - expression, - isAlive: evalDisposable, - ); + final value = await _evalInstance(expression, isAlive: evalDisposable); final raw = value.valueAsString; if (raw == null || raw.isEmpty) { continue; @@ -129,10 +126,7 @@ class VmServiceSignalValueSource implements SignalValueSource { for (final expression in snapshotExpressions) { try { - final value = await _evalInstance( - expression, - isAlive: evalDisposable, - ); + final value = await _evalInstance(expression, isAlive: evalDisposable); final payload = value.valueAsString; if (payload == null || payload.isEmpty) { continue; @@ -193,10 +187,10 @@ class VmServiceSignalValueSource implements SignalValueSource { } static String _waveformSnapshotExpression(int time) => - 'WaveformService.instance.getSnapshotCompactJson($time)'; + 'WaveformService.instance.getSnapshotCompactJSON($time)'; static const _moduleTreeSignalValuesExpression = - 'ModuleTree.instance.signalValuesJson'; + 'ModuleTree.instance.signalValuesJSON'; Future _readCurrentTimeFromExtension() async { final response = await _callExtension(_currentTimeExtension); diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_signal_waveform_api.dart b/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_signal_waveform_api.dart new file mode 100644 index 0000000000..96eb6ca8fd --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_signal_waveform_api.dart @@ -0,0 +1,169 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// vm_service_signal_rohd_waveform.dart +// VM service adapter — thin subclass of BaseSignalWaveformApi. +// +// All shared algorithm (snapshot expansion, evaluator, synthesis, module +// expansion) lives in BaseSignalWaveformApi. This subclass adds only +// VM-specific behavior: signal tracking, address-lookup pushdown to +// transport, DFS load future, and parent↔child diagnostic logging. +// +// 2026 January +// Author: Desmond Kirkpatrick + +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/base_signal_waveform_api.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/vm_service_transport.dart'; +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; +import 'package:rohd_waveform/rohd_waveform.dart'; + +/// VM service adapter that wraps [VmServiceTransport] via +/// [BaseSignalWaveformApi]. +/// +/// All shared algorithm lives in the base class. This subclass adds: +/// - SignalOccurrence tracking (registers signals with transport for breakpoint +/// auto-fetch) +/// - Address-lookup pushdown to transport on hierarchy load +/// - Parent↔child port diagnostic logging +/// - `rootName` setter for evaluator invalidation +class VmServiceSignalWaveformApi extends BaseSignalWaveformApi { + /// The underlying VM service transport. + final VmServiceTransport vmTransport; + + /// Deduplicating future for dictionary + gate netlist loading. + Future? _dfsLoadFuture; + + /// Creates a new adapter for the given VM service transport. + VmServiceSignalWaveformApi(this.vmTransport) : super(vmTransport); + + /// Root instance name hint. + /// + /// Setting this invalidates the cached evaluator so that the next + /// evaluation picks up any structural changes. + // ignore: avoid_setters_without_getters + set rootName(String? value) {} + + // ───────────────────────────────────────────────────────────────────────── + // Overrides from BaseSignalWaveformApi + // ───────────────────────────────────────────────────────────────────────── + + /// Sets the module structure and pushes address lookups to the transport. + @override + Future setExternalStructure(ModuleStructure structure) async { + _dfsLoadFuture = null; + await super.setExternalStructure(structure); + await _ensureAddressLookups(); + } + + /// Ensure the DFS dictionary is loaded and address lookups are pushed + /// to the transport for breakpoint-triggered compact fetches. + Future _ensureAddressLookups() => + _dfsLoadFuture ??= _doEnsureAddressLookups(); + + Future _doEnsureAddressLookups() async { + final hs = hierarchyService; + if (hs != null) { + vmTransport.setAddressLookups( + signalIdToAddress: (id) => hs.pathnameToAddress(id)?.toDotString(), + addressToSignalId: (addr) => hs.addressToPathname( + OccurrenceAddress.fromDotString(addr), + asSignal: true, + ), + ); + debugPrint('[VmSignalApi] Address lookups pushed to transport'); + } + + // Force a major GC after loading the design structure. + unawaited(vmTransport.requestGarbageCollection()); + return true; + } + + /// Register tracked signals with the transport for breakpoint auto-fetch. + @override + void onTrackSignals(List signalIds) { + signalIds.forEach(vmTransport.trackSignal); + } + + /// VM-specific post-expansion diagnostic: log parent↔child port + /// value mismatches. + @override + void onSnapshotExpanded( + Map compact, + Map> result, + ) { + _logClientPortDiagnostics(compact, result); + } + + // ───────────────────────────────────────────────────────────────────────── + // VM-specific methods + // ───────────────────────────────────────────────────────────────────────── + + /// Refresh waveform data from the VM service. + Future refresh() async { + clearCache(); + } + + /// Clear all cached data (delegates to base + resets DFS future). + @override + void clearCache() { + _dfsLoadFuture = null; + super.clearCache(); + } + + // ───────────────────────────────────────────────────────────────────────── + // Diagnostics + // ───────────────────────────────────────────────────────────────────────── + + /// Diagnostic: log parent↔child port value mismatches after expansion. + void _logClientPortDiagnostics( + Map compact, + Map> result, + ) { + final time = compact['time']; + final rawValues = compact['v'] as Map? ?? {}; + final hs = hierarchyService; + + for (final signalId in result.keys) { + final parts = signalId.split('/'); + if (parts.length < 3) { + continue; + } + final leafName = parts.last; + if (leafName.contains('_') && !leafName.startsWith('_')) { + continue; + } + final parentScope = parts.sublist(0, parts.length - 2).join('/'); + final parentId = '$parentScope/$leafName'; + final parentEntry = result[parentId]; + if (parentEntry == null) { + continue; + } + + final childVal = result[signalId]!['value'] as String; + final parentVal = parentEntry['value'] as String; + if (childVal == parentVal) { + continue; + } + + final childAddr = hs != null + ? OccurrenceAddress.tryFromPathname(signalId, hs.root)?.toDotString() + : '?'; + final parentAddr = hs != null + ? OccurrenceAddress.tryFromPathname(parentId, hs.root)?.toDotString() + : '?'; + + debugPrint('[ClientDiag] MISMATCH at t=$time:'); + debugPrint( + ' child: $signalId (addr=$childAddr) = $childVal ' + '(raw=${rawValues[childAddr]})', + ); + debugPrint( + ' parent: $parentId (addr=$parentAddr) = $parentVal ' + '(raw=${rawValues[parentAddr]})', + ); + } + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_transport.dart b/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_transport.dart new file mode 100755 index 0000000000..33cb5e38ad --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_transport.dart @@ -0,0 +1,820 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// vm_service_transport.dart +// VM service transport — calls ROHD via callServiceExtension/evaluate. +// +// Handles the mechanics of sending RPCs over the Dart VM service protocol: +// - Service extension fast path (~20ms) vs evaluate() fallback (~650ms) +// - Breakpoint-triggered auto-fetch with trailing-edge debounce +// - Per-signal timepoint tracking for incremental updates +// - Library discovery, string truncation recovery, address lookups +// +// 2026 April +// Author: Desmond Kirkpatrick + +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/rohd_service_transport.dart'; +import 'package:rohd_waveform/rohd_waveform.dart'; +import 'package:vm_service/vm_service.dart'; + +/// [RohdServiceTransport] that communicates with a running ROHD application +/// via the Dart VM service protocol. +/// +/// Uses `callServiceExtension` (fast, ~20ms) when available, with +/// `evaluate()` (slower, ~650ms) as fallback. Subscribes to debug events +/// to auto-fetch waveform data at breakpoints. +class VmServiceTransport implements RohdServiceTransport { + VmService _vmService; + String _isolateId; + + /// Stream controller for pushing waveform updates to listeners. + final _updateController = StreamController.broadcast(); + + /// Subscription to VM debug events. + StreamSubscription? _debugEventSubscription; + + /// Last simulation time we've fetched data for. + int _lastFetchedTime = 0; + + /// Library reference for ROHD waveform service. + LibraryRef? _waveformLibRef; + + /// Whether we're currently connected. + bool _connected = true; + + /// Debounce timer for breakpoint-triggered fetches. + Timer? _pauseDebounceTimer; + + /// Debounce duration for breakpoint events. + static const _pauseDebounceDuration = Duration(milliseconds: 100); + + /// Whether ROHD-side service extensions (ext.rohd.*) are available. + bool? _serviceExtensionsAvailable; + + /// Signal IDs and their last fetched timepoints (for selective waveform + /// transmission). + final _trackedSignals = {}; + + /// Address-lookup closures for compact transport. + String? Function(String signalId)? _toAddress; + String? Function(String addressDotString)? _fromAddress; + + /// When true, breakpoint-triggered data fetches are skipped but endTime + /// updates are still emitted. + bool _fetchesPaused = false; + + /// Creates a new VM service transport. + VmServiceTransport({required VmService vmService, required String isolateId}) + : _vmService = vmService, + _isolateId = isolateId { + unawaited(_subscribeToDebugEvents()); + } + + // ───────────────────────────────────────────────────────────────────────── + // RohdServiceTransport interface + // ───────────────────────────────────────────────────────────────────────── + + @override + bool get isConnected => _connected; + + @override + String get modeDescription => 'VM Service (Live Simulation)'; + + @override + int get lastFetchedTime => _lastFetchedTime; + + @override + Stream get liveUpdates => _updateController.stream; + + /// The signal IDs currently being tracked for auto-fetch. + List get trackedSignalKeys => + _trackedSignals.keys.cast().toList(); + + /// Whether waveform fetches are currently paused. + bool get fetchesPaused => _fetchesPaused; + + // ───────────────────────────────────────────────────────────────────────── + // Waveform RPCs + // ───────────────────────────────────────────────────────────────────────── + + @override + Future getCurrentTime() async { + if (!_connected) { + return null; + } + try { + String? jsonStr; + if (_serviceExtensionsAvailable ?? false) { + jsonStr = await _callExtension('ext.rohd.currentTime'); + } + jsonStr ??= await _evaluate('WaveformDataService.instance.currentTime'); + if (jsonStr == null) { + return null; + } + final result = jsonDecode(jsonStr); + if (result is int) { + return result; + } + if (result is Map && result['currentTime'] is int) { + return result['currentTime'] as int; + } + return null; + } on Exception { + return null; + } + } + + @override + Future?> getSnapshotCompact(int time) async { + if (!_connected) { + return null; + } + try { + String? jsonStr; + if (_serviceExtensionsAvailable ?? false) { + jsonStr = await _callExtension('ext.rohd.snapshotCompact', { + 'time': time.toString(), + }); + } + jsonStr ??= await _evaluate( + 'WaveformDataService.instance.getSnapshotCompactJSON($time)', + ); + if (jsonStr == null) { + return null; + } + return jsonDecode(jsonStr) as Map; + } on Exception { + return null; + } + } + + @override + Future> getWaveformDataCompact({ + required List signalAddresses, + required Map addressToSignalId, + int? startTime, + int? endTime, + }) async { + if (!_connected) { + return []; + } + + final addressesJson = jsonEncode(signalAddresses); + final start = startTime ?? 0; + final end = endTime ?? -1; + + String? jsonStr; + if (_serviceExtensionsAvailable ?? false) { + jsonStr = await _callExtension( + 'ext.rohd.waveformDataCompact', + { + 'signalIndicesJson': addressesJson, + 'startTime': start.toString(), + 'endTime': end.toString(), + }, + 'data'); + } + jsonStr ??= await _evaluate( + 'WaveformDataService.instance.getWaveformsCompactJSON(' + "'$addressesJson', $start, $end)", + ); + if (jsonStr == null) { + return []; + } + return _parseCompactWaveformData(jsonStr, addressToSignalId); + } + + @override + Future> getWaveformDataWithTimepointsCompact({ + required Map signalTimepoints, + required Map addressToSignalId, + }) async { + if (!_connected) { + return []; + } + + final timepointsJson = jsonEncode(signalTimepoints); + + String? jsonStr; + if (_serviceExtensionsAvailable ?? false) { + jsonStr = await _callExtension( + 'ext.rohd.waveformDataWithTimepointsCompact', + {'signalTimepointsJson': timepointsJson}, + 'data', + ); + } + jsonStr ??= await _evaluate( + 'WaveformDataService.instance.getDataWithTimepointsCompactJSON(' + "'$timepointsJson')", + ); + if (jsonStr == null) { + return []; + } + return _parseCompactWaveformData(jsonStr, addressToSignalId); + } + + // ───────────────────────────────────────────────────────────────────────── + // Hierarchy RPCs + // ───────────────────────────────────────────────────────────────────────── + + @override + Future?> getModuleTree() async { + if (!_connected) { + return null; + } + try { + // Find the ROHD library containing ModuleServices. + final isolate = await _vmService.getIsolate(_isolateId); + final libraries = isolate.libraries ?? []; + + LibraryRef? rohdLibRef; + for (final libRef in libraries) { + final uri = libRef.uri; + if (uri != null && + uri.contains('rohd') && + (uri.contains('module_services') || + uri.contains('inspector_service'))) { + rohdLibRef = libRef; + break; + } + } + rohdLibRef ??= libraries.cast().firstWhere((libRef) { + final uri = libRef?.uri; + return uri != null && + uri.contains('rohd') && + uri.contains('module_tree'); + }, orElse: () => null); + rohdLibRef ??= libraries.cast().firstWhere((libRef) { + final uri = libRef?.uri; + if (uri == null) { + return false; + } + final lower = uri.toLowerCase(); + return lower.contains('package:rohd') || + lower.contains('/packages/rohd') || + lower.contains('rohd.dart') || + lower.contains('rohd/'); + }, orElse: () => null); + if (rohdLibRef == null) { + debugPrint('[VmTransport] No ROHD library found'); + return null; + } + + final result = await _vmService.evaluate( + _isolateId, + rohdLibRef.id!, + 'NetlistService.current?.slimJson ?? ' + 'ModuleServices.instance.hierarchyJson', + ); + if (result is InstanceRef) { + final raw = await _getFullStringFromRef(result); + if (raw == null) { + return null; + } + return jsonDecode(raw) as Map; + } + return null; + } on Exception catch (e) { + debugPrint('[VmTransport] getModuleTree error: $e'); + return null; + } + } + + @override + Future?> getModuleNetlist(String definitionName) async { + if (!_connected) { + return null; + } + try { + final isolate = await _vmService.getIsolate(_isolateId); + final libraries = isolate.libraries ?? []; + + LibraryRef? rohdLibRef; + for (final libRef in libraries) { + final uri = libRef.uri; + if (uri != null && + uri.contains('rohd') && + (uri.contains('module_services') || + uri.contains('inspector_service') || + uri.contains('module_tree'))) { + rohdLibRef = libRef; + break; + } + } + if (rohdLibRef == null) { + return null; + } + + // Sanitize to prevent injection in the eval expression. + final safeName = definitionName.replaceAll("'", r"\'"); + final expr = "NetlistService.current?.moduleJson('$safeName')"; + final result = await _vmService.evaluate( + _isolateId, + rohdLibRef.id!, + expr, + ); + if (result is InstanceRef) { + final raw = await _getFullStringFromRef(result); + if (raw == null || raw == 'null') { + return null; + } + final decoded = jsonDecode(raw) as Map; + // New format wraps module data under a 'modules' key. + if (decoded.containsKey('modules') && + !decoded.containsKey(definitionName)) { + return decoded['modules'] as Map; + } + return decoded; + } + return null; + } on Exception catch (e) { + debugPrint('[VmTransport] getModuleNetlist error: $e'); + return null; + } + } + + // ───────────────────────────────────────────────────────────────────────── + // Signal tracking (for breakpoint-triggered incremental updates) + // ───────────────────────────────────────────────────────────────────────── + + /// Start tracking a signal for auto-fetch on breakpoints. + void trackSignal(String signalId) { + _trackedSignals.putIfAbsent(signalId, () => -1); + } + + /// Stop tracking a signal (timepoint retained for re-add). + void untrackSignal(String signalId) { + _trackedSignals.remove(signalId); + } + + /// Stop tracking all signals. + void untrackAllSignals() { + _trackedSignals.clear(); + } + + /// Get the last timepoint fetched for a tracked signal. + int getLastTrackedTimepoint(String signalId) => + _trackedSignals[signalId] ?? -1; + + /// Push address-lookup closures from the API layer. + void setAddressLookups({ + required String? Function(String signalId) signalIdToAddress, + required String? Function(String addressDotString) addressToSignalId, + }) { + _toAddress = signalIdToAddress; + _fromAddress = addressToSignalId; + } + + /// Pause waveform data fetches (endTime updates still emitted). + void pauseFetches() { + _fetchesPaused = true; + } + + /// Resume waveform data fetches and pull accumulated data. + Future resumeFetches() async { + _fetchesPaused = false; + if (_trackedSignals.isEmpty || !_connected) { + return; + } + + final savedExtAvail = _serviceExtensionsAvailable; + _serviceExtensionsAvailable = false; + try { + final newData = await _fetchTrackedCompact(); + if (newData.isNotEmpty) { + for (final wf in newData) { + if (wf.endTime != null) { + _trackedSignals[wf.signalId] = wf.endTime!; + } + } + for (final waveform in newData) { + if (waveform.endTime != null && + waveform.endTime! > _lastFetchedTime) { + _lastFetchedTime = waveform.endTime!; + } + } + _updateController.add( + WaveformUpdateEvent( + incrementalData: newData, + reason: WaveformUpdateReason.breakpoint, + upToTime: _lastFetchedTime, + ), + ); + } + } on Exception { + // Failed to fetch on resume + } finally { + _serviceExtensionsAvailable = savedExtAvail; + } + } + + /// Fetch current time and emit an endTime-only update. + Future fetchAndEmitCurrentTime() async { + final currentTime = await getCurrentTime(); + if (currentTime != null && currentTime > _lastFetchedTime) { + _lastFetchedTime = currentTime; + _updateController.add( + WaveformUpdateEvent( + incrementalData: const [], + reason: WaveformUpdateReason.breakpoint, + upToTime: currentTime, + ), + ); + } + } + + /// Request a full garbage collection on the connected isolate. + Future requestGarbageCollection() async { + try { + await _vmService.getAllocationProfile(_isolateId, gc: true); + } on Exception catch (_) { + // Best-effort + } + } + + /// Swap the underlying VM service and isolate without destroying + /// tracked-signal state. + Future reconnect( + VmService vmService, + String isolateId, { + bool preserveTracking = false, + }) async { + await _debugEventSubscription?.cancel(); + _debugEventSubscription = null; + + _vmService = vmService; + _isolateId = isolateId; + _connected = true; + _waveformLibRef = null; + _serviceExtensionsAvailable = null; + + if (!preserveTracking) { + _trackedSignals.clear(); + } + + unawaited(_subscribeToDebugEvents()); + } + + // ───────────────────────────────────────────────────────────────────────── + // Lifecycle + // ───────────────────────────────────────────────────────────────────────── + + @override + Future dispose() async { + _connected = false; + _pauseDebounceTimer?.cancel(); + await _debugEventSubscription?.cancel(); + await _updateController.close(); + _trackedSignals.clear(); + } + + // ───────────────────────────────────────────────────────────────────────── + // Private: Debug events & breakpoint handling + // ───────────────────────────────────────────────────────────────────────── + + Future _subscribeToDebugEvents() async { + try { + await _vmService.streamListen(EventStreams.kDebug); + } on Exception { + // 'Stream already subscribed' is expected + } + try { + _debugEventSubscription = _vmService.onDebugEvent.listen( + _handleDebugEvent, + ); + } on Exception { + // Debug stream may not be available + } + } + + void _handleDebugEvent(Event event) { + final kind = event.kind; + if (kind == EventKind.kPauseBreakpoint || + kind == EventKind.kPauseException || + kind == EventKind.kPauseInterrupted || + kind == EventKind.kPauseExit) { + _pauseDebounceTimer?.cancel(); + _pauseDebounceTimer = Timer(_pauseDebounceDuration, () { + unawaited(_onPause(event)); + }); + } + } + + Future _onPause(Event event) async { + // Service extensions can't run while paused — force evaluate() path. + final savedExtAvail = _serviceExtensionsAvailable; + _serviceExtensionsAvailable = false; + + try { + if (_trackedSignals.isEmpty || _fetchesPaused) { + final currentTime = await getCurrentTime(); + if (currentTime != null && currentTime > _lastFetchedTime) { + _lastFetchedTime = currentTime; + _updateController.add( + WaveformUpdateEvent( + incrementalData: const [], + reason: WaveformUpdateReason.breakpoint, + upToTime: currentTime, + ), + ); + } + return; + } + + final newData = await _fetchTrackedCompact(); + + if (newData.isNotEmpty) { + for (final wf in newData) { + if (wf.endTime != null) { + _trackedSignals[wf.signalId] = wf.endTime!; + } + } + for (final waveform in newData) { + if (waveform.endTime != null && + waveform.endTime! > _lastFetchedTime) { + _lastFetchedTime = waveform.endTime!; + } + } + _updateController.add( + WaveformUpdateEvent( + incrementalData: newData, + reason: WaveformUpdateReason.breakpoint, + upToTime: _lastFetchedTime, + ), + ); + } else { + final currentTime = await getCurrentTime(); + if (currentTime != null && currentTime > _lastFetchedTime) { + _lastFetchedTime = currentTime; + _updateController.add( + WaveformUpdateEvent( + incrementalData: const [], + reason: WaveformUpdateReason.breakpoint, + upToTime: currentTime, + ), + ); + } + } + } on Exception { + // Isolate paused but unable to fetch + } finally { + _serviceExtensionsAvailable = savedExtAvail; + } + } + + Future> _fetchTrackedCompact() { + final toAddr = _toAddress; + final fromAddr = _fromAddress; + + if (toAddr != null && fromAddr != null) { + final compactMap = {}; + final addrToId = {}; + for (final entry in _trackedSignals.entries) { + final addr = toAddr(entry.key); + if (addr != null) { + compactMap[addr] = entry.value; + addrToId[addr] = entry.key; + } + } + if (compactMap.isNotEmpty) { + return getWaveformDataWithTimepointsCompact( + signalTimepoints: compactMap, + addressToSignalId: addrToId, + ); + } + } + + // Fallback: legacy string-keyed path + return _getWaveformDataWithTimepointsBatch( + _trackedSignals.cast(), + ); + } + + /// Legacy string-keyed waveform data with per-signal timepoints. + Future> _getWaveformDataWithTimepointsBatch( + Map signalTimepoints, + ) async { + final timepointsJson = jsonEncode(signalTimepoints); + + String? jsonStr; + if (_serviceExtensionsAvailable ?? false) { + jsonStr = await _callExtension( + 'ext.rohd.waveformDataWithTimepoints', + { + 'signalTimepointsJson': timepointsJson, + }, + 'data'); + } + if (jsonStr == null) { + final escapedJson = + timepointsJson.replaceAll(r'\', r'\\').replaceAll("'", r"\'"); + final expression = 'WaveformDataService.instance' + ".getDataWithTimepointsJSON('$escapedJson')"; + jsonStr = await _evaluate(expression); + } + if (jsonStr == null) { + return []; + } + try { + final jsonList = jsonDecode(jsonStr) as List; + return jsonList + .map((e) => WaveformData.fromJson(e as Map)) + .toList(); + } on Exception { + return []; + } + } + + // ───────────────────────────────────────────────────────────────────────── + // Private: VM protocol helpers + // ───────────────────────────────────────────────────────────────────────── + + Future _findWaveformLibrary() async { + if (_waveformLibRef != null) { + return _waveformLibRef; + } + try { + final isolate = await _vmService.getIsolate(_isolateId); + final libraries = isolate.libraries ?? []; + + for (final libRef in libraries) { + final uri = libRef.uri; + if (uri != null && uri.contains('waveform_service')) { + _waveformLibRef = libRef; + return libRef; + } + } + for (final libRef in libraries) { + final uri = libRef.uri; + if (uri != null && uri.contains('inspector_service')) { + _waveformLibRef = libRef; + return libRef; + } + } + for (final libRef in libraries) { + final uri = libRef.uri; + if (uri == null) { + continue; + } + final lower = uri.toLowerCase(); + if (lower.contains('package:rohd') || + lower.contains('/packages/rohd') || + lower.contains('rohd.dart') || + lower.contains('rohd/')) { + _waveformLibRef = libRef; + return libRef; + } + } + } on Exception { + // Unable to find library + } + return null; + } + + Future _evaluate(String expression) async { + final libRef = await _findWaveformLibrary(); + if (libRef == null || libRef.id == null) { + return null; + } + try { + final result = await _vmService.evaluate( + _isolateId, + libRef.id!, + expression, + ); + if (result is InstanceRef) { + if (result.valueAsStringIsTruncated ?? false) { + return await _getFullString(result.id!); + } + return result.valueAsString; + } + return null; + } on Exception catch (e) { + final errorStr = e.toString(); + if (errorStr.contains('Undefined name') && + errorStr.contains('WaveformService')) { + final value = await _evaluateOnFallbackLibrary(expression); + return value; + } + return null; + } + } + + Future _evaluateOnFallbackLibrary(String expression) async { + try { + final isolate = await _vmService.getIsolate(_isolateId); + final libs = isolate.libraries ?? []; + LibraryRef? mainLib; + for (final lib in libs) { + final uri = lib.uri; + if (uri == 'dart:main' || uri == 'dart:_main') { + mainLib = lib; + break; + } + if (mainLib == null && + uri != null && + !uri.startsWith('dart:') && + !uri.startsWith('package:')) { + mainLib = lib; + } + } + if (mainLib != null && mainLib.id != null) { + final retryResult = await _vmService.evaluate( + _isolateId, + mainLib.id!, + expression, + ); + if (retryResult is InstanceRef) { + if (retryResult.valueAsStringIsTruncated ?? false) { + return await _getFullString(retryResult.id!); + } + return retryResult.valueAsString; + } + } + } on Exception { + // Silently fail retry + } + return null; + } + + Future _callExtension( + String method, [ + Map? args, + String? resultKey, + ]) async { + try { + final response = await _vmService.callServiceExtension( + method, + isolateId: _isolateId, + args: args, + ); + final json = response.json; + if (json == null) { + return null; + } + if (resultKey != null) { + final value = json[resultKey]; + if (value == null) { + return null; + } + return jsonEncode(value); + } + return jsonEncode(json); + } on Exception { + _serviceExtensionsAvailable = false; + return null; + } + } + + Future _getFullString(String objectId) async { + try { + final obj = await _vmService.getObject(_isolateId, objectId); + if (obj is Instance && obj.valueAsString != null) { + return obj.valueAsString; + } + } on Exception { + return null; + } + return null; + } + + /// Get full string from an InstanceRef (handles truncation). + Future _getFullStringFromRef(InstanceRef ref) async { + if (ref.valueAsStringIsTruncated ?? false) { + final value = await _getFullString(ref.id!); + return value; + } + return ref.valueAsString; + } + + List _parseCompactWaveformData( + String jsonStr, + Map addressToSignalId, + ) { + try { + final jsonList = jsonDecode(jsonStr) as List; + final result = []; + for (final item in jsonList) { + final map = item as Map; + final addr = map['i'] as String; + final signalId = addressToSignalId[addr]; + if (signalId == null) { + continue; + } + final rawData = map['d'] as List; + final dataPoints = rawData.map((d) { + final dp = d as Map; + return Data(time: dp['t'] as int, value: dp['v'].toString()); + }).toList(); + result.add(WaveformData(signalId: signalId, data: dataPoints)); + } + return result; + } on Exception { + return []; + } + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_tree_data_source.dart b/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_tree_data_source.dart new file mode 100644 index 0000000000..3972ad1f1d --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_tree_data_source.dart @@ -0,0 +1,600 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// vm_service_tree_data_source.dart +// VM service-based tree data source for DTD/debugger connection. +// +// 2026 January +// Author: Desmond Kirkpatrick + +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/models/tree_model.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/design_data_adapter.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/flc_service.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/tree_data_source.dart'; +import 'package:vm_service/vm_service.dart'; + +/// VM service-based tree data source for connecting to running ROHD apps. +/// +/// This connects via the Dart VM service protocol to evaluate +/// `NetlistService.current?.slimJson` (unified netlist format) in the +/// target application. The result goes through [DesignDataAdapter] which +/// extracts the hierarchy and any embedded schematic data in a single pass. +class VmServiceTreeDataSource implements TreeDataSource { + final VmService _vmService; + final String _isolateId; + + static const _unifiedFunc = 'NetlistService.current?.slimJson ?? ' + 'ModuleServices.instance.hierarchyJson'; + + /// Cached schematic JSON from the last eval/refresh. + Map? _cachedSchematicJson; + + /// Creates a [VmServiceTreeDataSource] with the given VM service and isolate + /// ID. + VmServiceTreeDataSource({ + required VmService vmService, + required String isolateId, + }) : _vmService = vmService, + _isolateId = isolateId; + + @override + bool get isConnected => true; // Assumed connected if this object exists + + @override + String get modeDescription => 'VM Service (DTD)'; + + @override + Map? getSchematicJson() => _cachedSchematicJson; + + @override + Future evalModuleTree() async { + try { + debugPrint('[VmServiceTreeDataSource] Getting isolate $_isolateId...'); + final isolate = await _vmService.getIsolate(_isolateId); + final libraries = isolate.libraries ?? []; + debugPrint( + '[VmServiceTreeDataSource] Found ${libraries.length} libraries', + ); + + LibraryRef? rohdLibRef; + for (final libRef in libraries) { + final uri = libRef.uri; + if (uri != null && + uri.contains('rohd') && + (uri.contains('module_services') || + uri.contains('inspector_service'))) { + rohdLibRef = libRef; + debugPrint('[VmServiceTreeDataSource] Found ROHD library: $uri'); + break; + } + } + + // Fallback to module_tree library + rohdLibRef ??= libraries.cast().firstWhere((libRef) { + final uri = libRef?.uri; + return uri != null && + uri.contains('rohd') && + uri.contains('module_tree'); + }, orElse: () => null); + + // Broader fallbacks: match common ROHD-related URI patterns. This helps + // when the inspector helpers are compiled into a different library + // (for example when files are re-exported or combined by the test + // harness). + rohdLibRef ??= libraries.cast().firstWhere((libRef) { + final uri = libRef?.uri; + if (uri == null) { + return false; + } + final lower = uri.toLowerCase(); + return lower.contains('package:rohd') || + lower.contains('/packages/rohd') || + lower.contains('rohd.dart') || + lower.contains('rohd/'); + }, orElse: () => null); + + if (rohdLibRef == null) { + debugPrint( + '[VmServiceTreeDataSource] No ROHD library found! Sample libraries:', + ); + for (var i = 0; i < libraries.length && i < 20; i++) { + debugPrint(' [lib $i] ${libraries[i].uri}'); + } + return null; + } + + // Evaluate unified netlist format + debugPrint('[VmServiceTreeDataSource] Evaluating: $_unifiedFunc'); + final result = await _vmService.evaluate( + _isolateId, + rohdLibRef.id!, + _unifiedFunc, + ); + debugPrint( + '[VmServiceTreeDataSource] Result type: ' + '${result.runtimeType}', + ); + return await _parseResult(result); + } on Exception catch (e, stack) { + debugPrint('[VmServiceTreeDataSource] Error: $e'); + debugPrint('[VmServiceTreeDataSource] Stack: $stack'); + return null; + } + } + + /// Get the full string value from an InstanceRef. The VM service truncates + /// valueAsString, so we need to fetch the full object. + Future _getFullString(InstanceRef instanceRef) async { + // Check if the string is truncated + if (instanceRef.valueAsStringIsTruncated ?? false) { + debugPrint( + '[VmServiceTreeDataSource] String is truncated, ' + 'fetching full object...', + ); + try { + final fullObject = await _vmService.getObject( + _isolateId, + instanceRef.id!, + ); + if (fullObject is Instance) { + debugPrint( + '[VmServiceTreeDataSource] Got full string, length: ' + '${fullObject.valueAsString?.length}', + ); + return fullObject.valueAsString; + } + } on Exception catch (e) { + debugPrint('[VmServiceTreeDataSource] Failed to get full string: $e'); + } + } + return instanceRef.valueAsString; + } + + @override + Future?> fetchModuleSchematic( + String definitionName, + ) async { + try { + final isolate = await _vmService.getIsolate(_isolateId); + final libraries = isolate.libraries ?? []; + + LibraryRef? rohdLibRef; + for (final libRef in libraries) { + final uri = libRef.uri; + if (uri != null && + uri.contains('rohd') && + (uri.contains('module_services') || + uri.contains('inspector_service') || + uri.contains('module_tree'))) { + rohdLibRef = libRef; + break; + } + } + if (rohdLibRef == null) { + return null; + } + + // Sanitize to prevent injection in the eval expression. + final safeName = definitionName.replaceAll("'", r"\'"); + final expr = "NetlistService.current?.moduleJson('$safeName')"; + final result = await _vmService.evaluate( + _isolateId, + rohdLibRef.id!, + expr, + ); + if (result is InstanceRef) { + final raw = await _getFullString(result); + if (raw == null || raw == 'null') { + return null; + } + final decoded = jsonDecode(raw) as Map; + // New format wraps module data under a 'modules' key. + if (decoded.containsKey('modules') && + !decoded.containsKey(definitionName)) { + return decoded['modules'] as Map; + } + return decoded; + } + return null; + } on Exception catch (e) { + debugPrint('[VmServiceTreeDataSource] fetchModuleSchematic error: $e'); + return null; + } + } + + // --------------------------------------------------------------------------- + // FLC (First-Level Callers) data for source cross-probing + // --------------------------------------------------------------------------- + + /// Cached FLC JSON per module definition name. + final Map> _cachedFlcJson = {}; + + /// Fetch FLC data for a single module definition. + /// + /// Evaluates the registered FLC provider on the running ROHD app. + Future?> fetchModuleFlc(String definitionName) async { + if (_cachedFlcJson.containsKey(definitionName)) { + return _cachedFlcJson[definitionName]; + } + try { + final libRef = await _findRohdLibrary(); + if (libRef == null) { + debugPrint( + '[VmServiceTreeDataSource] fetchModuleFlc: ' + 'no ROHD library found for $definitionName', + ); + return null; + } + + final safeName = definitionName.replaceAll("'", r"\'"); + final expr = "TraceService.current?.flcModuleJson('$safeName') ?? " + "'{\"status\":\"unavailable\"}'"; + debugPrint( + '[VmServiceTreeDataSource] fetchModuleFlc: ' + 'evaluating on ${libRef.uri}', + ); + final result = await _vmService.evaluate(_isolateId, libRef.id!, expr); + if (result is InstanceRef) { + final raw = await _getFullString(result); + if (raw == null || raw == 'null') { + debugPrint( + '[VmServiceTreeDataSource] fetchModuleFlc: ' + 'null for $definitionName', + ); + return null; + } + final json = jsonDecode(raw) as Map; + _cachedFlcJson[definitionName] = json; + debugPrint( + '[VmServiceTreeDataSource] fetchModuleFlc: ' + '${raw.length} chars for $definitionName', + ); + return json; + } + debugPrint( + '[VmServiceTreeDataSource] fetchModuleFlc: ' + 'unexpected result type ${result.runtimeType} for $definitionName', + ); + return null; + } on Exception catch (e) { + debugPrint('[VmServiceTreeDataSource] fetchModuleFlc error: $e'); + return null; + } + } + + /// Fetch the full FLC hierarchy JSON. + /// + /// Evaluates the registered [FlcService] on the running ROHD app. + Future?> fetchFlcHierarchy() async { + try { + final libRef = await _findRohdLibrary(); + if (libRef == null) { + debugPrint( + '[VmServiceTreeDataSource] fetchFlcHierarchy: ' + 'no ROHD library found', + ); + return null; + } + + debugPrint( + '[VmServiceTreeDataSource] fetchFlcHierarchy: ' + 'evaluating on ${libRef.uri}', + ); + final result = await _vmService.evaluate( + _isolateId, + libRef.id!, + "TraceService.current?.flcJson ?? '{\"status\":\"unavailable\"}'", + ); + if (result is InstanceRef) { + final raw = await _getFullString(result); + if (raw == null || raw == 'null') { + debugPrint( + '[VmServiceTreeDataSource] fetchFlcHierarchy: ' + 'eval returned null', + ); + return null; + } + debugPrint( + '[VmServiceTreeDataSource] fetchFlcHierarchy: ' + '${raw.length} chars', + ); + final json = jsonDecode(raw) as Map; + if (json['status'] == 'unavailable') { + debugPrint( + '[VmServiceTreeDataSource] fetchFlcHierarchy: ' + '${json['reason'] ?? 'unavailable'}', + ); + return null; + } + return json; + } + debugPrint( + '[VmServiceTreeDataSource] fetchFlcHierarchy: ' + 'unexpected result type ${result.runtimeType}', + ); + return null; + } on Exception catch (e) { + debugPrint('[VmServiceTreeDataSource] fetchFlcHierarchy error: $e'); + return null; + } + } + + /// Fetch the path to the FLC file on disk for the running ROHD app. + /// + /// Evaluates the registered [FlcService] on the running ROHD app for + /// the absolute path of the FLC hierarchy file written to disk. + /// Returns `null` when the FLC service is not registered or nothing has + /// been written. + Future fetchFlcFilePath() async { + try { + final libRef = await _findRohdLibrary(); + if (libRef == null) { + debugPrint( + '[VmServiceTreeDataSource] fetchFlcFilePath: no ROHD library found', + ); + return null; + } + final result = await _vmService.evaluate( + _isolateId, + libRef.id!, + 'TraceService.current?.writtenPath', + ); + if (result is InstanceRef) { + final raw = await _getFullString(result); + if (raw == null || raw == 'null' || raw.startsWith('{')) { + debugPrint( + '[VmServiceTreeDataSource] fetchFlcFilePath: ' + 'error/unavailable: $raw', + ); + return null; + } + debugPrint('[VmServiceTreeDataSource] fetchFlcFilePath: $raw'); + return raw; + } + return null; + } on Exception catch (e) { + debugPrint('[VmServiceTreeDataSource] fetchFlcFilePath error: $e'); + return null; + } + } + + /// Clear cached FLC data. + void clearFlcCache() { + _cachedFlcJson.clear(); + _scriptCache.clear(); + } + + // --------------------------------------------------------------------------- + // Source line prefix extraction + // --------------------------------------------------------------------------- + + /// Cache of script source text, keyed by script URI. + final _scriptCache = {}; + + /// Cached script list for the isolate. + List? _scriptRefs; + + /// Fetch the source line for a given file URI and line number. + /// + /// [fileUri] is the package-relative path from FLC (e.g. + /// `lib/src/counter.dart`). Internally we search for a matching Script + /// in the isolate and retrieve its source text. + /// + /// Returns `null` if the script cannot be found or the line is out of range. + Future fetchSourceLine(String fileUri, int line) async { + try { + final source = await _getScriptSource(fileUri); + if (source == null) { + return null; + } + + final lines = source.split('\n'); + if (line < 1 || line > lines.length) { + return null; + } + return lines[line - 1]; + } on Exception catch (e) { + debugPrint('[VmServiceTreeDataSource] fetchSourceLine error: $e'); + return null; + } + } + + /// Get cached script source, fetching from VM service if needed. + Future _getScriptSource(String fileUri) async { + if (_scriptCache.containsKey(fileUri)) { + return _scriptCache[fileUri]; + } + + // Find the matching ScriptRef. + _scriptRefs ??= (await _vmService.getScripts(_isolateId)).scripts ?? []; + + // FLC paths may contain relative segments like ".dart_tool/../lib/...". + // Normalize by resolving ".." and then extracting a useful suffix. + final normalized = _normalizePath(fileUri); + + // Extract the part after "lib/" — this maps to the package URI path. + // e.g. "lib/src/counter.dart" → "src/counter.dart" + // For cross-package paths, use the filename as last resort. + String suffix; + final libIdx = normalized.lastIndexOf('lib/'); + if (libIdx >= 0) { + suffix = normalized.substring(libIdx + 4); + } else { + // No "lib/" — use the filename. + suffix = normalized.split('/').last; + } + + final ref = _scriptRefs!.cast().firstWhere((s) { + final uri = s!.uri; + if (uri == null) { + return false; + } + return uri.endsWith(suffix); + }, orElse: () => null); + + if (ref == null || ref.id == null) { + debugPrint( + '[VmServiceTreeDataSource] _getScriptSource: ' + 'no script matching "$fileUri" (normalized: "$normalized", ' + 'suffix: "$suffix")', + ); + return null; + } + + final obj = await _vmService.getObject(_isolateId, ref.id!); + if (obj is Script && obj.source != null) { + _scriptCache[fileUri] = obj.source; + return obj.source!; + } + + debugPrint( + '[VmServiceTreeDataSource] _getScriptSource: ' + 'no source in script for "$fileUri"', + ); + return null; + } + + @override + Future refreshModuleTree() => evalModuleTree(); + + @override + Future dispose() async { + // Don't dispose the VM service here - caller manages its lifecycle + } + + /// Find a ROHD library in the isolate for eval. + /// + /// Uses the same cascade of patterns as [evalModuleTree] so that FLC + /// fetches work even when the inspector helpers live in a re-exported + /// or combined library. + Future _findRohdLibrary() async { + final isolate = await _vmService.getIsolate(_isolateId); + final libraries = isolate.libraries ?? []; + + // Prefer module_services, inspector_service or module_tree. + LibraryRef? ref; + for (final libRef in libraries) { + final uri = libRef.uri; + if (uri != null && + uri.contains('rohd') && + (uri.contains('module_services') || + uri.contains('inspector_service') || + uri.contains('module_tree'))) { + ref = libRef; + break; + } + } + + // Broader fallback: any ROHD-related library (matches evalModuleTree). + ref ??= libraries.cast().firstWhere((libRef) { + final uri = libRef?.uri; + if (uri == null) { + return false; + } + final lower = uri.toLowerCase(); + return lower.contains('package:rohd') || + lower.contains('/packages/rohd') || + lower.contains('rohd.dart') || + lower.contains('rohd/'); + }, orElse: () => null); + + if (ref == null) { + debugPrint( + '[VmServiceTreeDataSource] _findRohdLibrary: ' + 'no ROHD library found among ${libraries.length} libraries', + ); + } + return ref; + } + + Future _parseResult(Response result) async { + if (result is InstanceRef) { + // Get the full string - VM service truncates by default + final valueStr = await _getFullString(result); + debugPrint( + '[VmServiceTreeDataSource] Full string length: ' + '${valueStr?.length ?? 0}', + ); + if (valueStr == null) { + debugPrint('[VmServiceTreeDataSource] valueAsString is null'); + return null; + } + + try { + final treeObj = jsonDecode(valueStr) as Map; + debugPrint( + '[VmServiceTreeDataSource] Parsed JSON, status: ' + '${treeObj['status']}', + ); + + if (treeObj['status'] == 'fail') { + debugPrint( + '[VmServiceTreeDataSource] Status is fail: ' + '${treeObj['message']}', + ); + return null; + } + + // Use DesignDataAdapter which handles both hierarchy and schematic + // formats + try { + final designData = DesignDataAdapter.parseJson(treeObj); + debugPrint( + '[VmServiceTreeDataSource] Parsed as ${designData.format} ' + 'format', + ); + + if (designData.hasSchematic) { + debugPrint( + '[VmServiceTreeDataSource] Schematic data available for ' + 'visualization', + ); + _cachedSchematicJson = designData.schematicJson; + } else { + _cachedSchematicJson = null; + } + + final model = designData.hierarchy.root; + debugPrint( + '[VmServiceTreeDataSource] Successfully created TreeModel', + ); + return model; + } on FormatException catch (e) { + debugPrint('[VmServiceTreeDataSource] DesignDataAdapter failed: $e'); + return null; + } + } on Exception catch (e) { + debugPrint('[VmServiceTreeDataSource] Parse error: $e'); + return null; + } + } else if (result is ErrorRef) { + debugPrint('[VmServiceTreeDataSource] ErrorRef: ${result.message}'); + return null; + } + debugPrint( + '[VmServiceTreeDataSource] Unknown result type: ${result.runtimeType}', + ); + return null; + } + + /// Normalize a relative file path by resolving `..` segments. + /// + /// e.g. `.dart_tool/../lib/src/counter.dart` → `lib/src/counter.dart` + static String _normalizePath(String path) { + final segments = path.split('/'); + final resolved = []; + for (final seg in segments) { + if (seg == '..') { + if (resolved.isNotEmpty) { + resolved.removeLast(); + } + } else if (seg != '.' && seg.isNotEmpty) { + resolved.add(seg); + } + } + return resolved.join('/'); + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_waveform_data_source.dart b/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_waveform_data_source.dart new file mode 100755 index 0000000000..57190e7189 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/vm_service_waveform_data_source.dart @@ -0,0 +1,1068 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// vm_service_waveform_data_source.dart +// VM service-based waveform data source for DTD/debugger connection. +// Provides live waveform data from running ROHD simulations. +// +// 2026 January +// Author: Desmond Kirkpatrick + +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/waveform_data_source.dart'; +import 'package:rohd_waveform/rohd_waveform.dart'; +import 'package:vm_service/vm_service.dart'; + +/// VM service-based waveform data source for connecting to running ROHD apps. +/// +/// This connects via the Dart VM service protocol to evaluate waveform +/// retrieval expressions in the target application. It subscribes to debug +/// events to automatically fetch new waveform data when execution pauses. +/// +/// ## Usage +/// +/// ```dart +/// final vmService = await vmServiceConnectUri(wsUri); +/// final isolate = await vmService.getIsolate(isolateId); +/// +/// final dataSource = VmServiceWaveformDataSource( +/// vmService: vmService, +/// isolateId: isolateId, +/// ); +/// +/// // Get initial data (compact integer-indexed transport) +/// final waveforms = await dataSource.getWaveformDataCompact( +/// signalIndices: [0, 3, 7], +/// addressToSignalId: {'0': 'top/clk', '0.3': 'top/count', '0.7': 'top/reset'}, +/// ); +/// +/// // Listen for breakpoint-triggered updates +/// dataSource.liveUpdates?.listen((event) { +/// print('New data up to ${event.upToTime}: ${event.reason}'); +/// }); +/// ``` +/// +/// ## ROHD Integration +/// +/// This requires a corresponding `WaveformDataService` in the ROHD library +/// (parallel to `ModuleTree` for hierarchy). The service should expose: +/// +/// - `WaveformDataService.instance.getSignalsJSON(scopePath)` - Signal metadata +/// - `WaveformDataService.instance.getWaveformsJSON(signalIds, start, end)` - +/// Data +/// - `WaveformDataService.instance.getDataSinceJSON(signalIds, sinceTime)` - +/// Incremental +/// - `WaveformDataService.instance.currentTime` - Latest simulation time +class VmServiceWaveformDataSource implements WaveformDataSource { + VmService _vmService; + String _isolateId; + + /// Stream controller for pushing waveform updates to listeners. + final _updateController = StreamController.broadcast(); + + /// Subscription to VM debug events. + StreamSubscription? _debugEventSubscription; + + /// Last simulation time we've fetched data for. + int _lastFetchedTime = 0; + + /// Library reference for ROHD waveform service. + LibraryRef? _waveformLibRef; + + /// Whether we're currently connected. + bool _connected = true; + + /// Monotonic ID for compact waveform debug logs. + int _compactRequestSequence = 0; + + /// Debounce timer for breakpoint-triggered fetches (optimization B: + /// trailing-edge debounce collapses rapid breakpoints into one fetch). + Timer? _pauseDebounceTimer; + + /// Debounce duration for breakpoint events. + /// 100ms is enough to collapse bursty breakpoints while staying responsive. + static const _pauseDebounceDuration = Duration(milliseconds: 100); + + /// Whether ROHD-side service extensions (ext.rohd.*) are available. + /// When true, we use callServiceExtension() (~20ms) instead of + /// evaluate() (~650ms). Probed once on first data request. + bool? _serviceExtensionsAvailable; + + /// Signal IDs and their last fetched timepoints (for selective waveform + /// transmission). Maps signal ID -> last timepoint sent. Enables per-signal + /// incremental updates. When a signal is first tracked, use timepoint 0 to + /// fetch full history. When a signal is re-tracked after removal, resume from + /// last known timepoint. + final Map _trackedSignals = {}; + + /// Address-lookup closures pushed from the API layer so that + /// breakpoint-triggered fetches use address-keyed transport instead of + /// string signal paths. + /// + /// When non-null, [_onPause] and [resumeFetches] call + /// [getWaveformDataWithTimepointsCompact] instead of the legacy + /// string-keyed [getWaveformDataWithTimepoints]. + String? Function(String signalId)? _toAddress; + String? Function(String addressDotString)? _fromAddress; + + /// Push address-lookup closures from the API layer. + /// + /// Once set, all breakpoint-triggered fetches use the compact wire format. + /// The closures perform O(depth) tree-walk conversions via + /// the hierarchy service — no stored maps needed. + void setAddressLookups({ + required String? Function(String signalId) signalIdToAddress, + required String? Function(String addressDotString) addressToSignalId, + }) { + _toAddress = signalIdToAddress; + _fromAddress = addressToSignalId; + } + + /// When true, breakpoint-triggered data fetches are skipped but endTime + /// updates are still emitted. This lets the timeline advance (with a gray + /// gap region) without slowing the running simulation with evaluate() calls. + bool _fetchesPaused = false; + + /// Whether waveform fetches are currently paused. + bool get fetchesPaused => _fetchesPaused; + + /// Creates a new VM service waveform data source. + VmServiceWaveformDataSource({ + required VmService vmService, + required String isolateId, + }) : _vmService = vmService, + _isolateId = isolateId { + unawaited(_subscribeToDebugEvents()); + } + + /// The signal IDs currently being tracked for auto-fetch. + List get trackedSignalKeys => + _trackedSignals.keys.cast().toList(); + + @override + bool get isConnected => _connected; + + @override + String get modeDescription => 'VM Service (Live Simulation)'; + + @override + int get lastFetchedTime => _lastFetchedTime; + + @override + Stream get liveUpdates => _updateController.stream; + + /// Subscribe to VM debug events to detect breakpoints. + Future _subscribeToDebugEvents() async { + try { + await _vmService.streamListen(EventStreams.kDebug); + } on Exception { + // 'Stream already subscribed' is expected when the CSM subscribed + // first — the stream is still usable. + } + + try { + _debugEventSubscription = _vmService.onDebugEvent.listen( + _handleDebugEvent, + ); + } on Exception { + // Debug stream may not be available in all configurations + } + } + + /// Handle debug events - pull data on pause. + /// + /// Uses trailing-edge debounce: when breakpoints fire rapidly (e.g., stepping + /// through code or bursty simulation), only the final pause triggers a + /// fetch. This prevents redundant VM evaluate() calls. + void _handleDebugEvent(Event event) { + final kind = event.kind; + + // When execution pauses, debounce and fetch new waveform data + if (kind == EventKind.kPauseBreakpoint || + kind == EventKind.kPauseException || + kind == EventKind.kPauseInterrupted || + kind == EventKind.kPauseExit) { + // Cancel any pending debounce — only the latest pause matters + _pauseDebounceTimer?.cancel(); + _pauseDebounceTimer = Timer(_pauseDebounceDuration, () { + unawaited(_onPause(event)); + }); + } + } + + /// Called when debugger pauses - fetch incremental waveform data for tracked + /// signals. + /// + /// When [_fetchesPaused] is true, the expensive waveform data fetch is + /// skipped but we still get the current simulation time and emit an + /// endTime-only update so the timeline advances (with a gray gap region). + Future _onPause(Event event) async { + // NOTE: Do NOT probe or use service extensions here. + // Service extensions run on the isolate's event loop, which is blocked + // while the isolate is paused at a breakpoint. Calling them would hang + // until the user resumes. The evaluate() path works during pause because + // it uses the VM debugger's expression-evaluation engine. + // Service extension probing is handled in getModuleStructure() instead, + // which is called outside the pause context. + + // Force evaluate() path for the duration of this pause handler, + // even if getModuleStructure() previously set extensions to available. + final savedExtAvail = _serviceExtensionsAvailable; + _serviceExtensionsAvailable = false; + + try { + if (_trackedSignals.isEmpty || _fetchesPaused) { + // No tracked signals yet (reconnect in progress) or fetches + // paused: skip the expensive data fetch but update endTime so + // the timeline advances (gray gap region drawn by painters). + final currentTime = await getCurrentTime(); + if (currentTime != null && currentTime > _lastFetchedTime) { + _lastFetchedTime = currentTime; + _updateController.add( + WaveformUpdateEvent( + incrementalData: const [], + reason: WaveformUpdateReason.breakpoint, + upToTime: currentTime, + ), + ); + debugPrint( + '[WaveformDataSource] endTime updated to ' + '$currentTime (' + '${_trackedSignals.isEmpty ? "no tracked sigs" : "paused mode"})', + ); + } + return; + } + + final newData = await _fetchTrackedCompact(); + + if (newData.isNotEmpty) { + // Update per-signal timepoints based on returned data + for (final wf in newData) { + final endTime = wf.endTime; + if (endTime != null) { + _trackedSignals[wf.signalId] = endTime; + } + } + + // Update last fetched time from the new data + for (final waveform in newData) { + final endTime = waveform.endTime; + if (endTime != null && endTime > _lastFetchedTime) { + _lastFetchedTime = endTime; + } + } + + _updateController.add( + WaveformUpdateEvent( + incrementalData: newData, + reason: WaveformUpdateReason.breakpoint, + upToTime: _lastFetchedTime, + ), + ); + debugPrint( + '[WaveformDataSource] endTime updated to ' + '$_lastFetchedTime (from waveform data)', + ); + } else { + // No new waveform data (e.g. all constant signals) but the + // simulation time may still have advanced. Fetch the current + // time and emit an endTime-only update so the timeline advances. + final currentTime = await getCurrentTime(); + if (currentTime != null && currentTime > _lastFetchedTime) { + _lastFetchedTime = currentTime; + _updateController.add( + WaveformUpdateEvent( + incrementalData: const [], + reason: WaveformUpdateReason.breakpoint, + upToTime: currentTime, + ), + ); + debugPrint( + '[WaveformDataSource] endTime updated to ' + '$currentTime (from getCurrentTime, no waveform data)', + ); + } + } + } on Exception { + // Isolate paused but unable to fetch waveform data + } finally { + _serviceExtensionsAvailable = savedExtAvail; + } + } + + /// Fetch the current simulation time and emit an endTime-only update. + /// + /// Call this after establishing a VM connection so the timeline shows + /// the real simulation time immediately, even before any breakpoint + /// fires. Also useful when the isolate is already paused at connect + /// time (no new pause event will arrive to trigger [_onPause]). + Future fetchAndEmitCurrentTime() async { + final currentTime = await getCurrentTime(); + if (currentTime != null && currentTime > _lastFetchedTime) { + _lastFetchedTime = currentTime; + _updateController.add( + WaveformUpdateEvent( + incrementalData: const [], + reason: WaveformUpdateReason.breakpoint, + upToTime: currentTime, + ), + ); + debugPrint( + '[WaveformDataSource] endTime updated to ' + '$currentTime (initial fetch on connect)', + ); + } + } + + /// Pause waveform data fetches while keeping the VM connection alive. + /// + /// Debug event subscriptions remain active so [_onPause] still fires and + /// emits endTime-only updates—the timeline advances but no expensive + /// evaluate() calls are made. Call [resumeFetches] to resume. + void pauseFetches() { + _fetchesPaused = true; + } + + /// Resume waveform data fetches and immediately pull any data that + /// accumulated while fetches were paused. + /// + /// If there are tracked signals and the VM is connected, this triggers + /// an incremental fetch so the gray gap region gets replaced with real + /// waveform data. + Future resumeFetches() async { + _fetchesPaused = false; + if (_trackedSignals.isEmpty || !_connected) { + return; + } + + // Force evaluate() — the VM may still be paused at a breakpoint. + final savedExtAvail = _serviceExtensionsAvailable; + _serviceExtensionsAvailable = false; + + try { + final newData = await _fetchTrackedCompact(); + + if (newData.isNotEmpty) { + for (final wf in newData) { + final endTime = wf.endTime; + if (endTime != null) { + _trackedSignals[wf.signalId] = endTime; + } + } + for (final waveform in newData) { + final endTime = waveform.endTime; + if (endTime != null && endTime > _lastFetchedTime) { + _lastFetchedTime = endTime; + } + } + _updateController.add( + WaveformUpdateEvent( + incrementalData: newData, + reason: WaveformUpdateReason.breakpoint, + upToTime: _lastFetchedTime, + ), + ); + } + } on Exception { + // Failed to fetch on resume — next breakpoint will try again + } finally { + _serviceExtensionsAvailable = savedExtAvail; + } + } + + /// Fetch incremental waveform data for [_trackedSignals] using the compact + /// address-keyed transport when address lookups are available, falling back + /// to the legacy string-keyed transport otherwise. + Future> _fetchTrackedCompact() { + final toAddr = _toAddress; + final fromAddr = _fromAddress; + + if (toAddr != null && fromAddr != null) { + // Build temporary compact maps for this request only. + final compactMap = {}; + final addrToId = {}; + for (final entry in _trackedSignals.entries) { + final addr = toAddr(entry.key); + if (addr != null) { + compactMap[addr] = entry.value; + addrToId[addr] = entry.key; + } + } + if (compactMap.isNotEmpty) { + return getWaveformDataWithTimepointsCompact( + signalTimepoints: compactMap, + addressToSignalId: addrToId, + ); + } + } + + // Fallback: index maps not yet available (e.g. first connect before + // dictionary is built). + return getWaveformDataWithTimepoints( + signalTimepoints: _trackedSignals.cast(), + ); + } + + /// Find the ROHD waveform service library. + Future _findWaveformLibrary() async { + if (_waveformLibRef != null) { + return _waveformLibRef; + } + + try { + final isolate = await _vmService.getIsolate(_isolateId); + final libraries = isolate.libraries ?? []; + + // First, look for a library that explicitly has 'waveform_service' in its + // name + for (final libRef in libraries) { + final uri = libRef.uri; + if (uri != null && uri.contains('waveform_service')) { + _waveformLibRef = libRef; + return libRef; + } + } + + // Fall back to inspector_service (which might import waveform_service) + for (final libRef in libraries) { + final uri = libRef.uri; + if (uri != null && uri.contains('inspector_service')) { + _waveformLibRef = libRef; + return libRef; + } + } + + // Broader fallback: match any likely ROHD library (package or path + // patterns). This helps in test harnesses where files are re-exported + // or combined into different libraries. + for (final libRef in libraries) { + final uri = libRef.uri; + if (uri == null) { + continue; + } + final lower = uri.toLowerCase(); + if (lower.contains('package:rohd') || + lower.contains('/packages/rohd') || + lower.contains('rohd.dart') || + lower.contains('rohd/')) { + _waveformLibRef = libRef; + return libRef; + } + } + } on Exception { + // Unable to find waveform library + } + return null; + } + + /// Evaluate an expression in the ROHD waveform service. + Future _evaluate(String expression) async { + final libRef = await _findWaveformLibrary(); + if (libRef == null || libRef.id == null) { + return null; + } + + try { + final result = await _vmService.evaluate( + _isolateId, + libRef.id!, + expression, + ); + + if (result is InstanceRef) { + // Check if string is truncated - VM service truncates at ~128 chars + if (result.valueAsStringIsTruncated ?? false) { + return await _getFullString(result.id!); + } + return result.valueAsString; + } + + // Check if result is an error response + if (result is ErrorRef) { + // Evaluation failed silently + } + return null; + } on Exception catch (e) { + final errorStr = e.toString(); + + // Check if the error is about WaveformService not being in scope + if (errorStr.contains('Undefined name') && + errorStr.contains('WaveformService')) { + // Try to evaluate in the main/global library scope + try { + final isolate = await _vmService.getIsolate(_isolateId); + final libs = isolate.libraries ?? []; + + // Look for 'dart:main' or the application's main library + LibraryRef? mainLib; + for (final lib in libs) { + final uri = lib.uri; + if (uri == 'dart:main' || uri == 'dart:_main') { + mainLib = lib; + break; + } + // Also try first non-package, non-dart library + if (mainLib == null && + uri != null && + !uri.startsWith('dart:') && + !uri.startsWith('package:')) { + mainLib = lib; + } + } + + if (mainLib != null && mainLib.id != null) { + final retryResult = await _vmService.evaluate( + _isolateId, + mainLib.id!, + expression, + ); + + if (retryResult is InstanceRef) { + if (retryResult.valueAsStringIsTruncated ?? false) { + return await _getFullString(retryResult.id!); + } + return retryResult.valueAsString; + } + } + } on Exception { + // Silently fail retry + } + } + + // For non-WaveformService errors, log them + return null; + } + } + + // ───────────────────────────────────────────────────────────────────────── + // Service Extension fast path (optimization F) + // ───────────────────────────────────────────────────────────────────────── + + /// Call a ROHD service extension, returning the JSON string result. + /// + /// Returns `null` if the extension is not available or returns an error. + /// + /// When [resultKey] is provided, extracts just that key from the response + /// JSON and re-encodes it. This is needed because + /// `ServiceExtensionResponse.result()` requires a JSON *object* string, + /// so array results are wrapped in `{"data": [...]}` on the ROHD side. + Future _callExtension( + String method, [ + Map? args, + String? resultKey, + ]) async { + try { + final response = await _vmService.callServiceExtension( + method, + isolateId: _isolateId, + args: args, + ); + final json = response.json; + if (json == null) { + return null; + } + + // Extract a specific key if requested (e.g. 'data' for array results + // wrapped in {"data": [...]} on the ROHD side). + if (resultKey != null) { + final value = json[resultKey]; + if (value == null) { + return null; + } + return jsonEncode(value); + } + + // Default: re-encode the entire response map. + return jsonEncode(json); + } on Exception { + // Mark extensions as unavailable so we fall back for future calls + _serviceExtensionsAvailable = false; + return null; + } + } + + /// Fetch the full string value when VM service truncates it. + Future _getFullString(String objectId) async { + try { + final obj = await _vmService.getObject(_isolateId, objectId); + if (obj is Instance && obj.valueAsString != null) { + return obj.valueAsString; + } + } on Exception { + return null; + } + return null; + } + + /// Request a full garbage collection on the connected isolate. + /// + /// This triggers `getAllocationProfile(gc: true)` which forces a major GC. + /// Intended to be called once after initial dictionary/structure loading + /// to clean up allocation debris before waveform data starts flowing. + Future requestGarbageCollection() async { + try { + await _vmService.getAllocationProfile(_isolateId, gc: true); + } on Exception catch (_) { + // GC request is best-effort; ignore failures + } + } + + // ── Legacy string-path stubs (interface obligation) ─────────────────── + // These exist only to satisfy the abstract WaveformDataSource contract. + // The VM data source always uses the compact integer-indexed transport + // (getWaveformDataCompact / getWaveformDataWithTimepointsCompact). + + @override + Future> getWaveformData({ + required List signalIds, + int? startTime, + int? endTime, + }) async => + const []; + + @override + Future> getWaveformDataSince({ + required List signalIds, + required int sinceTime, + }) async => + const []; + + /// Fetch waveform data using per-signal timepoints for selective + /// transmission. + /// + /// This method enables handshaking which signals are being displayed in + /// DevTools. Each signal can have a different last-fetched timepoint, + /// allowing: + /// - Reduced bandwidth: only displayed signals are queried + /// - Graceful add/remove: new signals fetch from timepoint 0, removed signals + /// resume from their last timepoint if re-added + /// - Per-signal incremental updates: each signal advances independently + /// + /// [signalTimepoints] is a `Map` tracking the last + /// timepoint sent to DevTools for each signal. + @override + Future> getWaveformDataWithTimepoints({ + required Map signalTimepoints, + }) async { + if (signalTimepoints.isEmpty) { + return []; + } + + // Batch signals to avoid massive VM service expressions + const batchSize = 50; + final allResults = []; + final signalIds = signalTimepoints.keys.toList(); + + for (var i = 0; i < signalIds.length; i += batchSize) { + final batchSignalIds = signalIds.sublist( + i, + (i + batchSize < signalIds.length) ? i + batchSize : signalIds.length, + ); + + // Build timepoint map for this batch + final batchTimepoints = {}; + for (final signalId in batchSignalIds) { + batchTimepoints[signalId] = signalTimepoints[signalId]!; + } + + final batchResults = await _getWaveformDataWithTimepointsBatch( + batchTimepoints, + ); + allResults.addAll(batchResults); + } + + // Update global last fetched time for reference + for (final waveform in allResults) { + if (waveform.endTime != null && waveform.endTime! > _lastFetchedTime) { + _lastFetchedTime = waveform.endTime!; + } + } + + return allResults; + } + + /// Internal helper to fetch waveform data for a batch with per-signal + /// timepoints. + Future> _getWaveformDataWithTimepointsBatch( + Map signalTimepoints, + ) async { + final timepointsJson = jsonEncode(signalTimepoints); + + // Try service extension fast path first + String? jsonStr; + if (_serviceExtensionsAvailable ?? false) { + jsonStr = await _callExtension( + 'ext.rohd.waveformDataWithTimepoints', + { + 'signalTimepointsJson': timepointsJson, + }, + 'data'); + } + + // Fallback to evaluate() + if (jsonStr == null) { + final escapedJson = + timepointsJson.replaceAll(r'\', r'\\').replaceAll("'", r"\'"); + final expression = 'WaveformDataService.instance' + ".getDataWithTimepointsJSON('$escapedJson')"; + jsonStr = await _evaluate(expression); + } + + if (jsonStr == null) { + return []; + } + + try { + final jsonList = jsonDecode(jsonStr) as List; + return jsonList + .map((e) => WaveformData.fromJson(e as Map)) + .toList(); + } on Exception { + return []; + } + } + + /// Stop tracking a signal for auto-fetch. + /// Note: The last fetched timepoint is retained; if the signal is re-tracked, + /// it will resume from this timepoint. + void untrackSignal(String signalId) { + _trackedSignals.remove(signalId); + } + + /// Explicitly start tracking a signal for auto-fetch on breakpoints. + /// + /// If the signal is already tracked, its timepoint is preserved. + /// If not, it starts with timepoint -1 to capture full history + /// (ROHD filters with `c.time > sinceTime`, so -1 ensures time-0 + /// data is included). + void trackSignal(String signalId) { + _trackedSignals.putIfAbsent(signalId, () => -1); + } + + /// Stop tracking all signals. + /// Note: Timepoints are cleared; signals must be re-added to track again. + void untrackAllSignals() { + _trackedSignals.clear(); + } + + /// Get the last timepoint fetched for a tracked signal. + /// Returns -1 if signal is not tracked or is newly added. + int getLastTrackedTimepoint(String signalId) => + _trackedSignals[signalId] ?? -1; + + /// Get the current simulation endpoint time. + /// + /// Calls the ROHD-side WaveformService.currentTime to get the latest + /// simulation time. This can be polled periodically to monitor progress. + /// + /// Uses service extension if available (~16ms), falls back to evaluate() + /// (~450ms) if extensions are not yet available. + /// + /// Returns the current simulation time, or null if unavailable. + @override + Future getCurrentTime() async { + if (!_connected) { + return null; + } + + try { + // Try service extension first (if we've already probed and found it + // available) + String? jsonStr; + if (_serviceExtensionsAvailable ?? false) { + jsonStr = await _callExtension('ext.rohd.currentTime'); + } else { + jsonStr = null; + } + + // Fall back to evaluate() if extension not available + jsonStr ??= await _evaluate('WaveformDataService.instance.currentTime'); + + if (jsonStr == null) { + return null; + } + + // Parse the result - may be a bare integer (evaluate path) + // or {"currentTime": } (service extension path). + final result = jsonDecode(jsonStr); + if (result is int) { + return result; + } + if (result is Map && result['currentTime'] is int) { + return result['currentTime'] as int; + } + + return null; + } on Exception { + // Unable to get current time + return null; + } + } + + // String-keyed getSnapshot() removed — was dead code. + // The compact path (getSnapshotCompact) is the only active snapshot + // endpoint; the VmServiceSignalWaveformApi never calls getSnapshot(). + @override + Future>?> getSnapshot(int time) async => + throw UnimplementedError( + 'Use getSnapshotCompact() instead — string-keyed snapshot removed', + ); + + // Server-side getSignalDictionaryJSON() removed — dictionary is derived + // locally from the HierarchyOccurrence tree in ModuleStructure. + @override + Future>?> getSignalDictionary() async => + throw UnimplementedError( + 'Dictionary is derived locally from ModuleStructure', + ); + + /// Get a compact snapshot: integer-keyed values only. + /// + /// Uses `ext.rohd.snapshotCompact` (fast path) or falls back to + /// `evaluate('WaveformDataService.instance.getSnapshotCompactJSON(time)')`. + @override + Future?> getSnapshotCompact(int time) async { + if (!_connected) { + return null; + } + + try { + String? jsonStr; + + if (_serviceExtensionsAvailable ?? false) { + jsonStr = await _callExtension('ext.rohd.snapshotCompact', { + 'time': time.toString(), + }); + } + + jsonStr ??= await _evaluate( + 'WaveformDataService.instance.getSnapshotCompactJSON($time)', + ); + + if (jsonStr == null) { + return null; + } + + return jsonDecode(jsonStr) as Map; + } on Exception { + return null; + } + } + + /// Get compact waveform data using address strings. + /// + /// Uses `ext.rohd.waveformDataCompact` (fast path) or falls back to + /// `evaluate('WaveformDataService.instance.getWaveformsCompactJSON(...)')`. + @override + Future> getWaveformDataCompact({ + required List signalAddresses, + required Map addressToSignalId, + int? startTime, + int? endTime, + }) async { + final requestId = ++_compactRequestSequence; + if (!_connected) { + debugPrint( + '[VmWaveform][$requestId] compact request skipped: disconnected', + ); + return []; + } + + final addressesJson = jsonEncode(signalAddresses); + final start = startTime ?? 0; + final end = endTime ?? -1; + + debugPrint( + '[VmWaveform][$requestId] compact request: ' + '${signalAddresses.length} addresses, range=$start..$end, ' + 'extensions=${_serviceExtensionsAvailable ?? "unknown"}, ' + 'sample=${signalAddresses.take(5).join(", ")}', + ); + + String? jsonStr; + if (_serviceExtensionsAvailable ?? false) { + jsonStr = await _callExtension( + 'ext.rohd.waveformDataCompact', + { + 'signalIndicesJson': addressesJson, + 'startTime': start.toString(), + 'endTime': end.toString(), + }, + 'data'); + debugPrint( + '[VmWaveform][$requestId] extension compact response: ' + '${jsonStr == null ? "null" : "${jsonStr.length} chars"}', + ); + } + + jsonStr ??= await _evaluate( + 'WaveformDataService.instance.getWaveformsCompactJSON(' + "'$addressesJson', $start, $end)", + ); + + if (jsonStr == null) { + debugPrint('[VmWaveform][$requestId] compact response is null'); + return []; + } + + final parsed = _parseCompactWaveformData(jsonStr, addressToSignalId); + final pointCount = parsed.fold( + 0, + (total, waveform) => total + waveform.data.length, + ); + debugPrint( + '[VmWaveform][$requestId] compact parsed: ' + '${parsed.length} waveforms / $pointCount points', + ); + return parsed; + } + + /// Get compact incremental waveform data with per-signal timepoints. + /// + /// Uses `ext.rohd.waveformDataWithTimepointsCompact` (fast path) or + /// falls back to evaluate. + @override + Future> getWaveformDataWithTimepointsCompact({ + required Map signalTimepoints, + required Map addressToSignalId, + }) async { + final requestId = ++_compactRequestSequence; + if (!_connected) { + debugPrint( + '[VmWaveform][$requestId] compact timepoint request skipped: ' + 'disconnected', + ); + return []; + } + + final timepointsJson = jsonEncode(signalTimepoints); + + debugPrint( + '[VmWaveform][$requestId] compact timepoint request: ' + '${signalTimepoints.length} addresses, ' + 'extensions=${_serviceExtensionsAvailable ?? "unknown"}, ' + 'sample=${signalTimepoints.keys.take(5).join(", ")}', + ); + + String? jsonStr; + if (_serviceExtensionsAvailable ?? false) { + jsonStr = await _callExtension( + 'ext.rohd.waveformDataWithTimepointsCompact', + {'signalTimepointsJson': timepointsJson}, + 'data', + ); + debugPrint( + '[VmWaveform][$requestId] extension compact timepoint response: ' + '${jsonStr == null ? "null" : "${jsonStr.length} chars"}', + ); + } + + jsonStr ??= await _evaluate( + 'WaveformDataService.instance.getDataWithTimepointsCompactJSON(' + "'$timepointsJson')", + ); + + if (jsonStr == null) { + debugPrint('[VmWaveform][$requestId] compact timepoint response is null'); + return []; + } + + final parsed = _parseCompactWaveformData(jsonStr, addressToSignalId); + final pointCount = parsed.fold( + 0, + (total, waveform) => total + waveform.data.length, + ); + debugPrint( + '[VmWaveform][$requestId] compact timepoint parsed: ' + '${parsed.length} waveforms / $pointCount points', + ); + return parsed; + } + + /// Parse compact waveform JSON `[{"i": "0.2.4", "d": [{"t": .., "v": ..}]}]` + /// back into [WaveformData] objects with full signal IDs. + List _parseCompactWaveformData( + String jsonStr, + Map addressToSignalId, + ) { + try { + final jsonList = jsonDecode(jsonStr) as List; + final result = []; + var unmappedCount = 0; + + for (final item in jsonList) { + final map = item as Map; + final addr = map['i'] as String; + final signalId = addressToSignalId[addr]; + if (signalId == null) { + unmappedCount++; + continue; + } + + final rawData = map['d'] as List; + final dataPoints = rawData.map((d) { + final dp = d as Map; + return Data(time: dp['t'] as int, value: dp['v'].toString()); + }).toList(); + + result.add(WaveformData(signalId: signalId, data: dataPoints)); + } + + if (unmappedCount > 0) { + debugPrint( + '[VmWaveform] compact parse skipped $unmappedCount unmapped ' + 'addresses from ${jsonList.length} rows', + ); + } + + return result; + } on Exception catch (e) { + debugPrint('[VmWaveform] compact parse error: $e'); + return []; + } + } + + /// Swap the underlying VM service and isolate without destroying + /// tracked-signal state. Used by pause/resume and lightweight + /// reconnect flows in the standalone shell. + /// + /// When [preserveTracking] is true (default), the tracked signal map + /// is kept intact so an incremental pull can fetch data produced while + /// the WebSocket was disconnected. When false, tracking is cleared. + Future reconnect( + VmService vmService, + String isolateId, { + bool preserveTracking = false, + }) async { + // Cancel old debug-event subscription before swapping. + await _debugEventSubscription?.cancel(); + _debugEventSubscription = null; + + _vmService = vmService; + _isolateId = isolateId; + _connected = true; + _waveformLibRef = null; + _serviceExtensionsAvailable = null; + + if (!preserveTracking) { + _trackedSignals.clear(); + } + + // Re-subscribe to debug events on the new VM service. + unawaited(_subscribeToDebugEvents()); + } + + @override + Future dispose() async { + _connected = false; + _pauseDebounceTimer?.cancel(); + await _debugEventSubscription?.cancel(); + await _updateController.close(); + _trackedSignals.clear(); + // Don't dispose the VM service here - caller manages its lifecycle + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/waveform_data_source.dart b/rohd_devtools_extension/lib/rohd_devtools/services/waveform_data_source.dart new file mode 100644 index 0000000000..c50d78bc66 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/waveform_data_source.dart @@ -0,0 +1,180 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// waveform_data_source.dart +// Abstract interface for waveform data sources. +// Enables switching between DTD/VM connection and loopback modes for waveforms. +// +// 2026 January +// Author: Desmond Kirkpatrick + +import 'package:rohd_waveform/rohd_waveform.dart'; + +// Re-export WaveformUpdateEvent and WaveformUpdateReason from rohd_waveform +export 'package:rohd_waveform/rohd_waveform.dart' + show WaveformUpdateEvent, WaveformUpdateReason; + +/// Abstract interface for obtaining waveform data. +/// +/// This parallels `TreeDataSource` but for waveform data instead of hierarchy. +/// Implementations can connect to: +/// - A live ROHD simulation via VM Service (VmServiceWaveformDataSource) +/// - A live ROHD simulation in-process (InProcessWaveformDataSource) +/// - VCD/GHW files via Wellen (WellenBackedWaveformDataSource) +/// +/// Module structure (hierarchy, ports, signals) is NOT provided by this +/// interface — it comes through the rohd_hierarchy / TreeDataSource path. +abstract class WaveformDataSource { + /// Whether this data source is currently connected/ready. + bool get isConnected; + + /// Human-readable description of the data source mode. + String get modeDescription; + + /// The last simulation time for which we have complete data. + int get lastFetchedTime; + + /// Get waveform data for specified signals. + /// + /// [signalIds] - List of signal IDs to fetch data for. + /// [startTime] - Start of time range (inclusive). + /// [endTime] - End of time range (inclusive). + /// + /// Returns a list of [WaveformData] objects, one per signal. + Future> getWaveformData({ + required List signalIds, + int? startTime, + int? endTime, + }); + + /// Get incremental waveform data since the last fetch. + /// + /// [signalIds] - List of signal IDs to fetch data for. + /// [sinceTime] - Fetch data from this time onwards. + /// + /// This is the primary method for incremental updates when simulation + /// is running and hits breakpoints. + Future> getWaveformDataSince({ + required List signalIds, + required int sinceTime, + }); + + /// Get incremental waveform data using per-signal timepoints. + /// + /// [signalTimepoints] - Map of signal ID to last fetched timepoint. + /// + /// This enables selective signal transmission where each signal can have + /// a different last-fetched timepoint. Useful for: + /// - Lazy loading: only fetch signals being displayed in UI + /// - Dynamic signal addition: new signals start from timepoint 0 + /// - Independent signal advancement: each signal progresses at its own pace + /// + /// Returns only data points AFTER each signal's last timepoint. + Future> getWaveformDataWithTimepoints({ + required Map signalTimepoints, + }); + + /// Stream of live waveform updates (for event-driven sources). + /// + /// Returns null if this source doesn't support live updates + /// (e.g., static file sources). + /// + /// For VM Service sources, this stream emits events when: + /// - Debugger pauses at a breakpoint + /// - Simulation completes + /// - Manual refresh is requested + Stream? get liveUpdates; + + /// Get the current simulation endpoint time. + /// + /// For VM service sources, this polls the running ROHD app to get the + /// current simulation time (from WaveformService.currentTime). + /// For loopback sources, this returns the current simulated time. + /// + /// This can be polled periodically (every 100-200ms) to monitor + /// simulation progress and update the waveform display end time + /// dynamically without waiting for breakpoints. + /// + /// Returns the current endpoint time, or null if unavailable. + Future getCurrentTime(); + + /// Get a snapshot of all signal values at the given [time]. + /// + /// Returns a map of signal ID to a map containing: + /// - `value`: the signal value at that time (String) + /// - `name`: signal display name + /// - `width`: signal bit width + /// - `direction`: signal direction (if port) + /// + /// Returns null if the snapshot could not be retrieved. + Future>?> getSnapshot(int time); + + // ───────────────────────────────────────────────────────────────────────── + // SignalOccurrence Dictionary & Compact Transport + // + // Uses dot-separated OccurrenceAddress strings instead of full + // signal-path strings in JSON payloads, reducing size significantly + // while remaining stable across slim/full netlist transitions. + // + // The VmServiceSignalWaveformApi derives the address dictionary + // locally from the HierarchyOccurrence tree provided via + // setExternalStructure(). Both sides build the same tree from the + // slim JSON, so the addresses agree. The getSignalDictionary() + // method below is retained for loopback/file-backed sources that + // may not have a HierarchyOccurrence tree. + // ───────────────────────────────────────────────────────────────────────── + + /// Fetch the signal dictionary from the ROHD side. + /// + /// Returns a list of entries, each containing: + /// - `i`: integer index + /// - `id`: full signal path (String) + /// - `name`: display name + /// - `width`: bit width + /// - `direction`: input/output/internal + /// + /// The dictionary is static for the lifetime of a simulation and should + /// be cached by the consumer. Returns null if unavailable. + /// + /// Note: the VM-service waveform API no longer calls this method — it + /// derives the dictionary from the module structure instead. This + /// method remains for other data sources (loopback, file-backed). + Future>?> getSignalDictionary(); + + /// Get a compact snapshot: address-keyed values only. + /// + /// Requires that the consumer has built its address dictionary so it + /// can resolve address keys back to signal IDs. + /// + /// Returns a map: `{ 'time': int, 'v': { '0.2.4': 'val', ... } }` + /// or null if unavailable. + Future?> getSnapshotCompact(int time); + + /// Get compact waveform data using address strings. + /// + /// [signalAddresses] — dot-separated OccurrenceAddress strings. + /// [startTime], [endTime] — time range (endTime -1 = current). + /// + /// Returns a list of compact waveform entries: + /// `[{ 'i': '0.2.4', 'd': [{'t': 100, 'v': '1'}, ...] }, ...]` + Future> getWaveformDataCompact({ + required List signalAddresses, + required Map addressToSignalId, + int? startTime, + int? endTime, + }); + + /// Get compact incremental waveform data with per-signal timepoints. + /// + /// [signalTimepoints] — map of address string → last timepoint. + /// [addressToSignalId] — reverse lookup from dictionary. + /// + /// Returns a list of [WaveformData] with signal IDs restored. + Future> getWaveformDataWithTimepointsCompact({ + required Map signalTimepoints, + required Map addressToSignalId, + }); + + /// Dispose any resources held by this data source. + Future dispose(); +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/waveform_signal_value_source.dart b/rohd_devtools_extension/lib/rohd_devtools/services/waveform_signal_value_source.dart new file mode 100644 index 0000000000..bd7a8cebda --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/waveform_signal_value_source.dart @@ -0,0 +1,43 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// waveform_signal_value_source.dart +// Waveform-backed adapter for the shared signal value source interface. +// +// 2026 June +// Author: Desmond Kirkpatrick + +import 'package:rohd_devtools_extension/rohd_devtools/services/signal_value_source.dart'; +import 'package:rohd_waveform/rohd_waveform.dart'; + +/// Adapter exposing a [SignalWaveformApi] through [SignalValueSource]. +class WaveformSignalValueSource implements SignalValueSource { + /// The wrapped waveform API. + final SignalWaveformApi api; + + final Stream? _updates; + + /// Creates an adapter around [api]. + WaveformSignalValueSource({ + required this.api, + Stream? liveUpdates, + }) : _updates = liveUpdates?.map(_mapWaveformUpdateEvent); + + @override + Stream? get updates => _updates; + + @override + Future getCurrentTime() => api.getCurrentTime(); + + @override + Future getSnapshot(int time) => api.getSnapshot(time); + + static SignalValueUpdateEvent _mapWaveformUpdateEvent( + WaveformUpdateEvent event, + ) => + SignalValueUpdateEvent( + upToTime: event.upToTime, + hasData: event.hasData, + reason: event.reason.name, + ); +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/web_vm_connection_strategy.dart b/rohd_devtools_extension/lib/rohd_devtools/services/web_vm_connection_strategy.dart index 535aff769f..d5bc597a02 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/services/web_vm_connection_strategy.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/services/web_vm_connection_strategy.dart @@ -11,7 +11,7 @@ import 'dart:async'; import 'package:logging/logging.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/ui/ui.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/vm_connection_strategy.dart'; import 'package:vm_service/vm_service.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; diff --git a/rohd_devtools_extension/lib/rohd_devtools/services/wellen_backed_waveform_data_source.dart b/rohd_devtools_extension/lib/rohd_devtools/services/wellen_backed_waveform_data_source.dart new file mode 100644 index 0000000000..09d638914e --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/services/wellen_backed_waveform_data_source.dart @@ -0,0 +1,522 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// wellen_backed_waveform_data_source.dart +// WaveformDataSource backed by a Wellen-parsed VCD/FST/GHW file. +// +// This parallels what ROHD's WaveDumper + WaveformService do on the sim side: +// the VCD is parsed into an in-process waveform repository, and the existing +// API chain (LoopbackSignalWaveformApi → EmbeddedWaveViewer → UI) +// queries it exactly as it would query the remote WaveformService. +// +// When a design hierarchy (from JSON) has already been loaded, the hierarchy +// is used as the structural source of truth — richer than VCD scopes alone +// because it carries port directions, types, and connectivity. VCD signals +// are matched to hierarchy signals by full path. +// +// 2026 March +// Author: Desmond Kirkpatrick + +import 'dart:async'; + +import 'package:dart_wellen/dart_wellen.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/rohd_service_transport.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/waveform_data_source.dart'; +import 'package:rohd_hierarchy/rohd_hierarchy.dart' + show BaseHierarchyAdapter, OccurrenceAddress; +import 'package:rohd_waveform/rohd_waveform.dart'; + +/// A waveform data source backed by a Wellen-parsed waveform file. +/// +/// Acts as the local equivalent of ROHD's `WaveformService`: it holds the +/// parsed waveform data in memory and serves it through the same +/// waveform-data-source interface that the loopback API consumes. +/// +/// This allows the wave viewer to treat a loaded VCD file identically to a +/// live ROHD simulation — the transport layer is hidden. +/// +/// ## Usage +/// +/// ```dart +/// final wellenApi = WellenSignalWaveformApi(); +/// await wellenApi.loadBytes(vcdBytes, fileName: 'design.vcd'); +/// +/// final dataSource = WellenBackedWaveformDataSource( +/// wellenApi: wellenApi, +/// designHierarchy: existingHierarchyService, // optional +/// ); +/// +/// // Plug into the existing loopback chain: +/// final api = LoopbackSignalWaveformApi(dataSource); +/// ``` +class WellenBackedWaveformDataSource + implements WaveformDataSource, RohdServiceTransport { + /// The Wellen API that parsed the VCD/FST/GHW file. + final WellenSignalWaveformApi _wellenApi; + + /// Optional design hierarchy (from JSON) — provides richer signal metadata + /// than VCD scopes alone (port directions, types, connectivity). + final HierarchyService? _designHierarchy; + + /// Cached module structure from the wellen API. + ModuleStructure? _cachedStructure; + + /// Cached hierarchy service built from the waveform structure. + HierarchyService? _cachedHierarchyService; + + /// Whether this data source is active. + bool _isRunning = true; + + /// Last fetched time. + int _lastFetchedTime = 0; + + /// Controller for update events (static files don't emit, but the + /// interface requires it). + final _updateController = StreamController.broadcast(); + + // ─── SignalOccurrence Dictionary & Compact Transport ─── + List>? _cachedDictionary; + Map? _cachedIdToIndex; + + /// Optional name for display. + final String name; + + /// Creates a waveform data source backed by a Wellen-parsed file. + /// + /// [wellenApi] must already have been loaded (via `loadFile` or `loadBytes`). + /// [designHierarchy] is the hierarchy from the design JSON, if available. + /// When provided, signals from VCD are matched to hierarchy signals so that + /// port directions, types, and other metadata are preserved. + WellenBackedWaveformDataSource({ + required WellenSignalWaveformApi wellenApi, + HierarchyService? designHierarchy, + this.name = 'VCD File', + }) : assert( + wellenApi.isLoaded, + 'WellenSignalWaveformApi must be loaded first', + ), + _wellenApi = wellenApi, + _designHierarchy = designHierarchy; + + @override + bool get isConnected => _isRunning && _wellenApi.isLoaded; + + @override + String get modeDescription => 'Wellen File ($name)'; + + @override + int get lastFetchedTime => _lastFetchedTime; + + @override + Stream get liveUpdates => _updateController.stream; + + // ───────────────────────────────────────────────────────────────────────── + // Module Structure + // ───────────────────────────────────────────────────────────────────────── + + /// Load module structure from the Wellen API (VCD/FST/GHW file). + /// + /// This is used internally for signal enumeration and enrichment. + /// Module structure is NOT served through the waveform data source + /// interface — it reaches the UI via the rohd_hierarchy path. + Future _loadStructure() async { + if (!_isRunning) { + return null; + } + if (_cachedStructure != null) { + return _cachedStructure; + } + + // Get the structure from Wellen (includes VCD scope tree + signals) + final wellenStructure = await _wellenApi.getModuleStructureOnly(); + + if (_designHierarchy != null) { + _enrichWithDesignHierarchy(wellenStructure); + } + + _cachedStructure = wellenStructure; + _lastFetchedTime = wellenStructure.metadata.endTime; + return wellenStructure; + } + + /// Public accessor for the cached structure (used by the shell to + /// push hierarchy into the cubit when loading VCD files). + ModuleStructure? get cachedStructure => _cachedStructure; + + /// Enrich VCD-derived signals with metadata from the design hierarchy. + /// + /// VCD scopes provide signal names and widths, but not port directions + /// or module types. The design hierarchy (from JSON) has this richer + /// metadata. We walk the Wellen module tree and for each signal, + /// look up the matching signal in the design hierarchy by full path. + void _enrichWithDesignHierarchy(ModuleStructure structure) { + structure.modules.forEach(_enrichNode); + } + + void _enrichNode(HierarchyOccurrence node) { + for (var i = 0; i < node.signals.length; i++) { + final signal = node.signals[i]; + final path = signal.path(); + final designSignal = _resolveSignal(_designHierarchy, path); + if (designSignal != null && + designSignal.direction != null && + designSignal.direction != 'inout' && + (signal.direction == null || signal.direction == 'inout')) { + // Replace in-place with a Port carrying the authoritative direction. + // The Wellen adapter creates all signals as SignalOccurrence. + node.signals[i] = SignalOccurrence( + name: signal.name, + width: signal.width, + direction: designSignal.direction, + ); + } + } + node.children.forEach(_enrichNode); + } + + HierarchyService? _getHierarchyService() { + // Prefer the design hierarchy if available + if (_designHierarchy != null) { + return _designHierarchy; + } + + if (_cachedHierarchyService != null) { + return _cachedHierarchyService; + } + + final structure = _cachedStructure; + if (structure == null || structure.modules.isEmpty) { + return null; + } + + return _cachedHierarchyService = BaseHierarchyAdapter.fromTree( + structure.modules.first, + ); + } + + // ───────────────────────────────────────────────────────────────────────── + // Waveform Data — selected signals are loaded from Wellen on demand + // ───────────────────────────────────────────────────────────────────────── + + /// Reads just [signalIds] from Wellen, preserving file-backed lazy loading. + /// + /// In particular, Wellen's FST source retains unopened signals on disk until + /// a viewport, CLI command, or snapshot actually asks for them. + Future> _loadWaveforms( + List signalIds, { + int? startTime, + int? endTime, + }) async { + if (signalIds.isEmpty || await _loadStructure() == null) { + return const []; + } + final waveforms = await _wellenApi.getWaveformData( + signalIds: signalIds, + startTime: startTime, + endTime: endTime, + ); + return waveforms; + } + + @override + Future> getWaveformData({ + required List signalIds, + int? startTime, + int? endTime, + }) async { + if (!_isRunning) { + return []; + } + final waveforms = await _loadWaveforms( + signalIds, + startTime: startTime, + endTime: endTime, + ); + return waveforms; + } + + @override + Future> getWaveformDataSince({ + required List signalIds, + required int sinceTime, + }) async { + final waveforms = await _loadWaveforms(signalIds, startTime: sinceTime); + return waveforms + .map( + (waveform) => WaveformData( + signalId: waveform.signalId, + data: waveform.data.where((data) => data.time > sinceTime).toList(), + ), + ) + .toList(); + } + + @override + Future> getWaveformDataWithTimepoints({ + required Map signalTimepoints, + }) async { + if (!_isRunning) { + return []; + } + final result = []; + for (final entry in signalTimepoints.entries) { + final signalId = entry.key; + final sinceTime = entry.value; + final waveforms = await _loadWaveforms([signalId], startTime: sinceTime); + for (final waveform in waveforms) { + final data = + waveform.data.where((data) => data.time > sinceTime).toList(); + if (data.isNotEmpty) { + result.add(WaveformData(signalId: waveform.signalId, data: data)); + } + } + } + + return result; + } + + @override + Future getCurrentTime() async { + if (!_isRunning) { + return null; + } + return _lastFetchedTime; + } + + // ───────────────────────────────────────────────────────────────────────── + // Snapshot + // ───────────────────────────────────────────────────────────────────────── + + @override + Future>?> getSnapshot(int time) async { + if (!_isRunning) { + return null; + } + final hierarchy = _getHierarchyService(); + final result = >{}; + final structure = await _loadStructure(); + if (structure == null) { + return result; + } + final waveforms = await _loadWaveforms(structure.allSignalIds); + + for (final waveform in waveforms) { + final signalId = waveform.signalId; + final data = waveform.data; + + // Binary search for value at-or-before time + var value = 'x'; + if (data.isNotEmpty) { + var lo = 0; + var hi = data.length - 1; + var res = -1; + while (lo <= hi) { + final mid = (lo + hi) >> 1; + if (data[mid].time <= time) { + res = mid; + lo = mid + 1; + } else { + hi = mid - 1; + } + } + if (res != -1) { + value = data[res].value; + } + } + + final signal = _resolveSignal(hierarchy, signalId); + result[signalId] = { + 'value': value, + 'name': signal?.name ?? signalId.split('/').last, + 'width': signal?.width ?? 1, + if (signal?.direction != null) 'direction': signal!.direction, + }; + } + + return result; + } + + // ───────────────────────────────────────────────────────────────────────── + // SignalOccurrence Dictionary & Compact Transport + // ───────────────────────────────────────────────────────────────────────── + + @override + Future>?> getSignalDictionary() async { + if (!_isRunning) { + return null; + } + if (_cachedDictionary != null) { + return _cachedDictionary; + } + + final hierarchy = _getHierarchyService(); + final structure = await _loadStructure(); + if (structure == null) { + return const []; + } + + final dict = >[]; + final idToIndex = {}; + var idx = 0; + + for (final signalId in structure.allSignalIds) { + final signal = _resolveSignal(hierarchy, signalId); + dict.add({ + 'i': idx, + 'id': signalId, + 'name': signal?.name ?? signalId.split('/').last, + 'width': signal?.width ?? 1, + 'direction': signal?.direction ?? 'internal', + }); + idToIndex[signalId] = idx; + idx++; + } + + _cachedDictionary = dict; + _cachedIdToIndex = idToIndex; + return dict; + } + + @override + Future?> getSnapshotCompact(int time) async { + if (!_isRunning) { + return null; + } + await getSignalDictionary(); + if (_cachedIdToIndex == null) { + return null; + } + + final values = {}; + final structure = await _loadStructure(); + if (structure == null) { + return null; + } + final waveforms = await _loadWaveforms(structure.allSignalIds); + + for (final waveform in waveforms) { + final signalId = waveform.signalId; + final idx = _cachedIdToIndex![signalId]; + if (idx == null) { + continue; + } + + final data = waveform.data; + var value = 'x'; + if (data.isNotEmpty) { + var lo = 0; + var hi = data.length - 1; + var res = -1; + while (lo <= hi) { + final mid = (lo + hi) >> 1; + if (data[mid].time <= time) { + res = mid; + lo = mid + 1; + } else { + hi = mid - 1; + } + } + if (res != -1) { + value = data[res].value; + } + } + + values[idx.toString()] = value; + } + + return {'time': time, 'v': values}; + } + + @override + Future> getWaveformDataCompact({ + required List signalAddresses, + required Map addressToSignalId, + int? startTime, + int? endTime, + }) async { + if (!_isRunning) { + return []; + } + final signalIds = signalAddresses + .map((address) => addressToSignalId[address]) + .whereType() + .toList(); + final waveforms = await _loadWaveforms( + signalIds, + startTime: startTime, + endTime: endTime, + ); + return waveforms; + } + + @override + Future> getWaveformDataWithTimepointsCompact({ + required Map signalTimepoints, + required Map addressToSignalId, + }) async { + if (!_isRunning) { + return []; + } + final result = []; + for (final entry in signalTimepoints.entries) { + final addr = entry.key; + final sinceTime = entry.value; + final signalId = addressToSignalId[addr]; + if (signalId == null) { + continue; + } + + final waveforms = await _loadWaveforms([signalId], startTime: sinceTime); + for (final waveform in waveforms) { + final data = + waveform.data.where((data) => data.time > sinceTime).toList(); + if (data.isNotEmpty) { + result.add(WaveformData(signalId: waveform.signalId, data: data)); + } + } + } + + return result; + } + + // ─── RohdServiceTransport hierarchy stubs (file-backed, no server) ── + + @override + Future?> getModuleTree() async => null; + + @override + Future?> getModuleNetlist(String definitionName) async => + null; + + /// Start serving data. + void start() => _isRunning = true; + + /// Stop serving data. + void stop() => _isRunning = false; + + @override + Future dispose() async { + _isRunning = false; + _cachedStructure = null; + _cachedDictionary = null; + _cachedIdToIndex = null; + _cachedHierarchyService = null; + await _updateController.close(); + } + + /// Resolve a signal pathname to a [SignalOccurrence] using a hierarchy + /// service. + static SignalOccurrence? _resolveSignal( + HierarchyService? hs, + String pathname, + ) { + if (hs == null) { + return null; + } + final addr = OccurrenceAddress.tryFromPathname(pathname, hs.root); + if (addr == null) { + return null; + } + return hs.signalByAddress(addr); + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/details_panel_content.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/details_panel_content.dart new file mode 100644 index 0000000000..cbc5238e35 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/details_panel_content.dart @@ -0,0 +1,387 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// details_panel_content.dart +// Shared details panel content widget with tabs. +// Used by both the DevTools extension and standalone entry points. +// +// 2026 January +// Author: Desmond Kirkpatrick + +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart' show rootBundle; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:material_ui/material_ui.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/cubit/cubits.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/ui/module_tree_details_navbar.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/ui/signal_details_card.dart'; +import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart' + show + AppBarOverlayTrigger, + AvailableSourceFormats, + GoToSourceCallback, + RohdSourceFormat; +import 'package:rohd_schematic_viewer/schematic_viewer.dart'; + +/// Configuration for the waveform tab. +class WaveformTabConfig { + /// The waveform viewer widget. + final Widget waveformViewer; + + /// Creates a [WaveformTabConfig] with the given waveform viewer. + const WaveformTabConfig({required this.waveformViewer}); +} + +/// Configuration for the schematic tab. +class SchematicTabConfig { + /// Asset path for schematic JSON (without 'assets/' prefix for web). + final String assetPath; + + /// Custom schematic widget builder (overrides default + /// `EmbeddedSchematicViewer`). + /// + /// The `isVisible` parameter indicates whether the schematic tab is + /// currently selected. Pass it to `EmbeddedSchematicViewer.isVisible` + /// so expensive layout work is deferred while the tab is hidden. + final Widget Function({required bool isVisible})? customWidgetBuilder; + + /// Creates a [SchematicTabConfig] with the given asset path and optional + /// custom widget builder. + const SchematicTabConfig({required this.assetPath, this.customWidgetBuilder}); +} + +/// Shared details panel content with tabbed interface. +/// +/// Shows tabs for: Details, Waveform, Schematic, JS Schematic +class DetailsPanelContent extends StatefulWidget { + /// Configuration for the waveform tab. + final WaveformTabConfig waveformConfig; + + /// Configuration for the schematic tab. + final SchematicTabConfig schematicConfig; + + /// Optional placeholder text when no module is selected. + final String noModuleSelectedText; + + /// Custom details tab widget (overrides default SignalDetailsCard). + final Widget? customDetailsTab; + + /// Whether the platform supports color emoji. + /// Defaults to true (works for web). On Linux, check with + /// `isEmojiFontInstalled`. + final bool hasColorEmoji; + + /// Optional fallback for signals missing from the snapshot. + /// + /// When non-null, the details table calls this for any signal whose value + /// is absent from the snapshot map (e.g. computed gate outputs). The + /// callback should use the client-side netlist evaluator. + final ({String value, bool computed})? Function(String signalPath)? + _signalValueFallback; + + /// Called to eagerly expand a module's connectivity (slim → full JSON) + /// so that the evaluator can compute internal signal values. + final Future Function(String moduleInstancePath)? _onExpandModule; + + /// Callback to send selected signal paths to waveform/schematic viewers. + final void Function(List signalPaths)? _onSendSignals; + + /// Callback to navigate to a signal's source for a chosen [RohdSourceFormat]. + final GoToSourceCallback? _onGoToSource; + + /// Discovers which source formats are navigable for the current module. + final AvailableSourceFormats? _availableSourceFormats; + + /// Creates a [DetailsPanelContent] with the given configurations. + const DetailsPanelContent({ + required this.waveformConfig, + required this.schematicConfig, + super.key, + this.noModuleSelectedText = + 'Select a module from the tree to view its signals', + this.customDetailsTab, + this.hasColorEmoji = true, + ({String value, bool computed})? Function(String signalPath)? + signalValueFallback, + Future Function(String moduleInstancePath)? onExpandModule, + void Function(List signalPaths)? onSendSignals, + GoToSourceCallback? onGoToSource, + AvailableSourceFormats? availableSourceFormats, + }) : _signalValueFallback = signalValueFallback, + _onExpandModule = onExpandModule, + _onSendSignals = onSendSignals, + _onGoToSource = onGoToSource, + _availableSourceFormats = availableSourceFormats; + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add( + DiagnosticsProperty( + 'waveformConfig', + waveformConfig, + ), + ) + ..add( + DiagnosticsProperty( + 'schematicConfig', + schematicConfig, + ), + ) + ..add(StringProperty('noModuleSelectedText', noModuleSelectedText)) + ..add(DiagnosticsProperty('customDetailsTab', customDetailsTab)) + ..add( + FlagProperty( + 'hasColorEmoji', + value: hasColorEmoji, + ifFalse: 'using fallback icons', + ), + ); + } + + @override + State createState() => _DetailsPanelContentState(); +} + +class _DetailsPanelContentState extends State { + final ValueNotifier _overlayTrigger = ValueNotifier(false); + + @override + void dispose() { + _overlayTrigger.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + // Build children ONCE per build() — not per tab change. + // Hoisting them out of the BlocBuilder closure ensures Flutter sees the + // same widget instance when only the tab index changes, avoiding a + // forced rebuild cascade that would re-evaluate every signal. + final detailsChild = widget.customDetailsTab ?? _buildDetailsTab(context); + final waveformChild = widget.waveformConfig.waveformViewer; + + return AppBarOverlayTrigger( + notifier: _overlayTrigger, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + MouseRegion( + onEnter: (_) => _overlayTrigger.value = true, + onExit: (_) => _overlayTrigger.value = false, + child: ModuleTreeDetailsNavbar(hasColorEmoji: widget.hasColorEmoji), + ), + Expanded( + // ClipRect prevents overlay AppBars from painting above the + // content area into the tab bar when they slide up to hide. + child: ClipRect( + child: BlocBuilder( + builder: (context, selectedTab) => IndexedStack( + index: selectedTab.index, + children: [ + // DetailsTab.details (index 0) + detailsChild, + // DetailsTab.waveform (index 1) + waveformChild, + // DetailsTab.schematic (index 2) + widget.schematicConfig.customWidgetBuilder?.call( + isVisible: selectedTab == DetailsTab.schematic, + ) ?? + _buildSchematicTab( + context, + isVisible: selectedTab == DetailsTab.schematic, + ), + ], + ), + ), + ), + ), + ], + ), + ); + } + + Widget _buildDetailsTab(BuildContext context) => Padding( + padding: const EdgeInsets.only(left: 20, right: 20), + child: SingleChildScrollView( + child: BlocBuilder( + buildWhen: (prev, curr) { + final prevSel = + prev is HierarchyLoaded ? prev.selectedModule : null; + final currSel = + curr is HierarchyLoaded ? curr.selectedModule : null; + return prevSel != currSel; + }, + builder: (context, state) { + final selectedModule = + state is HierarchyLoaded ? state.selectedModule : null; + if (selectedModule != null) { + return BlocBuilder( + builder: (context, snapshotState) { + final snapshot = + snapshotState is SnapshotLoaded ? snapshotState : null; + return SignalDetailsCard( + module: selectedModule, + snapshot: snapshot, + signalValueFallback: widget._signalValueFallback, + onExpandModule: widget._onExpandModule, + onSendSignals: widget._onSendSignals, + onGoToSource: widget._onGoToSource, + availableSourceFormats: widget._availableSourceFormats, + ); + }, + ); + } else { + final isDark = Theme.of(context).brightness == Brightness.dark; + return Center( + child: Padding( + padding: const EdgeInsets.all(20), + child: Text( + widget.noModuleSelectedText, + style: TextStyle( + color: isDark ? Colors.white54 : Colors.black38, + ), + ), + ), + ); + } + }, + ), + ), + ); + + Widget _buildSchematicTab(BuildContext context, {required bool isVisible}) { + // Get the selected module and hierarchy service from the cubit + final hierarchyState = context.watch().state; + + final selectedModule = hierarchyState is HierarchyLoaded + ? hierarchyState.selectedModule + : null; + + final hierarchyService = hierarchyState is HierarchyLoaded + ? hierarchyState.hierarchyService + : null; + + if (hierarchyService != null) { + return EmbeddedSchematicViewer.fromHierarchy( + externalHierarchy: hierarchyService, + selectedModule: selectedModule, + isVisible: isVisible, + signalValueLookupFn: _buildSignalValueLookup(context), + ); + } + final assetPath = kIsWeb + ? widget.schematicConfig.assetPath + : 'assets/${widget.schematicConfig.assetPath}'; + return EmbeddedSchematicViewer.fromAsset( + assetPath: assetPath, + isVisible: isVisible, + ); + } + + /// Build a signal value lookup from the SnapshotCubit, if available. + /// + /// The schematic canvas now resolves wire / port names to fully-qualified + /// hierarchy paths when scope metadata is available. We therefore try a + /// direct signal-ID match first, then fall back to a leaf-name match. + static ({String value, bool computed, String signalId})? Function( + String wireName, + )? _buildSignalValueLookup(BuildContext context) { + final snapshotState = context.watch().state; + if (snapshotState is! SnapshotLoaded) { + return null; + } + + ({String value, bool computed, String signalId}) hit(SignalSnapshot s) => + (value: s.value, computed: s.computed, signalId: s.signalId); + + return (String wireName) { + // 1. Direct signal-ID match (full hierarchy path). + final exact = snapshotState.getSignal(wireName); + if (exact != null) { + return hit(exact); + } + + // 2. Fall back to leaf-name match. + // When the canvas provides a full path that didn't match (e.g. + // type-name rooted), use only the leaf name. + final leafName = wireName.contains('/') + ? wireName.substring(wireName.lastIndexOf('/') + 1) + : wireName; + final byName = snapshotState.getSignalByName(leafName); + return byName != null ? hit(byName) : null; + }; + } +} + +/// Wrapper that loads schematic from assets and passes to +/// EmbeddedSchematicViewer. +class _JSSchematicViewerWrapper extends StatefulWidget { + /// Asset path for schematic JSON (without 'assets/' prefix for web). + final String assetPath; + + const _JSSchematicViewerWrapper({required this.assetPath}); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(StringProperty('assetPath', assetPath)); + } + + @override + State<_JSSchematicViewerWrapper> createState() => + _JSSchematicViewerWrapperState(); +} + +class _JSSchematicViewerWrapperState extends State<_JSSchematicViewerWrapper> { + late String _schematicJson; + late bool _isLoading; + String? _error; + + @override + void initState() { + super.initState(); + _isLoading = true; + unawaited(_loadSchematic()); + } + + Future _loadSchematic() async { + try { + final path = kIsWeb ? widget.assetPath : 'assets/${widget.assetPath}'; + final jsonData = await rootBundle.loadString(path); + if (mounted) { + setState(() { + _schematicJson = jsonData; + _isLoading = false; + }); + } + } on Object catch (e) { + if (mounted) { + setState(() { + _error = 'Failed to load schematic: $e'; + _isLoading = false; + }); + } + } + } + + @override + Widget build(BuildContext context) { + if (_isLoading) { + return const Center(child: CircularProgressIndicator()); + } + + if (_error != null) { + return Center( + child: Text(_error!, style: const TextStyle(color: Colors.red)), + ); + } + + return EmbeddedSchematicViewer.fromJson( + schematicJson: _schematicJson, + ); + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/devtool_appbar.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/devtool_appbar.dart index 83898f5e08..52f574aa6c 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/ui/devtool_appbar.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/devtool_appbar.dart @@ -11,73 +11,197 @@ import 'package:flutter/foundation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:material_ui/material_ui.dart'; import 'package:rohd_devtools_extension/rohd_devtools/cubit/cubits.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/extension_manager_bridge.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/third_party_license_registry.dart'; import 'package:rohd_devtools_extension/rohd_devtools/ui/devtools_help_button.dart'; import 'package:rohd_devtools_extension/rohd_devtools/ui/platform_icon.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/utils/browser_window.dart'; -/// App bar used by the ROHD DevTools UI. +/// A custom AppBar for the ROHD DevTool application. +/// +/// Provides Help, Theme toggle, Licenses, Pause/Resume, and emoji icon +/// support matching the standalone version's app bar. class DevtoolAppBar extends StatelessWidget implements PreferredSizeWidget { - /// Whether to render color emoji icons where available. - const DevtoolAppBar({super.key, this.hasColorEmoji = kIsWeb}); + final bool _hasColorEmoji; + final bool _isPaused; + final VoidCallback? _onPauseResume; - /// Whether the icon set should prefer color emoji glyphs. - final bool hasColorEmoji; + /// Creates a [DevtoolAppBar]. + const DevtoolAppBar({ + super.key, + bool hasColorEmoji = true, + bool isPaused = false, + VoidCallback? onPauseResume, + }) : _hasColorEmoji = hasColorEmoji, + _isPaused = isPaused, + _onPauseResume = onPauseResume; @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add( + FlagProperty( + 'hasColorEmoji', + value: _hasColorEmoji, + ifFalse: 'using fallback icons', + ), + ) + ..add( + FlagProperty( + 'isPaused', + value: _isPaused, + ifTrue: 'paused', + ifFalse: 'running', + ), + ) + ..add( + ObjectFlagProperty.has('onPauseResume', _onPauseResume), + ); + } - /// Builds the app bar with help, license, and theme controls. + @override Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; - final accentColor = Theme.of(context).colorScheme.primary; return AppBar( - backgroundColor: Theme.of(context).colorScheme.onPrimary, - title: const Text('ROHD DevTool (Beta)'), - leading: Padding( - padding: const EdgeInsets.all(8), - child: - Image.asset('assets/icons/rohd_logo.png', fit: BoxFit.contain)), - actions: [ - // ── Help ── - DevToolsHelpButton(isDark: isDark), + backgroundColor: + isDark ? const Color(0xFF252526) : const Color(0xFFF5F5F5), + title: Text( + 'ROHD DevTools', + style: TextStyle(color: isDark ? Colors.white : Colors.black87), + ), + leading: Padding( + padding: const EdgeInsets.all(8), + child: Image.asset( + 'assets/rohd_icon.png', + width: 28, + height: 28, + fit: BoxFit.contain, + ), + ), + actions: [ + // ── Tools menu ── + PopupMenuButton( + icon: platformIcon( + Icons.construction, + '🧰', + size: 24, + hasColorEmoji: _hasColorEmoji, + ), + tooltip: 'Tools', + onSelected: (value) { + // The extension iframe is served by DevTools at a path like: + // http://host:port/devtools_extensions/rohd_0.0.1/index.html + // DevTools serves everything under build/ at that root, so + // the standalone viewers at build/waves/ and build/schematics/ + // are accessible relative to the current directory. + // + // The standalone debugger runs on port 9099 on the same host, + // so we construct an absolute URL for that case. + final String toolUrl; + if (value.startsWith('http')) { + toolUrl = value; + } else { + final href = browserCurrentHref(); + final base = href.substring(0, href.lastIndexOf('/') + 1); + toolUrl = '$base$value'; + } + debugPrint('[Tools] Opening: $toolUrl'); + openBrowserTab(toolUrl); + }, + itemBuilder: (context) => [ + const PopupMenuItem( + value: 'waves/index.html', + child: Text('Wave Viewer'), + ), + const PopupMenuItem( + value: 'schematics/index.html', + child: Text('Schematic Viewer'), + ), + const PopupMenuItem( + value: 'debugger/index.html', + child: Text('Standalone Debugger'), + ), + ], + ), + + // ── Pause / Resume waveform updates ── + if (_onPauseResume != null) + IconButton( + icon: platformIcon( + _isPaused ? Icons.play_arrow : Icons.pause, + _isPaused ? '▶️' : '⏸️', + size: 24, + hasColorEmoji: _hasColorEmoji, + ), + onPressed: _onPauseResume, + tooltip: _isPaused + ? 'Resume waveform updates' + : 'Pause waveform updates (keeps connection alive)', + ), + + // ── Refresh ── + IconButton( + icon: platformIcon( + Icons.refresh, + '🔃', + size: 24, + hasColorEmoji: _hasColorEmoji, + ), + onPressed: () { + // Trigger a rebuild of the tree structure page + }, + tooltip: 'Refresh', + ), + + // ── Help ── + DevToolsHelpButton(isDark: isDark), - // ── Licenses ── - Padding( - padding: const EdgeInsets.only(right: 20), - child: MouseRegion( - cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: () { - showLicensePage(context: context); - }, - child: const Text('Licenses', - style: TextStyle(fontWeight: FontWeight.bold))))), + // ── Licenses ── + TextButton( + onPressed: () { + registerBundledThirdPartyLicenses(); + showLicensePage(context: context); + }, + child: Text( + 'Licenses', + style: TextStyle( + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : Colors.black87, + ), + ), + ), - BlocBuilder( - builder: (context, themeMode) { + // ── Theme toggle ── + BlocBuilder( + builder: (context, themeMode) { final isDark = themeMode == DevToolsThemeMode.dark; - return IconButton( - tooltip: - isDark ? 'Switch to light theme' : 'Switch to dark theme', + return Tooltip( + message: + isDark ? 'Switch to light theme' : 'Switch to dark theme', + child: IconButton( + icon: platformIcon( + isDark ? Icons.light_mode : Icons.dark_mode, + isDark ? '☀️' : '🌙', + size: 24, + hasColorEmoji: _hasColorEmoji, + ), onPressed: () { context.read().toggleTheme(); + // Also toggle the DevToolsExtension's outer MaterialApp + // theme so colors propagate correctly. + setExtensionDarkThemeEnabled(enabled: !isDark); }, - icon: platformIcon(isDark ? Icons.light_mode : Icons.dark_mode, - isDark ? '☀️' : '🌙', - size: 24, - color: accentColor, - hasColorEmoji: hasColorEmoji)); - }) - ]); + ), + ); + }, + ), + const SizedBox(width: 8), + ], + ); } @override - - /// The preferred height of the app bar. Size get preferredSize => const Size.fromHeight(kToolbarHeight); - - @override - void debugFillProperties(DiagnosticPropertiesBuilder properties) { - super.debugFillProperties(properties); - properties.add(DiagnosticsProperty('hasColorEmoji', hasColorEmoji)); - } } diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/devtools_connection_host.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/devtools_connection_host.dart index 758b0c45e0..a676196761 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/ui/devtools_connection_host.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/devtools_connection_host.dart @@ -195,51 +195,6 @@ String? preferredVmServiceUriFromDtdEvent(DTDEvent event) { return null; } -// --------------------------------------------------------------------------- -// VM Connection Strategy -// --------------------------------------------------------------------------- - -/// Abstract base for VM connection strategies. -/// Linux uses vm_service_io, Web uses package:web WebSocket. -abstract class VmConnectionStrategy { - /// Connect to VM service at the given URI. - /// Returns the VmService and isolateId for the main isolate. - Future connect(String uri); - - /// Normalize URI to websocket format. - Uri? normalizeUri(String value) { - try { - var uri = Uri.parse(value.trim()); - - if (uri.scheme == 'http') { - uri = uri.replace(scheme: 'ws'); - } else if (uri.scheme == 'https') { - uri = uri.replace(scheme: 'wss'); - } - - if (!uri.path.endsWith('/ws')) { - uri = uri.replace(path: '${uri.path}ws'); - } - - return uri; - } on Exception { - return null; - } - } -} - -/// Result of a VM connection attempt. -class VmConnectionResult { - /// The connected VM service. - final VmService vmService; - - /// The isolate ID of the main isolate. - final String isolateId; - - /// Constructor for [VmConnectionResult]. - VmConnectionResult({required this.vmService, required this.isolateId}); -} - /// Describes whether an attach is brand-new, a same-VM restart, or a /// teardown for disconnect. enum VmConnectionTransitionKind { @@ -1084,7 +1039,7 @@ abstract class DevToolsConnectionHostState /// /// Connects to DTD, calls getVmServices(), returns the list. /// Also probes for registered services (new DTD 4.0 API). - Future> discoverVmServices(String dtdUri) async => + Future> discoverVmServices(String dtdUri) => discoverVmServicesViaDtd( dtdUri, onRegisteredServices: (serviceNames) { diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/devtools_split_layout.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/devtools_split_layout.dart new file mode 100644 index 0000000000..a51f9a1167 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/devtools_split_layout.dart @@ -0,0 +1,384 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// devtools_split_layout.dart +// Shared split layout widget for DevTools extension. +// Used by both the DevTools extension and standalone entry points. +// +// 2026 January +// Author: Desmond Kirkpatrick + +import 'package:flutter/foundation.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:material_ui/material_ui.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/cubit/cubits.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/ui/module_search_overlay.dart'; +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; + +/// Configuration for the left panel (module tree). +class ModuleTreePanelConfig { + /// Icon widget for the tree header. + final Widget icon; + + /// Refresh button icon widget. + final Widget refreshIcon; + + /// Callback when refresh is pressed. + final VoidCallback? onRefresh; + + /// The module tree content widget. + final Widget treeContent; + + /// Optional panel displayed beneath the module tree. + final Widget? bottomContent; + + /// Initial height reserved for [bottomContent]. + final double bottomContentHeight; + + /// Scroll controllers for the tree content. + final ScrollController verticalController; + + /// Horizontal scroll controller for the tree content. + final ScrollController horizontalController; + + /// Optional hierarchy service for incremental search. + /// If provided, enables the module search field. + final HierarchyService? hierarchyService; + + /// Creates a [ModuleTreePanelConfig] with the given parameters. + const ModuleTreePanelConfig({ + required this.icon, + required this.refreshIcon, + required this.onRefresh, + required this.treeContent, + required this.verticalController, + required this.horizontalController, + this.hierarchyService, + this.bottomContent, + this.bottomContentHeight = 260, + }); +} + +/// Configuration for the right panel (details/tabs). +class DetailsPanelConfig { + /// The content widget for the details panel. + final Widget content; + + /// Creates a [DetailsPanelConfig] with the given content. + const DetailsPanelConfig({required this.content}); +} + +/// Shared split layout for ROHD DevTools. +/// +/// This widget provides the two-panel layout with a resizable divider: +/// - Left panel: Module tree with search and refresh +/// - Right panel: Details/waveform/schematic tabs +/// +/// Usage: +/// ```dart +/// DevToolsSplitLayout( +/// moduleTreeConfig: ModuleTreePanelConfig( +/// icon: Icon(Icons.account_tree), +/// refreshIcon: Icon(Icons.refresh), +/// onRefresh: () => loadTree(), +/// treeContent: MyTreeWidget(), +/// verticalController: _verticalController, +/// horizontalController: _horizontalController, +/// ), +/// detailsConfig: DetailsPanelConfig( +/// content: MyDetailsWidget(), +/// ), +/// ) +/// ``` +class DevToolsSplitLayout extends StatelessWidget { + /// Configuration for the module tree panel. + final ModuleTreePanelConfig moduleTreeConfig; + + /// Configuration for the details panel. + final DetailsPanelConfig detailsConfig; + + /// Initial fractions for the split pane. + final List initialFractions; + + /// Minimum sizes for each panel. + final List minSizes; + + /// Padding around the entire layout. + final EdgeInsets padding; + + /// Creates a [DevToolsSplitLayout] with the given configurations. + const DevToolsSplitLayout({ + required this.moduleTreeConfig, + required this.detailsConfig, + super.key, + this.initialFractions = const [0.23, 0.77], + this.minSizes = const [100, 200], + this.padding = const EdgeInsets.all(10), + }); + + @override + Widget build(BuildContext context) => Padding( + padding: padding, + child: _TwoPaneLayout( + initialFractions: initialFractions, + minSizes: minSizes, + children: [ + _buildModuleTreePanel(context), + _buildDetailsPanel(context) + ], + ), + ); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add( + DiagnosticsProperty( + 'moduleTreeConfig', + moduleTreeConfig, + ), + ) + ..add( + DiagnosticsProperty('detailsConfig', detailsConfig), + ) + ..add(IterableProperty('initialFractions', initialFractions)) + ..add(IterableProperty('minSizes', minSizes)) + ..add(DiagnosticsProperty('padding', padding)); + } + + Widget _buildModuleTreePanel(BuildContext context) => + _ModuleTreePanel(config: moduleTreeConfig); + + Widget _buildDetailsPanel(BuildContext context) => + Card(clipBehavior: Clip.antiAlias, child: detailsConfig.content); +} + +class _ModuleTreePanel extends StatefulWidget { + const _ModuleTreePanel({required this.config}); + + final ModuleTreePanelConfig config; + + @override + State<_ModuleTreePanel> createState() => _ModuleTreePanelState(); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add( + DiagnosticsProperty('config', config), + ); + } +} + +class _ModuleTreePanelState extends State<_ModuleTreePanel> { + static const _minimumTreeHeight = 160.0; + static const _minimumBottomHeight = 140.0; + double? _bottomContentHeight; + double? _dragStartBottomHeight; + double? _dragStartGlobalY; + + double _boundedBottomHeight(BoxConstraints constraints) { + final initial = _bottomContentHeight ?? widget.config.bottomContentHeight; + final maximum = constraints.maxHeight - _minimumTreeHeight; + if (!maximum.isFinite || maximum <= _minimumBottomHeight) { + return _minimumBottomHeight; + } + return initial.clamp(_minimumBottomHeight, maximum); + } + + @override + Widget build(BuildContext context) => Card( + clipBehavior: Clip.antiAlias, + child: LayoutBuilder( + builder: (context, constraints) { + final config = widget.config; + final bottomHeight = _boundedBottomHeight(constraints); + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: const EdgeInsets.all(10), + child: Row( + children: [ + config.icon, + const SizedBox(width: 10), + const Expanded( + child: Text( + 'Module Tree', + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + IconButton( + icon: config.refreshIcon, + onPressed: config.onRefresh, + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: ModuleSearchField( + hierarchy: config.hierarchyService, + onSearchTermChanged: (term) { + context.read().setTerm(term); + }, + ), + ), + const Divider(height: 1), + Expanded( + child: Scrollbar( + controller: config.verticalController, + thumbVisibility: true, + child: SingleChildScrollView( + controller: config.verticalController, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + controller: config.horizontalController, + child: config.treeContent, + ), + ), + ), + ), + if (config.bottomContent case final bottomContent?) ...[ + MouseRegion( + cursor: SystemMouseCursors.resizeUpDown, + child: GestureDetector( + key: const ValueKey('shell-resize-divider'), + behavior: HitTestBehavior.opaque, + onVerticalDragStart: (details) { + _dragStartBottomHeight = bottomHeight; + _dragStartGlobalY = details.globalPosition.dy; + }, + onVerticalDragUpdate: (details) { + final startHeight = _dragStartBottomHeight; + final startY = _dragStartGlobalY; + if (startHeight == null || startY == null) { + return; + } + setState(() { + _bottomContentHeight = (startHeight - + (details.globalPosition.dy - startY)) + .clamp( + _minimumBottomHeight, + constraints.maxHeight - _minimumTreeHeight, + ); + }); + }, + onVerticalDragEnd: (_) { + _dragStartBottomHeight = null; + _dragStartGlobalY = null; + }, + child: Container( + height: 8, + color: Theme.of(context) + .colorScheme + .surfaceContainerHighest, + alignment: Alignment.center, + child: Container( + height: 2, + margin: const EdgeInsets.symmetric(horizontal: 24), + color: Theme.of(context).colorScheme.outlineVariant, + ), + ), + ), + ), + SizedBox(height: bottomHeight, child: bottomContent), + ], + ], + ); + }, + ), + ); +} + +class _TwoPaneLayout extends StatefulWidget { + final List _initialFractions; + final List _minSizes; + final List _children; + + const _TwoPaneLayout({ + required List initialFractions, + required List minSizes, + required List children, + }) : _initialFractions = initialFractions, + _minSizes = minSizes, + _children = children; + + @override + State<_TwoPaneLayout> createState() => _TwoPaneLayoutState(); +} + +class _TwoPaneLayoutState extends State<_TwoPaneLayout> { + static const _dividerWidth = 8.0; + double? _leftWidth; + double? _dragStartLeftWidth; + double? _dragStartGlobalX; + + @override + Widget build(BuildContext context) { + final leftFraction = widget._initialFractions.isNotEmpty + ? widget._initialFractions.first + : 0.23; + final minLeft = + widget._minSizes.isNotEmpty ? widget._minSizes.first : 100.0; + final minRight = widget._minSizes.length > 1 ? widget._minSizes[1] : 200.0; + + return LayoutBuilder( + builder: (context, constraints) { + final total = constraints.maxWidth; + final maximumLeft = total - minRight - _dividerWidth; + final left = (_leftWidth ?? total * leftFraction).clamp( + minLeft, + maximumLeft, + ); + final right = total - left - _dividerWidth; + + return Row( + children: [ + SizedBox(width: left, child: widget._children.first), + MouseRegion( + cursor: SystemMouseCursors.resizeLeftRight, + child: GestureDetector( + key: const ValueKey('details-resize-divider'), + behavior: HitTestBehavior.opaque, + onHorizontalDragStart: (details) { + _dragStartLeftWidth = left; + _dragStartGlobalX = details.globalPosition.dx; + }, + onHorizontalDragUpdate: (details) { + final startWidth = _dragStartLeftWidth; + final startX = _dragStartGlobalX; + if (startWidth == null || startX == null) { + return; + } + setState(() { + _leftWidth = + (startWidth + (details.globalPosition.dx - startX)) + .clamp(minLeft, maximumLeft); + }); + }, + onHorizontalDragEnd: (_) { + _dragStartLeftWidth = null; + _dragStartGlobalX = null; + }, + child: Container( + width: _dividerWidth, + color: Theme.of(context).colorScheme.surfaceContainerHighest, + alignment: Alignment.center, + child: Container( + width: 2, + margin: const EdgeInsets.symmetric(vertical: 24), + color: Theme.of(context).colorScheme.outlineVariant, + ), + ), + ), + ), + SizedBox(width: right, child: widget._children[1]), + ], + ); + }, + ); + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/module_search_overlay.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/module_search_overlay.dart new file mode 100644 index 0000000000..bb77313993 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/module_search_overlay.dart @@ -0,0 +1,296 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// module_search_overlay.dart + +// Inline module search widget for finding modules in the hierarchy. Adapted +// from wire_search_overlay pattern, using rohd_hierarchy.searchOccurrences. +// +// 2026 February Author: Desmond Kirkpatrick + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:material_ui/material_ui.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/cubit/hierarchy_cubit.dart'; +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; + +/// Inline module search widget that replaces the Search Tree text field. +/// +/// Uses [HierarchyService.searchOccurrences] to find modules by name or +/// hierarchical path (e.g. "cpu/alu"). Results appear in a list below +/// the search field, exactly like the wire search overlay in the schematic +/// viewer but placed inline in the Module Tree panel. +/// +/// Features: +/// - Real-time search as user types +/// - Arrow-key navigation through results +/// - Enter to select, Escape to clear results +/// - Shows module path and child count for each result +/// - Also fires [onSearchTermChanged] so the existing tree filter still works +class ModuleSearchField extends StatefulWidget { + /// Hierarchy service for module search. + final HierarchyService? hierarchy; + + /// Called on every text change so the tree filter (TreeSearchTermCubit) + /// can be kept in sync. + final ValueChanged? onSearchTermChanged; + + /// Constructor for [ModuleSearchField]. + const ModuleSearchField({ + super.key, + this.hierarchy, + this.onSearchTermChanged, + }); + + @override + State createState() => _ModuleSearchFieldState(); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add(DiagnosticsProperty('hierarchy', hierarchy)) + ..add( + ObjectFlagProperty?>.has( + 'onSearchTermChanged', + onSearchTermChanged, + ), + ); + } +} + +class _ModuleSearchFieldState extends State { + final _textController = TextEditingController(); + final _focusNode = FocusNode(); + final _scrollController = ScrollController(); + + /// Shared search controller from rohd_hierarchy. + late HierarchySearchController _ctrl; + + @override + void initState() { + super.initState(); + _ctrl = _buildController(); + _textController.addListener(_onSearchChanged); + } + + @override + void didUpdateWidget(covariant ModuleSearchField oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.hierarchy != widget.hierarchy) { + _ctrl = _buildController(); + _onSearchChanged(); + } + } + + @override + void dispose() { + _textController + ..removeListener(_onSearchChanged) + ..dispose(); + _focusNode.dispose(); + _scrollController.dispose(); + super.dispose(); + } + + HierarchySearchController _buildController() { + final hierarchy = widget.hierarchy; + if (hierarchy != null) { + return HierarchySearchController.forOccurrences(hierarchy); + } + return HierarchySearchController( + searchFn: (_) => [], + normalizeFn: HierarchySearchResult.normalizeQuery, + ); + } + + // ─────────────── Search Logic ─────────────── + + void _onSearchChanged() { + final query = _textController.text; + + // Keep tree filter in sync + widget.onSearchTermChanged?.call(query); + + setState(() { + try { + _ctrl.updateQuery(query); + if (_scrollController.hasClients) { + _scrollController.jumpTo(0); + } + } on Exception catch (_) { + _ctrl.clear(); + } + }); + } + + // ─────────────── Keyboard Navigation ─────────────── + + void _selectNext() { + setState(() { + _ctrl.selectNext(); + _ensureSelectedVisible(); + }); + } + + void _selectPrevious() { + setState(() { + _ctrl.selectPrevious(); + _ensureSelectedVisible(); + }); + } + + void _selectCurrent() { + final result = _ctrl.currentSelection; + if (result == null) { + return; + } + + // Select the module via BLoC — same as clicking it in the tree. + context.read().selectModule(result.occurrence); + + // Clear the search field so the tree filter is removed and the + // selected node becomes visible in the full tree. + _textController.clear(); + } + + void _ensureSelectedVisible() { + if (!_scrollController.hasClients) { + return; + } + const itemHeight = 56.0; + final offset = HierarchySearchController.scrollOffsetToReveal( + selectedIndex: _ctrl.selectedIndex, + itemHeight: itemHeight, + viewportHeight: _scrollController.position.viewportDimension, + currentOffset: _scrollController.offset, + ); + if (offset != null) { + _scrollController.jumpTo(offset); + } + } + + // ─────────────── Build ─────────────── + + @override + Widget build(BuildContext context) => Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _buildSearchField(context), + if (_ctrl.hasResults) _buildResultsList(context), + ], + ); + + Widget _buildSearchField(BuildContext context) => KeyboardListener( + focusNode: FocusNode(), + onKeyEvent: (event) { + if (event is KeyDownEvent) { + if (event.logicalKey == LogicalKeyboardKey.arrowDown) { + _selectNext(); + } else if (event.logicalKey == LogicalKeyboardKey.arrowUp) { + _selectPrevious(); + } else if (event.logicalKey == LogicalKeyboardKey.enter) { + _selectCurrent(); + } else if (event.logicalKey == LogicalKeyboardKey.escape) { + _textController.clear(); + } + } + }, + child: TextField( + controller: _textController, + focusNode: _focusNode, + decoration: InputDecoration( + labelText: 'Search Modules', + hintText: 'e.g. cpu/alu', + prefixIcon: const Icon(Icons.search, size: 18), + suffixText: _ctrl.hasResults ? _ctrl.counterText : null, + isDense: true, + ), + onSubmitted: (_) => _selectCurrent(), + ), + ); + + Widget _buildResultsList(BuildContext context) { + final theme = Theme.of(context); + return ConstrainedBox( + constraints: const BoxConstraints(maxHeight: 260), + child: ListView.builder( + controller: _scrollController, + shrinkWrap: true, + padding: EdgeInsets.zero, + itemCount: _ctrl.results.length, + itemBuilder: (context, index) { + final result = _ctrl.results[index]; + final isSelected = index == _ctrl.selectedIndex; + final childCount = result.childCount; + // Use the pre-computed display path from the enriched result + final displayPath = result.displayPath; + final childNames = + result.occurrence.children.map((c) => c.name).take(5).join(', '); + + return InkWell( + onTap: () { + setState(() => _ctrl.selectAt(index)); + _selectCurrent(); + }, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + color: isSelected + ? theme.colorScheme.primary.withValues(alpha: 0.15) + : null, + child: Row( + children: [ + Icon( + Icons.memory, + size: 16, + color: isSelected + ? theme.colorScheme.primary + : theme.colorScheme.onSurface, + ), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + displayPath, + style: TextStyle( + fontSize: 13, + fontWeight: isSelected + ? FontWeight.w600 + : FontWeight.normal, + color: isSelected + ? theme.colorScheme.primary + : theme.colorScheme.onSurface, + ), + overflow: TextOverflow.ellipsis, + ), + if (childCount > 0) + Text( + '$childCount ' + '${childCount == 1 ? 'child' : 'children'}' + ': $childNames' + '${childCount > 5 ? ' \u2026' : ''}', + style: TextStyle( + fontSize: 10, + color: theme.colorScheme.onSurface.withValues( + alpha: 0.6, + ), + ), + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + ], + ), + ), + ); + }, + ), + ); + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/module_tree_card.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/module_tree_card.dart index 9f81bd505f..46453746a0 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/ui/module_tree_card.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/module_tree_card.dart @@ -11,121 +11,252 @@ import 'package:flutter/foundation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_simple_treeview/flutter_simple_treeview.dart'; import 'package:material_ui/material_ui.dart'; - import 'package:rohd_devtools_extension/rohd_devtools/cubit/cubits.dart'; import 'package:rohd_devtools_extension/rohd_devtools/models/tree_model.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/services/services.dart'; +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; -/// Displays the module tree for the currently loaded ROHD model. +/// Widget that displays the module tree in a card. class ModuleTreeCard extends StatefulWidget { - /// The root module to render as the tree. + /// The module tree to display. final TreeModel futureModuleTree; - /// Creates a module tree card for the provided module tree. + /// Creates a [ModuleTreeCard] with the given module tree. const ModuleTreeCard({required this.futureModuleTree, super.key}); @override - - /// Creates the mutable state for [ModuleTreeCard]. State createState() => _ModuleTreeCardState(); @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties.add( - DiagnosticsProperty('futureModuleTree', futureModuleTree)); + DiagnosticsProperty('futureModuleTree', futureModuleTree), + ); } } class _ModuleTreeCardState extends State { - /// Creates the module tree card state. _ModuleTreeCardState(); @override - - /// Builds the module tree widget. + // Use BlocBuilder to efficiently rebuild only when state changes Widget build(BuildContext context) => - genModuleTree(moduleTree: widget.futureModuleTree); - - /// Builds a tree node for [module], returning null if it is filtered out. - TreeNode? buildNode(TreeModel module) { - final treeSearchTerm = context.watch().state; - // If there's a search term, ensure that either this node or a - // descendant node matches it. - if (treeSearchTerm != null && - !TreeService.isNodeOrDescendentMatching(module, treeSearchTerm)) { - return null; - } + BlocBuilder( + builder: (context, treeSearchTerm) => + BlocBuilder( + buildWhen: (prev, curr) { + final prevSel = + prev is HierarchyLoaded ? prev.selectedModule : null; + final currSel = + curr is HierarchyLoaded ? curr.selectedModule : null; + return prevSel != currSel; + }, + builder: (context, hierarchyState) { + final selectedModule = hierarchyState is HierarchyLoaded + ? hierarchyState.selectedModule + : null; - // Build children recursively - final childrenNodes = buildChildrenNodes(module); + return _ModuleTreeView( + moduleTree: widget.futureModuleTree, + treeSearchTerm: treeSearchTerm, + selectedModule: selectedModule, + onModuleSelected: (module) { + context.read().selectModule(module); + }, + ); + }, + ), + ); +} - return TreeNode( - content: MouseRegion( - cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: () { - context.read().setModule(module); - }, - child: getNodeContent(module))), - children: childrenNodes); +/// Stateful widget that builds the tree and manages tree controller. +/// Manages the tree controller to keep nodes collapsed by default. +class _ModuleTreeView extends StatefulWidget { + final TreeModel moduleTree; + final String? treeSearchTerm; + final TreeModel? selectedModule; + final ValueChanged onModuleSelected; + + const _ModuleTreeView({ + required this.moduleTree, + required this.treeSearchTerm, + required this.selectedModule, + required this.onModuleSelected, + }); + + @override + State<_ModuleTreeView> createState() => _ModuleTreeViewState(); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add(DiagnosticsProperty('moduleTree', moduleTree)) + ..add(StringProperty('treeSearchTerm', treeSearchTerm)) + ..add(DiagnosticsProperty('selectedModule', selectedModule)) + ..add( + ObjectFlagProperty>.has( + 'onModuleSelected', + onModuleSelected, + ), + ); } +} - /// Builds the visible text and icon for a tree node. - Widget getNodeContent(TreeModel module) { - final selectedModule = context.watch().state; - final colorScheme = Theme.of(context).colorScheme; +class _ModuleTreeViewState extends State<_ModuleTreeView> { + late TreeController _treeController; - // Check if the current module is the selected module - final isSelected = selectedModule is SelectedModuleLoaded && - selectedModule.module == module; + @override + void initState() { + super.initState(); + // Create a tree controller with all nodes collapsed by default + _treeController = TreeController(allNodesExpanded: false); + } - return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( - decoration: BoxDecoration( - color: isSelected - ? Colors.blue.withValues(alpha: 0.2) - : Colors.transparent, - borderRadius: BorderRadius.circular(4)), - padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), - child: Row(children: [ - Icon(Icons.memory, color: colorScheme.onSurface), - const SizedBox(width: 2), - Text(module.name, - style: TextStyle( - fontWeight: - isSelected ? FontWeight.bold : FontWeight.normal, - color: isSelected - ? colorScheme.primary - : colorScheme.onSurface)) - ])) - ]); + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add(DiagnosticsProperty('moduleTree', widget.moduleTree)) + ..add(StringProperty('treeSearchTerm', widget.treeSearchTerm)) + ..add( + DiagnosticsProperty( + 'selectedModule', + widget.selectedModule, + ), + ) + ..add( + ObjectFlagProperty>.has( + 'onModuleSelected', + widget.onModuleSelected, + ), + ); } - /// Builds child tree nodes for the given module. - List buildChildrenNodes(TreeModel treeModule) { + @override + Widget build(BuildContext context) { + final root = _buildNode(widget.moduleTree); + if (root != null) { + return TreeView(nodes: [root], treeController: _treeController); + } else { + return const Text('No data'); + } + } + + TreeNode? _buildNode(TreeModel module) { + // If there's a search term, ensure that either this node or a descendant + // node matches it. + if (widget.treeSearchTerm != null && + !HierarchyService.isOccurrenceMatching(module, widget.treeSearchTerm)) { + return null; + } + + // Build children recursively + final childrenNodes = _buildChildrenNodes(module); + + return TreeNode( + key: ObjectKey(module), + content: RepaintBoundary( + child: GestureDetector( + onTap: () => widget.onModuleSelected(module), + child: _NodeContent( + module: module, + isSelected: widget.selectedModule == module, + ), + ), + ), + children: childrenNodes, + ); + } + + List _buildChildrenNodes(TreeModel treeModule) { final childrenNodes = []; - final subModules = treeModule.subModules; - if (subModules.isNotEmpty) { - for (final module in subModules) { - final node = buildNode(module); - if (node != null) { - childrenNodes.add(node); - } + final subModules = treeModule.children; + for (final module in subModules) { + // Skip primitive cells (gates, flip-flops, operators, etc.) + // — these are implementation details, not navigable hierarchy. + if (module.isPrimitiveCell) { + continue; + } + // Keep leaf modules — they may have signals but no sub-modules, + // and users need to select them to view those signals. + // Skip internal struct_assign blocks — these are generated + // structural nodes that clutter the tree. + if (module.name.contains('struct_assign')) { + continue; + } + final node = _buildNode(module); + if (node != null) { + childrenNodes.add(node); } } return childrenNodes; } +} + +/// Stateless widget for node content to avoid rebuilds. +class _NodeContent extends StatelessWidget { + final TreeModel module; + final bool isSelected; + + const _NodeContent({required this.module, required this.isSelected}); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add(DiagnosticsProperty('module', module)) + ..add( + FlagProperty( + 'isSelected', + value: isSelected, + ifTrue: 'selected', + ifFalse: 'not selected', + ), + ); + } - /// Returns a tree node wrapper for the provided module. - TreeNode? buildTreeFromModule(TreeModel node) => buildNode(node); + @override + Widget build(BuildContext context) { + // Keep instance names for hierarchy nodes, but show the root module + // by definition name so the tree's top identity matches synthesis. + // This avoids surfacing synthetic instance defaults (e.g. + // `floatingpoint_adder_singlepath`) as the design's top name. + final isRoot = module.parent == null; + final displayName = + isRoot ? (module.definition ?? module.name) : module.name; - /// Builds the full tree view widget for [moduleTree]. - Widget genModuleTree({required TreeModel moduleTree}) { - final root = buildNode(moduleTree); - if (root != null) { - return TreeView(nodes: [root]); - } - return const Text('No data'); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + decoration: BoxDecoration( + color: isSelected + ? Colors.blue.withValues(alpha: 0.2) + : Colors.transparent, + borderRadius: BorderRadius.circular(4), + ), + padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), + child: Row( + children: [ + Icon( + Icons.memory, + color: Theme.of(context).colorScheme.onSurface, + ), + const SizedBox(width: 2), + Text( + displayName, + style: TextStyle( + fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, + color: isSelected + ? Theme.of(context).colorScheme.primary + : Theme.of(context).colorScheme.onSurface, + ), + ), + ], + ), + ), + ], + ); } } diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/module_tree_details_navbar.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/module_tree_details_navbar.dart index 8883b2c8fd..10d33bc99c 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/ui/module_tree_details_navbar.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/module_tree_details_navbar.dart @@ -2,7 +2,7 @@ // SPDX-License-Identifier: BSD-3-Clause // // module_tree_details_navbar.dart -// UI for module tree details card navrbar. +// UI for module tree details card navbar. // // 2024 January 5 // Author: Yao Jing Quek @@ -13,96 +13,131 @@ import 'package:material_ui/material_ui.dart'; import 'package:rohd_devtools_extension/rohd_devtools/cubit/cubits.dart'; import 'package:rohd_devtools_extension/rohd_devtools/ui/details_help_button.dart'; import 'package:rohd_devtools_extension/rohd_devtools/ui/platform_icon.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/ui/schematic_icon.dart'; +import 'package:rohd_schematic_viewer/schematic_viewer.dart'; +import 'package:rohd_wave_viewer/rohd_wave_viewer.dart'; -/// Navigation bar for switching between module detail views. +/// Navbar for switching between detail tabs. +/// +/// Uses platform icons with emoji fallback for consistent appearance. class ModuleTreeDetailsNavbar extends StatelessWidget { - /// Whether color emoji fonts are available on this platform. + /// Whether the platform supports color emoji. + /// Defaults to true (works for web). On Linux, check with + /// `isEmojiFontInstalled`. final bool hasColorEmoji; - /// Creates the details navigation bar. - const ModuleTreeDetailsNavbar({super.key, this.hasColorEmoji = kIsWeb}); + /// Constructor for [ModuleTreeDetailsNavbar]. + const ModuleTreeDetailsNavbar({super.key, this.hasColorEmoji = true}); @override - - /// Adds diagnostic properties for the nav bar. void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); - properties.add(FlagProperty('hasColorEmoji', - value: hasColorEmoji, ifFalse: 'using fallback emojis')); + properties.add( + FlagProperty( + 'hasColorEmoji', + value: hasColorEmoji, + ifFalse: 'using fallback emojis', + ), + ); } @override - - /// Builds the tab row and help button for module details. Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; - final isDark = Theme.of(context).brightness == Brightness.dark; return DecoratedBox( - decoration: BoxDecoration( - color: colorScheme.surfaceContainerHighest, - border: Border( - bottom: BorderSide(color: Theme.of(context).dividerColor))), - child: BlocBuilder( - builder: (context, selectedTab) => Row(children: [ - _TabButton( - label: 'Details', - icon: platformIcon(Icons.info, 'ℹ️', - size: 18, hasColorEmoji: hasColorEmoji), - isSelected: selectedTab == DetailsTab.details, - onTap: () => context - .read() - .selectTab(DetailsTab.details)), - _TabButton( - label: 'Waveform', - icon: platformIcon(Icons.waves, '🌊', - size: 18, hasColorEmoji: hasColorEmoji), - isSelected: selectedTab == DetailsTab.waveform, - onTap: () => context - .read() - .selectTab(DetailsTab.waveform)), - _TabButton( - label: 'Schematic', - icon: const SchematicIcon(size: 18), - isSelected: selectedTab == DetailsTab.schematic, - onTap: () => context - .read() - .selectTab(DetailsTab.schematic)), - const Spacer(), - DetailsHelpButton(isDark: isDark) - ]))); + decoration: BoxDecoration( + color: colorScheme.surfaceContainerHighest, + border: Border( + bottom: BorderSide(color: Theme.of(context).dividerColor), + ), + ), + child: BlocBuilder( + builder: (context, selectedTab) { + final isDark = Theme.of(context).brightness == Brightness.dark; + return Row( + children: [ + _TabButton( + label: 'Details', + icon: platformIcon( + Icons.info, + 'ℹ️', + size: 18, + hasColorEmoji: hasColorEmoji, + ), + isSelected: selectedTab == DetailsTab.details, + onTap: () => context.read().selectTab( + DetailsTab.details, + ), + ), + _TabButton( + label: 'Waveform', + icon: platformIcon( + Icons.waves, + '🌊', + size: 18, + hasColorEmoji: hasColorEmoji, + ), + isSelected: selectedTab == DetailsTab.waveform, + onTap: () => context.read().selectTab( + DetailsTab.waveform, + ), + ), + _TabButton( + label: 'Schematic', + icon: const SchematicIcon(size: 18), + isSelected: selectedTab == DetailsTab.schematic, + onTap: () => context.read().selectTab( + DetailsTab.schematic, + ), + ), + const Spacer(), + _tabHelpButton(selectedTab, isDark: isDark), + ], + ); + }, + ), + ); + } + + /// Returns the help button matching the currently selected tab. + static Widget _tabHelpButton(DetailsTab tab, {required bool isDark}) { + switch (tab) { + case DetailsTab.waveform: + return WaveViewerHelpButton(isDark: isDark); + case DetailsTab.schematic: + return SchematicHelpButton(isDark: isDark); + case DetailsTab.details: + return DetailsHelpButton(isDark: isDark); + } } } +/// Individual tab button - uses InkWell for hover feedback. +/// The RepaintBoundary at the Scaffold level prevents full app redraws. class _TabButton extends StatelessWidget { - /// The tab text label. final String label; - - /// Icon shown next to the label. final Widget icon; - - /// Whether this tab is currently selected. final bool isSelected; - - /// Callback invoked when the tab is tapped. final VoidCallback onTap; - const _TabButton( - {required this.label, - required this.icon, - required this.isSelected, - required this.onTap}); + const _TabButton({ + required this.label, + required this.icon, + required this.isSelected, + required this.onTap, + }); @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties ..add(StringProperty('label', label)) - ..add(DiagnosticsProperty('icon', icon)) - ..add(DiagnosticsProperty('isSelected', isSelected)) ..add( - ObjectFlagProperty('onTap', onTap, ifNull: 'disabled')); + FlagProperty('isSelected', value: isSelected, ifFalse: 'not selected'), + ) + ..add( + ObjectFlagProperty('onTap', onTap, ifNull: 'disabled'), + ); } @override @@ -111,24 +146,35 @@ class _TabButton extends StatelessWidget { final selectedColor = colorScheme.primary; final unselectedColor = colorScheme.onSurface.withValues(alpha: 0.6); + // InkWell provides hover feedback return InkWell( - onTap: onTap, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: isSelected ? selectedColor : Colors.transparent, - width: 2))), - child: Row(mainAxisSize: MainAxisSize.min, children: [ - icon, - const SizedBox(width: 8), - Text(label, - style: TextStyle( - fontSize: 13, - fontWeight: - isSelected ? FontWeight.bold : FontWeight.normal, - color: isSelected ? selectedColor : unselectedColor)) - ]))); + onTap: onTap, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: isSelected ? selectedColor : Colors.transparent, + width: 2, + ), + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + icon, + const SizedBox(width: 8), + Text( + label, + style: TextStyle( + fontSize: 13, + fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, + color: isSelected ? selectedColor : unselectedColor, + ), + ), + ], + ), + ), + ); } } diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/rohd_design_shell.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/rohd_design_shell.dart new file mode 100644 index 0000000000..01843997d3 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/rohd_design_shell.dart @@ -0,0 +1,493 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// rohd_design_shell.dart +// Terminal-style DevTools client for target-owned ROHD commands. +// +// 2026 August +// Author: Desmond Kirkpatrick + +import 'dart:async'; + +import 'package:file_selector/file_selector.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:material_ui/material_ui.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/cli/rohd_design_dtd_service.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/cli/rohd_shell_output.dart'; + +/// Obtains the current paused-target command proxy. +typedef RohdDesignCommandTargetProvider = Future + Function(); + +/// Obtains optional shell script contents from a user-selected file. +typedef RohdShellScriptLoader = Future Function(); + +/// Broadcasts signal paths selected by a shell command. +typedef RohdShellSignalSender = void Function(List signalPaths); + +class _CompleteCommandIntent extends Intent { + const _CompleteCommandIntent(); +} + +/// A persistent terminal-style client for target-owned ROHD commands. +class RohdDesignShell extends StatefulWidget { + /// Creates a shell that resolves a command target as commands are submitted. + const RohdDesignShell({ + required this.targetProvider, + this.headerActions = const [], + this.scriptLoader, + this.onSendSignals, + this.formatForPath, + super.key, + }); + + /// Provides the current debug target without duplicating command semantics. + final RohdDesignCommandTargetProvider targetProvider; + + /// Actions displayed at the end of the shell header. + final List headerActions; + + /// Optional script loader used instead of the platform file picker. + final RohdShellScriptLoader? scriptLoader; + + /// Receives paths returned by a successful `send` shell command. + final RohdShellSignalSender? onSendSignals; + + /// Resolves the selected display format for a signal path. + final RohdSignalFormatResolver? formatForPath; + + @override + State createState() => _RohdDesignShellState(); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add( + DiagnosticsProperty( + 'targetProvider', + targetProvider, + ), + ) + ..add(IterableProperty('headerActions', headerActions)) + ..add( + ObjectFlagProperty.has( + 'scriptLoader', + scriptLoader, + ), + ) + ..add( + ObjectFlagProperty.has( + 'onSendSignals', + onSendSignals, + ), + ) + ..add( + ObjectFlagProperty.has( + 'formatForPath', + formatForPath, + ), + ); + } +} + +class _RohdDesignShellState extends State { + final _inputController = TextEditingController(); + final _inputFocus = FocusNode(); + final _inputScrollController = ScrollController(); + final _outputController = ScrollController(); + final _entries = <_ShellEntry>[]; + final _history = []; + final _sessionId = 'devtools-${DateTime.now().microsecondsSinceEpoch}'; + var _historyIndex = 0; + var _running = false; + + @override + void dispose() { + _inputController.dispose(); + _inputFocus.dispose(); + _inputScrollController.dispose(); + _outputController.dispose(); + super.dispose(); + } + + Future _submit() async { + final input = _inputController.text.trim(); + _inputController.clear(); + await _execute(input); + } + + Future _execute(String input) async { + if (input.isEmpty || _running) { + return; + } + setState(() { + _entries.add(_ShellEntry(input, isInput: true)); + _history.add(input); + _historyIndex = _history.length; + _running = true; + }); + _scrollToEnd(); + + try { + final target = await widget.targetProvider(); + if (target == null) { + throw StateError('No ROHD debug target is connected.'); + } + final response = await target.command(_sessionId, input); + if (!mounted) { + return; + } + final sentPaths = _sentPaths(input, response); + if (sentPaths != null) { + widget.onSendSignals?.call(sentPaths); + } + final output = RohdShellOutput.pretty( + response, + formatForPath: widget.formatForPath, + ); + setState( + () => _entries.add( + _ShellEntry( + output.text, + isError: output.isError, + isSuccess: !output.isError, + ), + ), + ); + } on Object catch (error) { + if (mounted) { + setState(() => _entries.add(_ShellEntry('$error', isError: true))); + } + } finally { + if (mounted) { + setState(() => _running = false); + _focusPromptAfterBuild(); + _scrollToEnd(); + } + } + } + + static List? _sentPaths(String input, Map response) { + if (!RegExp(r'^send(?:\s|$)').hasMatch(input.trim()) || + response['ok'] != true) { + return null; + } + final result = response['result']; + if (result is! Map || result['paths'] is! List) { + return null; + } + return (result['paths'] as List).whereType().toList(); + } + + Future _loadScript() async { + if (_running) { + return; + } + try { + final script = await (widget.scriptLoader ?? _pickScript)(); + if (script == null || !mounted) { + return; + } + for (final line in script.split(RegExp(r'\r?\n'))) { + final input = line.trim(); + if (input.isEmpty || input.startsWith('#')) { + continue; + } + await _execute(input); + } + } on Object catch (error) { + if (mounted) { + setState(() => _entries.add(_ShellEntry('$error', isError: true))); + _scrollToEnd(); + } + } + } + + static Future _pickScript() async { + const typeGroup = XTypeGroup( + label: 'ROHD shell scripts', + extensions: ['rohd', 'rohdsh', 'txt'], + ); + final file = await openFile(acceptedTypeGroups: [typeGroup]); + return await file?.readAsString(); + } + + Future _complete() async { + if (_running) { + return; + } + final selection = _inputController.selection; + final cursor = + selection.isValid ? selection.baseOffset : _inputController.text.length; + final target = await widget.targetProvider(); + if (target == null || !mounted) { + return; + } + try { + final response = await target.complete( + _sessionId, + _inputController.text, + cursor, + ); + final items = response['items']; + if (response['ok'] != true || items is! List) { + return; + } + final candidates = items.whereType().toList(); + if (candidates.isEmpty) { + return; + } + final start = _tokenStart(_inputController.text, cursor); + final replacement = _sharedPrefix(candidates); + final prefix = _inputController.text.substring(start, cursor); + if (replacement.length > prefix.length) { + final value = _inputController.text; + _inputController.value = TextEditingValue( + text: + value.substring(0, start) + replacement + value.substring(cursor), + selection: TextSelection.collapsed( + offset: start + replacement.length, + ), + ); + _scrollInputToEnd(); + } else if (candidates.length > 1 && mounted) { + setState(() => _entries.add(_ShellEntry(candidates.join(' ')))); + _scrollToEnd(); + } + } on Object catch (error) { + if (mounted) { + setState(() => _entries.add(_ShellEntry('$error', isError: true))); + } + } + } + + void _moveHistory(int delta) { + if (_history.isEmpty) { + return; + } + final index = (_historyIndex + delta).clamp(0, _history.length); + setState(() { + _historyIndex = index; + _inputController.text = index == _history.length ? '' : _history[index]; + _inputController.selection = TextSelection.collapsed( + offset: _inputController.text.length, + ); + }); + } + + KeyEventResult _handleKey(FocusNode _, KeyEvent event) { + if (event is! KeyDownEvent) { + return KeyEventResult.ignored; + } + if (event.logicalKey == LogicalKeyboardKey.tab) { + unawaited(_complete()); + return KeyEventResult.handled; + } + if (event.logicalKey == LogicalKeyboardKey.arrowUp) { + _moveHistory(-1); + return KeyEventResult.handled; + } + if (event.logicalKey == LogicalKeyboardKey.arrowDown) { + _moveHistory(1); + return KeyEventResult.handled; + } + return KeyEventResult.ignored; + } + + void _scrollToEnd() { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (_outputController.hasClients) { + _outputController.jumpTo(_outputController.position.maxScrollExtent); + } + }); + } + + void _scrollInputToEnd() { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (_inputScrollController.hasClients) { + _inputScrollController.jumpTo( + _inputScrollController.position.maxScrollExtent, + ); + } + }); + } + + void _focusPrompt() { + if (!_running && !_inputFocus.hasFocus) { + _inputFocus.requestFocus(); + } + } + + void _focusPromptAfterBuild() { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + _focusPrompt(); + } + }); + } + + @override + Widget build(BuildContext context) { + final colors = Theme.of(context).colorScheme; + return MouseRegion( + onEnter: (_) => _focusPrompt(), + onHover: (_) => _focusPrompt(), + child: Material( + color: colors.surface, + child: Column( + children: [ + Container( + height: 36, + padding: const EdgeInsets.symmetric(horizontal: 12), + color: colors.surfaceContainerHighest, + child: Row( + children: [ + Expanded( + child: Text( + 'ROHD Debug Shell', + style: Theme.of(context).textTheme.titleSmall, + ), + ), + IconButton( + icon: const Icon(Icons.upload_file), + onPressed: _running ? null : _loadScript, + tooltip: 'Load shell script', + ), + ...widget.headerActions, + ], + ), + ), + Expanded( + child: ListView.builder( + controller: _outputController, + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), + itemCount: _entries.length, + itemBuilder: (context, index) { + final entry = _entries[index]; + final outputColor = entry.isError + ? colors.error + : entry.isSuccess + ? colors.brightness == Brightness.dark + ? Colors.lightGreenAccent.shade400 + : Colors.green.shade800 + : null; + return SelectableText( + entry.isInput ? 'rohd> ${entry.value}' : entry.value, + style: TextStyle( + color: outputColor, + fontFamily: 'monospace', + ), + ); + }, + ), + ), + const Divider(height: 1), + Shortcuts( + shortcuts: const { + SingleActivator(LogicalKeyboardKey.tab): + _CompleteCommandIntent(), + }, + child: Actions( + actions: { + _CompleteCommandIntent: + CallbackAction<_CompleteCommandIntent>( + onInvoke: (_) { + unawaited(_complete()); + return null; + }, + ), + }, + child: Focus( + onKeyEvent: _handleKey, + child: TextField( + controller: _inputController, + focusNode: _inputFocus, + scrollController: _inputScrollController, + autofocus: true, + enabled: !_running, + onSubmitted: (_) => _submit(), + decoration: InputDecoration( + prefixText: 'rohd> ', + suffixIcon: Row( + mainAxisSize: MainAxisSize.min, + children: [ + IconButton( + icon: const Icon(Icons.tab), + onPressed: _running ? null : _complete, + tooltip: 'Complete command', + ), + IconButton( + icon: _running + ? const SizedBox.square( + dimension: 16, + child: CircularProgressIndicator( + strokeWidth: 2, + ), + ) + : const Icon(Icons.arrow_upward), + onPressed: _running ? null : _submit, + tooltip: 'Run command', + ), + ], + ), + border: InputBorder.none, + contentPadding: const EdgeInsets.symmetric( + horizontal: 12, + ), + ), + style: const TextStyle(fontFamily: 'monospace'), + ), + ), + ), + ), + ], + ), + ), + ); + } + + static int _tokenStart(String input, int cursor) { + var start = cursor.clamp(0, input.length); + while (start > 0 && !RegExp(r'\s').hasMatch(input[start - 1])) { + start--; + } + return start; + } + + static String _sharedPrefix(Iterable candidates) { + final values = candidates.toList(growable: false); + if (values.isEmpty) { + return ''; + } + var prefix = values.first; + for (final value in values.skip(1)) { + var length = 0; + while (length < prefix.length && + length < value.length && + prefix.codeUnitAt(length) == value.codeUnitAt(length)) { + length++; + } + prefix = prefix.substring(0, length); + } + return prefix; + } +} + +class _ShellEntry { + const _ShellEntry( + this.value, { + this.isInput = false, + this.isError = false, + this.isSuccess = false, + }); + + final String value; + final bool isInput; + final bool isError; + final bool isSuccess; +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/rohd_shell_help_button.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/rohd_shell_help_button.dart new file mode 100644 index 0000000000..d31debce9c --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/rohd_shell_help_button.dart @@ -0,0 +1,46 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// rohd_shell_help_button.dart +// Help button for the target-backed ROHD debug shell. + +import 'package:flutter/foundation.dart'; +import 'package:material_ui/material_ui.dart'; +import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart'; + +/// A help button for the ROHD debug shell command reference. +class RohdShellHelpButton extends StatelessWidget { + /// Creates a shell command reference button. + const RohdShellHelpButton({ + required this.isDark, + this.hasColorEmoji = true, + super.key, + }); + + /// Whether the current theme is dark mode. + final bool isDark; + + /// Whether color emoji rendering is available on this platform. + final bool hasColorEmoji; + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add(DiagnosticsProperty('isDark', isDark)) + ..add(DiagnosticsProperty('hasColorEmoji', hasColorEmoji)); + } + + @override + Widget build(BuildContext context) => MarkdownHelpButton( + assetPath: 'assets/help/rohd_shell_help.md', + isDark: isDark, + labelIcon: hasColorEmoji + ? null + : Icon( + Icons.help_outline, + size: 18, + color: isDark ? Colors.white70 : Colors.black54, + ), + ); +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/signal_details_card.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/signal_details_card.dart index d1eaac830d..38b5203e3f 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/ui/signal_details_card.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/signal_details_card.dart @@ -7,40 +7,63 @@ // 2024 January 5 // Author: Yao Jing Quek -import 'dart:async'; +import 'dart:async' show unawaited; import 'package:flutter/foundation.dart'; import 'package:material_ui/material_ui.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/cubit/snapshot_cubit.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/cubit/cubits.dart'; import 'package:rohd_devtools_extension/rohd_devtools/models/tree_model.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/ui/details_help_button.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/ui/platform_icon.dart'; import 'package:rohd_devtools_extension/rohd_devtools/ui/signal_table.dart'; import 'package:rohd_devtools_extension/rohd_devtools/ui/signal_table_text_field.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/ui/simulation_time_display.dart'; -import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart'; +import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart' + show AvailableSourceFormats, GoToSourceCallback, RohdSourceFormat; -/// Shows the selected module's signal details and search controls. +/// Card that displays signal details for a selected module. class SignalDetailsCard extends StatefulWidget { - /// The module currently selected for inspection. + /// The selected module whose signals are to be displayed. final TreeModel? module; /// Optional snapshot data to overlay signal values. final SnapshotLoaded? snapshot; - /// Display settings for simulation time values. - final SimulationTimeDisplay timeDisplay; + /// Optional fallback for signals missing from the snapshot. + final ({String value, bool computed})? Function(String signalPath)? + _signalValueFallback; - /// Creates a signal details card for the selected module. + /// Called to eagerly expand a module's connectivity (slim → full JSON) + /// so that the evaluator can compute internal signal values. + /// + /// Takes the module's instance path (e.g. `"top/adder0"`). + final Future Function(String moduleInstancePath)? _onExpandModule; + + /// Callback to send selected signal paths to waveform/schematic viewers. + final void Function(List signalPaths)? _onSendSignals; + + /// Callback to navigate to a signal's source for a chosen [RohdSourceFormat]. + final GoToSourceCallback? _onGoToSource; + + /// Discovers which source formats are navigable for the current module. + final AvailableSourceFormats? _availableSourceFormats; + + /// Creates a [SignalDetailsCard] with the given selected module. const SignalDetailsCard({ super.key, this.module, this.snapshot, - this.timeDisplay = SimulationTimeDisplay.none, - }); + ({String value, bool computed})? Function(String signalPath)? + signalValueFallback, + Future Function(String moduleInstancePath)? onExpandModule, + void Function(List signalPaths)? onSendSignals, + GoToSourceCallback? onGoToSource, + AvailableSourceFormats? availableSourceFormats, + }) : _signalValueFallback = signalValueFallback, + _onExpandModule = onExpandModule, + _onSendSignals = onSendSignals, + _onGoToSource = onGoToSource, + _availableSourceFormats = availableSourceFormats; @override - - /// Creates the mutable state for [SignalDetailsCard]. SignalDetailsCardState createState() => SignalDetailsCardState(); @override @@ -48,134 +71,252 @@ class SignalDetailsCard extends StatefulWidget { super.debugFillProperties(properties); properties ..add(DiagnosticsProperty('module', module)) - ..add(DiagnosticsProperty('snapshot', snapshot)) - ..add(DiagnosticsProperty( - 'timeDisplay', timeDisplay)); + ..add(DiagnosticsProperty('snapshot', snapshot)); } } /// State for [SignalDetailsCard]. class SignalDetailsCardState extends State { - /// Search term used to filter signals. - String? searchTerm; - - /// Whether input signals are shown. - ValueNotifier inputSelected = ValueNotifier(true); - - /// Whether output signals are shown. - ValueNotifier outputSelected = ValueNotifier(true); - - /// Whether inout signals are shown. - ValueNotifier inoutSelected = ValueNotifier(true); - - /// Notifies the widget tree to rebuild after filter changes. - ValueNotifier notifier = ValueNotifier(0); - - /// Boundary used when exporting the signal details panel as PNG. - final GlobalKey _boundaryKey = GlobalKey(); - - /// Increments the rebuild notifier. - void toggleNotifier() => notifier.value++; - - void _showFilterDialog() { - unawaited(showDialog( - context: context, - builder: (context) => StatefulBuilder( - builder: (context, setState) => AlertDialog( - title: const Text('Filter Signals'), - content: - Column(mainAxisSize: MainAxisSize.min, children: [ - CheckboxListTile( - title: const Text('Input'), - value: inputSelected.value, - onChanged: (value) { - setState(() { - inputSelected.value = value!; - }); - toggleNotifier(); - }), - CheckboxListTile( - title: const Text('Output'), - value: outputSelected.value, - onChanged: (value) { - setState(() { - outputSelected.value = value!; - }); - toggleNotifier(); - }), - CheckboxListTile( - title: const Text('Inout'), - value: inoutSelected.value, - onChanged: (value) { - setState(() { - inoutSelected.value = value!; - }); - toggleNotifier(); - }) - ]))))); - } + /// The current search term for filtering signals. + String? _searchTerm; @override + void didUpdateWidget(covariant SignalDetailsCard oldWidget) { + super.didUpdateWidget(oldWidget); + // When the selected module changes and internals are already visible, + // eagerly expand the new module's child definitions so the evaluator + // has full connectivity data before signals are rendered. + if (widget.module?.path() != oldWidget.module?.path() && + _internalsSelected.value) { + unawaited(_expandModuleIfNeeded()); + } + } + + /// Notifiers for input and output signal filters. + final ValueNotifier _inputSelected = ValueNotifier(true); + + /// Notifiers for input and output signal filters. + final ValueNotifier _outputSelected = ValueNotifier(true); + + /// Notifier for inout signal filter. + final ValueNotifier _inoutSelected = ValueNotifier(true); - /// Builds the signal details panel for the selected module. + /// Whether internal signals are shown. + final ValueNotifier _internalsSelected = ValueNotifier(false); + + /// Notifier to trigger rebuilds. + final ValueNotifier _notifier = ValueNotifier(0); + + /// Toggles the notifier to trigger a rebuild. + void toggleNotifier() { + _notifier.value++; + } + + Future _showFilterDialog() async { + await showDialog( + context: context, + builder: (context) => StatefulBuilder( + builder: (context, setState) => AlertDialog( + title: const Text('Filter Signals'), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + CheckboxListTile( + title: const Text('Input'), + value: _inputSelected.value, + onChanged: (value) { + setState(() { + _inputSelected.value = value!; + }); + toggleNotifier(); + }, + ), + CheckboxListTile( + title: const Text('Output'), + value: _outputSelected.value, + onChanged: (value) { + setState(() { + _outputSelected.value = value!; + }); + toggleNotifier(); + }, + ), + CheckboxListTile( + title: const Text('Inout'), + value: _inoutSelected.value, + onChanged: (value) { + setState(() { + _inoutSelected.value = value!; + }); + toggleNotifier(); + }, + ), + CheckboxListTile( + title: const Text('Internal'), + value: _internalsSelected.value, + onChanged: (value) async { + setState(() { + _internalsSelected.value = value!; + }); + if (value!) { + await _expandModuleIfNeeded(); + } + toggleNotifier(); + }, + ), + ], + ), + ), + ), + ); + } + + @override Widget build(BuildContext context) { if (widget.module == null) { return const Padding( - padding: EdgeInsets.only(top: 20), - child: Center(child: Text('No module selected'))); + padding: EdgeInsets.only(top: 20), + child: Center(child: Text('No module selected')), + ); } - final isDark = Theme.of(context).brightness == Brightness.dark; - - return Stack(fit: StackFit.expand, children: [ - RepaintBoundary( - key: _boundaryKey, - child: SingleChildScrollView( - child: Column(children: [ + return SizedBox( + height: MediaQuery.of(context).size.height / 1.4, + child: SingleChildScrollView( + child: Column( + children: [ + // Snapshot header banner + if (widget.snapshot != null) + Container( + width: double.infinity, + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 6, + ), + margin: const EdgeInsets.only(bottom: 4), + decoration: BoxDecoration( + color: Theme.of(context) + .colorScheme + .primaryContainer + .withValues(alpha: 0.5), + borderRadius: BorderRadius.circular(4), + ), + child: Row( + children: [ + Icon( + Icons.camera_alt, + size: 16, + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), + const SizedBox(width: 8), + Text( + 'Snapshot @ ${widget.snapshot!.time}' + ' (${widget.snapshot!.signals.length} signals)', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), + ), + ], + ), + ), Padding( - padding: const EdgeInsets.all(8), - child: Row(children: [ + padding: const EdgeInsets.all(8), + child: Row( + children: [ SignalTableTextField( - labelText: 'Search Signals', - onChanged: (value) { - setState(() { - searchTerm = value; - }); - toggleNotifier(); - }), + labelText: 'Search Signals', + onChanged: (value) { + setState(() { + _searchTerm = value; + }); + toggleNotifier(); + }, + ), IconButton( - icon: const Icon(Icons.filter_list), - onPressed: _showFilterDialog), - DetailsHelpButton(isDark: isDark) - ])), + icon: const Icon(Icons.filter_list), + onPressed: _showFilterDialog, + ), + ValueListenableBuilder( + valueListenable: _internalsSelected, + builder: (context, active, _) => IconButton( + icon: platformIcon( + active ? Icons.visibility : Icons.visibility_off, + active ? '👁' : '🚫', + color: active ? null : Theme.of(context).disabledColor, + ), + tooltip: active + ? 'Hide internal signals' + : 'Show internal signals', + onPressed: () async { + final nowActive = !active; + _internalsSelected.value = nowActive; + if (nowActive) { + await _expandModuleIfNeeded(); + } + toggleNotifier(); + }, + ), + ), + ], + ), + ), ValueListenableBuilder( - valueListenable: notifier, - builder: (context, _, __) => SignalTable( - selectedModule: widget.module!, - searchTerm: searchTerm, - inputSelectedVal: inputSelected.value, - outputSelectedVal: outputSelected.value, - inoutSelectedVal: inoutSelected.value, - snapshot: widget.snapshot, - timeDisplay: widget.timeDisplay)) - ]))), - Positioned( - right: 8, - bottom: 8, - child: ExportPngButton( - onPressed: () => captureBoundaryToPng(context, - boundaryKey: _boundaryKey, filePrefix: 'signal_details'))) - ]); + valueListenable: _notifier, + builder: (context, _, __) => SignalTable( + selectedModule: widget.module!, + searchTerm: _searchTerm, + inputSelectedVal: _inputSelected.value, + outputSelectedVal: _outputSelected.value, + inoutSelectedVal: _inoutSelected.value, + internalsSelectedVal: _internalsSelected.value, + snapshot: widget.snapshot, + signalValueFallback: widget._signalValueFallback, + onSendSignals: widget._onSendSignals, + onGoToSource: widget._onGoToSource, + availableSourceFormats: widget._availableSourceFormats, + ), + ), + ], + ), + ), + ); + } + + /// Eagerly expand the selected module's connectivity when the + /// internals toggle is activated. + Future _expandModuleIfNeeded() async { + final modulePath = widget.module?.path(); + if (modulePath == null) { + return; + } + await widget._onExpandModule?.call(modulePath); } @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties - ..add(StringProperty('searchTerm', searchTerm)) - ..add(DiagnosticsProperty('inputSelected', inputSelected.value)) - ..add(DiagnosticsProperty('outputSelected', outputSelected.value)) - ..add(DiagnosticsProperty('inoutSelected', inoutSelected.value)) - ..add(IntProperty('notifier', notifier.value)); + ..add(StringProperty('searchTerm', _searchTerm)) + ..add( + DiagnosticsProperty>( + 'inputSelected', + _inputSelected, + ), + ) + ..add( + DiagnosticsProperty>( + 'outputSelected', + _outputSelected, + ), + ) + ..add( + DiagnosticsProperty>( + 'inoutSelected', + _inoutSelected, + ), + ) + ..add(DiagnosticsProperty>('notifier', _notifier)); } } diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/signal_table.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/signal_table.dart index 4db607e61d..1b3afaf54a 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/ui/signal_table.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/signal_table.dart @@ -7,52 +7,96 @@ // 2024 January 5 // Author: Yao Jing Quek +import 'dart:async' show unawaited; + import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; import 'package:material_ui/material_ui.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/cubit/snapshot_cubit.dart'; +import 'package:rohd/rohd.dart' hide State; +import 'package:rohd_devtools_extension/rohd_devtools/cubit/cubits.dart'; import 'package:rohd_devtools_extension/rohd_devtools/models/signal_model.dart'; import 'package:rohd_devtools_extension/rohd_devtools/models/tree_model.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/services/services.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/ui/simulation_time_display.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/utils/regex_utils.dart'; +import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart' + show + AvailableSourceFormats, + BitDefineFieldsAction, + BitExpandRangeAction, + BitFieldUtils, + GoToSourceCallback, + RohdSourceFormat, + SignalValueFormat, + SignalValueFormatRegistry, + TypeFieldNode, + buildBitExpansionMenuItems, + buildGotoSourceMenuItems, + expandLogicType, + formatFieldValue, + gotoSourceFormatFromValue, + hexToBinary, + kDefaultNavigableFormats, + resolveBitExpansionMenuValue, + showSignalValueFormatMenu, + signalValueFormatMenuValue; +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; -/// Displays the signals for a selected module in a table. +/// Widget that displays a table of signals for a selected module. class SignalTable extends StatefulWidget { - /// The module whose signals are shown in the table. + /// The selected module whose signals are to be displayed. final TreeModel selectedModule; - /// Optional search term used to filter visible signals. + /// The search term for filtering signals. final String? searchTerm; - /// Whether input signals should be shown. + /// Whether input signals are selected for display. final bool inputSelectedVal; - /// Whether output signals should be shown. + /// Whether output signals are selected for display. final bool outputSelectedVal; - /// Whether inout signals should be shown. + /// Whether inout signals are selected for display. final bool inoutSelectedVal; + /// Whether internal signals are selected for display. + final bool internalsSelectedVal; + /// Optional snapshot data to overlay signal values. final SnapshotLoaded? snapshot; - /// Display settings for simulation time values. - final SimulationTimeDisplay timeDisplay; + /// Optional fallback for signals missing from the snapshot. + /// + /// Called with the signal's [SignalOccurrence.path]. Returns a value/computed + /// pair when the client-side evaluator can derive the value, or `null`. + final ({String value, bool computed})? Function(String signalPath)? + signalValueFallback; - /// Creates a signal table for the given module and filters. - const SignalTable( - {required this.selectedModule, - required this.searchTerm, - required this.inputSelectedVal, - required this.outputSelectedVal, - required this.inoutSelectedVal, - this.snapshot, - this.timeDisplay = SimulationTimeDisplay.none, - super.key}); + /// Callback to send selected signal paths to waveform/schematic viewers. + final void Function(List signalPaths)? onSendSignals; - @override + /// Callback to navigate to a signal's source for a chosen [RohdSourceFormat]. + final GoToSourceCallback? onGoToSource; - /// Creates the state object for [SignalTable]. - State createState() => _SignalTableState(); + /// Discovers which source formats are navigable for the current module. + final AvailableSourceFormats? availableSourceFormats; + + /// Creates a [SignalTable] with the given parameters. + const SignalTable({ + required this.selectedModule, + required this.searchTerm, + required this.inputSelectedVal, + required this.outputSelectedVal, + required this.inoutSelectedVal, + this.internalsSelectedVal = false, + this.snapshot, + this.signalValueFallback, + this.onSendSignals, + this.onGoToSource, + this.availableSourceFormats, + super.key, + }); + + @override + State createState() => _SignalTableState(); @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { @@ -63,106 +107,1580 @@ class SignalTable extends StatefulWidget { ..add(DiagnosticsProperty('inputSelectedVal', inputSelectedVal)) ..add(DiagnosticsProperty('outputSelectedVal', outputSelectedVal)) ..add(DiagnosticsProperty('inoutSelectedVal', inoutSelectedVal)) + ..add( + DiagnosticsProperty('internalsSelectedVal', internalsSelectedVal), + ) ..add(DiagnosticsProperty('snapshot', snapshot)) - ..add(DiagnosticsProperty( - 'timeDisplay', timeDisplay)); + ..add( + ObjectFlagProperty< + ({bool computed, String value})? Function( + String signalPath)?>.has( + 'signalValueFallback', signalValueFallback), + ) + ..add( + ObjectFlagProperty signalPaths)?>.has( + 'onSendSignals', + onSendSignals, + ), + ) + ..add( + ObjectFlagProperty.has( + 'onGoToSource', + onGoToSource, + ), + ) + ..add( + ObjectFlagProperty.has( + 'availableSourceFormats', + availableSourceFormats, + ), + ); } } class _SignalTableState extends State { + /// Current sort column index (null = unsorted). + int? _sortColumnIndex; + + /// True = ascending, false = descending. + bool _sortAscending = true; + + /// Indices of selected rows (for multi-select). + final Set _selectedIndices = {}; + + /// Signal paths that are currently expanded to show sub-fields. + final Set _expandedSignals = {}; + + /// Sub-field paths expanded within the type tree (e.g. + /// "top.mod.sig/field" or "top.mod.sig/[0]"). + /// Only one hierarchy level is shown per expansion. + final Set _expandedSubFields = {}; + + /// Index of the last single-clicked row (anchor for Shift-click ranges). + int? _lastClickedIndex; + + /// Key of the currently selected sub-field row (null = none). + /// + /// Sub-fields are not part of the flat row index space, so they use their + /// hierarchical key (e.g. `top.mod.sig/field/sub`) as the selection identity + /// instead of an integer index. + String? _selectedSubFieldKey; + + @override + void initState() { + super.initState(); + SignalValueFormatRegistry.changes.addListener(_onFormatChange); + } + + @override + void dispose() { + SignalValueFormatRegistry.changes.removeListener(_onFormatChange); + super.dispose(); + } + + void _onFormatChange() { + if (mounted) { + setState(() {}); + } + } + @override + void didUpdateWidget(covariant SignalTable oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.selectedModule != oldWidget.selectedModule || + widget.searchTerm != oldWidget.searchTerm || + widget.inputSelectedVal != oldWidget.inputSelectedVal || + widget.outputSelectedVal != oldWidget.outputSelectedVal || + widget.internalsSelectedVal != oldWidget.internalsSelectedVal) { + _selectedIndices.clear(); + _lastClickedIndex = null; + _selectedSubFieldKey = null; + } + } - /// Builds the signal table and its rows. + void _onRowTap(int index) { + setState(() { + _selectedSubFieldKey = null; + final keys = HardwareKeyboard.instance.logicalKeysPressed; + final isShift = keys.contains(LogicalKeyboardKey.shiftLeft) || + keys.contains(LogicalKeyboardKey.shiftRight); + final isCtrl = keys.contains(LogicalKeyboardKey.controlLeft) || + keys.contains(LogicalKeyboardKey.controlRight) || + keys.contains(LogicalKeyboardKey.metaLeft) || + keys.contains(LogicalKeyboardKey.metaRight); + + if (isShift && _lastClickedIndex != null) { + final lo = _lastClickedIndex! < index ? _lastClickedIndex! : index; + final hi = _lastClickedIndex! < index ? index : _lastClickedIndex!; + for (var i = lo; i <= hi; i++) { + _selectedIndices.add(i); + } + } else if (isCtrl) { + if (_selectedIndices.contains(index)) { + _selectedIndices.remove(index); + } else { + _selectedIndices.add(index); + } + } else { + _selectedIndices + ..clear() + ..add(index); + } + _lastClickedIndex = index; + }); + } + + /// Filter signals by name, fullPath, or path(). + /// + /// Supports regex patterns (auto-detected by metacharacter presence). + /// Plain text uses case-insensitive prefix matching on name and + /// path(); regex uses `hasMatch` across all three fields. + static List _filterSignals( + List signals, + String searchTerm, + ) { + if (searchTerm.isEmpty) { + return signals; + } + + final hasRegexMeta = regExpHasMatch(r'[.*+?^${}()|[\]\\]', searchTerm); + + if (hasRegexMeta) { + try { + final re = regExpPattern(searchTerm, caseSensitive: false); + return signals + .where( + (s) => + s.name.contains(re) || + s.path().contains(re) || + s.path().contains(re), + ) + .toList(); + } on FormatException catch (_) { + // Invalid regex — fall back to plain prefix match. + final lower = searchTerm.toLowerCase(); + return signals + .where( + (s) => + s.name.toLowerCase().startsWith(lower) || + s.path().toLowerCase().startsWith(lower), + ) + .toList(); + } + } else { + // Plain text: case-insensitive prefix match. + final lower = searchTerm.toLowerCase(); + return signals + .where( + (s) => + s.name.toLowerCase().startsWith(lower) || + s.path().toLowerCase().startsWith(lower), + ) + .toList(); + } + } + + /// Format a signal value for display using ROHD's radixString format. + /// + /// Values arriving from the VM or evaluators are already in radixString + /// format (`'h`). This method normalises legacy `0x`/binary + /// formats and passes well-formed radixStrings through. + String _formatValue(String? value, {int? width}) { + if (value == null) { + return ''; + } + + final v = value.trim().replaceAll('\u0000', ''); + if (v.isEmpty) { + return v; + } + + // Already a radixString (e.g. 16'hfffe, 8'bxxxx0101) — pass through. + if (regExpHasMatch(r"^\d+'[bqodh]", v)) { + return v; + } + + // Legacy 0x / 0b / bare value — convert via LogicValue. + final w = (width != null && width > 0) ? width : 1; + try { + final lower = v.toLowerCase(); + BigInt? parsed; + if (lower.startsWith('0x')) { + parsed = BigInt.tryParse(lower.substring(2), radix: 16); + } else if (lower.startsWith('0b')) { + parsed = BigInt.tryParse(lower.substring(2), radix: 2); + } else { + parsed = BigInt.tryParse(lower); + } + if (parsed != null) { + return LogicValue.ofBigInt(parsed, w).toString(); + } + return v; + } on Object { + return v; + } + } + + @override Widget build(BuildContext context) { final snapshotTime = widget.snapshot?.time; - final valueHeader = snapshotTime != null - ? 'Value (@ ${widget.timeDisplay.format(snapshotTime)})' - : 'Value'; - final tableHeaders = ['Name', 'Direction', valueHeader, 'Width']; + final valueHeader = + snapshotTime != null ? 'Value (@ $snapshotTime)' : 'Value'; + final tableHeaders = ['Name', 'Bits', 'Direction', valueHeader]; + + // Collect all signals matching the current filters. + final allRows = _collectSignals( + widget.selectedModule, + inputSelected: widget.inputSelectedVal, + outputSelected: widget.outputSelectedVal, + inoutSelected: widget.inoutSelectedVal, + internalsSelected: widget.internalsSelectedVal, + searchTerm: widget.searchTerm, + ); + + // Sort if a column is selected. + if (_sortColumnIndex != null) { + allRows.sort((a, b) { + final cmp = switch (_sortColumnIndex!) { + 0 => a.name.toLowerCase().compareTo(b.name.toLowerCase()), + 1 => a.width.compareTo(b.width), + 2 => (a.direction ?? 'internal').compareTo(b.direction ?? 'internal'), + 3 => (_lookupValue(a) ?? '').compareTo(_lookupValue(b) ?? ''), + _ => 0, + }; + return _sortAscending ? cmp : -cmp; + }); + } return Table( - border: TableBorder.all(), - columnWidths: const { - 0: FlexColumnWidth(), - 1: FlexColumnWidth(), - 2: FlexColumnWidth() - }, - defaultVerticalAlignment: TableCellVerticalAlignment.middle, - children: [ - TableRow( - children: List.generate(tableHeaders.length, - (index) => _buildTableHeader(text: tableHeaders[index]))), - ...generateSignalsRow(widget.selectedModule, - searchTerm: widget.searchTerm, - inputSelected: widget.inputSelectedVal, - outputSelected: widget.outputSelectedVal, - inoutSelected: widget.inoutSelectedVal) - ]); - } - - /// Builds the rows for the signals that match the selected filters. - List generateSignalsRow(TreeModel module, - {required String? searchTerm, - required bool inputSelected, - required bool outputSelected, - required bool inoutSelected}) { - final rows = []; + border: TableBorder.all(), + columnWidths: const { + 0: FlexColumnWidth(2), + 1: IntrinsicColumnWidth(), + 2: IntrinsicColumnWidth(), + 3: FlexColumnWidth(2), + }, + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + children: [ + TableRow( + children: List.generate( + tableHeaders.length, + (index) => _buildSortableHeader( + text: tableHeaders[index], + columnIndex: index, + ), + ), + ), + for (var i = 0; i < allRows.length; i++) ...[ + _generateSignalRow(i, allRows), + if (_expandedSignals.contains(allRows[i].path())) + ..._generateSubFieldRows(allRows[i]), + ], + ], + ); + } + + /// Look up the display value for a signal (snapshot or live). + String? _lookupValue(SignalModel signal) { + final snapshotData = widget.snapshot; + if (snapshotData != null) { + final ss = snapshotData.getSignal(signal.path()) ?? + snapshotData.getSignalByName(signal.name); + if (ss?.value != null) { + return ss!.value; + } + } + return signal.value; + } - // Filter signals - final inputSignals = inputSelected - ? SignalService.filterSignals(module.inputs, searchTerm ?? '') - : []; - final outputSignals = outputSelected - ? SignalService.filterSignals(module.outputs, searchTerm ?? '') - : []; - final inoutSignals = inoutSelected - ? SignalService.filterSignals(module.inouts, searchTerm ?? '') - : []; - // Add input from signal model list to row - for (final signal in inputSignals) { - rows.add(_generateSignalRow(signal)); + /// Collect filtered signals as a single flat list. + List _collectSignals( + TreeModel module, { + required bool inputSelected, + required bool outputSelected, + required bool inoutSelected, + bool internalsSelected = false, + String? searchTerm, + }) { + final result = []; + if (inputSelected) { + result.addAll(_filterSignals(module.inputs, searchTerm ?? '')); } + if (outputSelected) { + result.addAll(_filterSignals(module.outputs, searchTerm ?? '')); + } + if (inoutSelected) { + result.addAll(_filterSignals(module.inouts, searchTerm ?? '')); + } + if (internalsSelected) { + // Collect sub-field names from struct/array parents so we keep only + // top-level LogicArrays and LogicStructures (user can expand them + // via the caret). + final allInternals = + module.signals.where((s) => s.direction == null).toList(); + final subFieldNames = {}; + for (final s in allInternals) { + if (s.isStruct || s.isArray) { + for (final d in s.subFieldDescriptors) { + subFieldNames.add(d.expectedName); + } + } + } + result.addAll( + _filterSignals( + allInternals.where((s) => !subFieldNames.contains(s.name)).toList(), + searchTerm ?? '', + ), + ); + } + return result; + } + + TableRow _generateSignalRow(int index, List allRows) { + final signal = allRows[index]; + final isSelected = _selectedIndices.contains(index); - // Add output from signal model list to row - for (final signal in outputSignals) { - rows.add(_generateSignalRow(signal)); + // Look up snapshot value: try by hierarchy path first, then by name + final snapshotData = widget.snapshot; + SignalSnapshot? snapshotSignal; + if (snapshotData != null) { + snapshotSignal = snapshotData.getSignal(signal.path()) ?? + snapshotData.getSignalByName(signal.name); + } + var snapshotValue = snapshotSignal?.value; + var isComputed = snapshotSignal?.computed ?? false; + + // Fallback: evaluate via client-side netlist evaluator when the + // snapshot doesn't contain the signal (untracked / computed). + // A signal present in the snapshot has an authoritative value — + // even 'x', which is a valid simulation value (unknown/don't-care). + if (snapshotValue == null && widget.signalValueFallback != null) { + final eval = widget.signalValueFallback!(signal.path()); + if (eval != null) { + snapshotValue = eval.value; + isComputed = eval.computed; + } } - for (final signal in inoutSignals) { - rows.add(_generateSignalRow(signal)); + final displayValue = snapshotValue ?? signal.value; + final isSnapshotValue = snapshotValue != null; + final selectedIndices = + _selectedIndices.contains(index) ? _selectedIndices : {index}; + void setSelectedFormat(SignalValueFormat format) { + SignalValueFormatRegistry.setFormatFor( + selectedIndices + .where((selectedIndex) => selectedIndex < allRows.length) + .map((selectedIndex) => allRows[selectedIndex].address) + .whereType(), + format, + ); } + // Determine which signals to send (selected set, or just this row). + VoidCallback? sendHandler; + String sendLabel; + if (widget.onSendSignals != null) { + sendLabel = selectedIndices.length > 1 + ? 'Send ${selectedIndices.length} Signals' + : 'Send Signal'; + sendHandler = () { + final paths = selectedIndices + .where((i) => i < allRows.length) + .map((i) => allRows[i].path()) + .toList(); + widget.onSendSignals!(paths); + }; + } else { + sendLabel = 'Send Signal'; + } + + // Determine the paths to navigate to (selected set, or just this row). + List? goToPaths; + if (widget.onGoToSource != null) { + goToPaths = selectedIndices + .where((i) => i < allRows.length) + .map((i) => allRows[i].path()) + .toList(); + } + + Widget wrapTap(Widget child) => + GestureDetector(onTap: () => _onRowTap(index), child: child); + + final formattedValue = SignalValueFormatRegistry.formatValue( + _formatValue(displayValue, width: signal.width), + SignalValueFormatRegistry.formatForAny([signal.address]), + signal.width, + ); + + return TableRow( + decoration: isSelected + ? BoxDecoration( + color: + Theme.of(context).colorScheme.primary.withValues(alpha: 0.15), + ) + : null, + children: [ + wrapTap( + _CopyableCell( + copyText: signal.name, + fullPathText: signal.path(), + tooltip: 'Right-click to copy or send signal', + onSend: sendHandler, + sendLabel: sendLabel, + signalName: signal.name, + signalPath: signal.path(), + signalWidth: signal.width, + onSendPaths: widget.onSendSignals, + onGoToSource: widget.onGoToSource, + availableSourceFormats: widget.availableSourceFormats, + goToPaths: goToPaths, + onSetFormat: setSelectedFormat, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (signal.isStruct || signal.isArray) + GestureDetector( + onTapUp: (details) { + final path = signal.path(); + if (_expandedSignals.contains(path)) { + setState(() { + _expandedSignals.remove(path); + // Also collapse all sub-field expansions beneath. + _expandedSubFields.removeWhere( + (k) => k.startsWith('$path/'), + ); + }); + } else { + final keys = + HardwareKeyboard.instance.logicalKeysPressed; + final isShift = + keys.contains(LogicalKeyboardKey.shiftLeft) || + keys.contains(LogicalKeyboardKey.shiftRight); + if (isShift) { + _expandFullyFromSignal(signal); + } else { + unawaited( + _showExpandPopup( + context, + signal: signal, + tapPosition: details.globalPosition, + ), + ); + } + } + }, + child: Icon( + _expandedSignals.contains(signal.path()) + ? Icons.expand_more + : Icons.chevron_right, + size: 16, + color: Theme.of(context).colorScheme.primary, + ), + ) + else + const SizedBox(width: 16), + Flexible(child: Text(signal.name)), + ], + ), + ), + ), + wrapTap( + SizedBox( + height: 32, + child: Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Text(signal.width.toString()), + ), + ), + ), + ), + wrapTap( + SizedBox( + height: 32, + child: Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Text(signal.direction ?? 'internal'), + ), + ), + ), + ), + wrapTap( + _CopyableCell( + copyText: formattedValue, + tooltip: 'Right-click to copy value', + onSetFormat: setSelectedFormat, + child: Text( + formattedValue, + style: isSnapshotValue + ? TextStyle( + fontWeight: FontWeight.bold, + color: isComputed + ? const Color(0xFFFFD54F) + : Theme.of(context).colorScheme.primary, + ) + : null, + ), + ), + ), + ], + ); + } + + /// Generate expanded sub-field rows for a struct/array signal. + /// + /// Only shows one hierarchy level at a time. Sub-fields that have children + /// get their own expand caret — clicking it expands the next level. + List _generateSubFieldRows(SignalModel signal) { + final logicType = signal.logicType; + if (logicType == null) { + return const []; + } + + // Get binary value from the signal's current value. + final rawValue = _lookupValue(signal); + String? binaryValue; + if (rawValue != null) { + final rawHex = _extractRawHex(rawValue); + if (rawHex != null) { + binaryValue = hexToBinary(rawHex, signal.width); + } + } + + final nodes = expandLogicType(logicType, parentBinaryValue: binaryValue); + if (nodes.isEmpty) { + return const []; + } + + final basePath = signal.path(); + final rows = []; + for (final node in nodes) { + _collectSubFieldRows( + rows, + node, + indent: 1, + parentKey: basePath, + baseOffset: 0, + direction: signal.direction, + topSignalPath: basePath, + parentSanitized: signal.name, + ); + } return rows; } - TableRow _generateSignalRow(SignalModel signal) => - TableRow(children: [ - SizedBox(height: 32, child: Center(child: Text(signal.name))), - SizedBox(height: 32, child: Center(child: Text(signal.direction))), - SizedBox(height: 32, child: Center(child: Text(_lookupValue(signal)))), - SizedBox( - height: 32, child: Center(child: Text(signal.width.toString()))) - ]); - - String _lookupValue(SignalModel signal) { - // Snapshot overlay is currently keyed by signal name because the upstream - // baseline does not yet thread a stable hierarchy-address identity through - // the details table path. This keeps live values working now and leaves a - // clear seam for the later hierarchy-address migration. - final snapshotData = widget.snapshot; - if (snapshotData != null) { - final ss = snapshotData.getSignalByName(signal.name); - if (ss != null) { - return ss.value; + /// Collect table rows for a [TypeFieldNode] tree, expanding one level at a + /// time. Sub-fields with children show an expand caret; clicking it adds + /// their sub-field key to [_expandedSubFields]. + /// + /// [baseOffset] is the absolute bit offset of the parent within the + /// top-level signal, so nested fields display their true bit position. + void _collectSubFieldRows( + List rows, + TypeFieldNode node, { + required int indent, + required String parentKey, + required int baseOffset, + required String topSignalPath, + required String parentSanitized, + String? direction, + }) { + final nodeKey = '$parentKey/${node.name}'; + final hasChildren = node.children.isNotEmpty; + final isExpanded = _expandedSubFields.contains(nodeKey); + final isSelectedSub = _selectedSubFieldKey == nodeKey; + + // Full sanitized wire name for this sub-field, following the ROHD + // flattening convention (`{parent}_{field}` for struct fields, + // `{parent}_{i}_` for array elements). This matches the real netlist + // wire (e.g. `a_mantissa`) so the schematic and waveform viewers can + // resolve it. The short `node.name` is used only for on-screen display. + final nodeSanitized = _sanitizedChildName(parentSanitized, node); + + // When sending, replace the top signal's last path segment with the + // sub-field's full sanitized name so the ID is a meaningful wire path + // (e.g. `top/mod/a_mantissa`) rather than a bit slice. + final slash = topSignalPath.lastIndexOf('/'); + final parentDir = slash >= 0 ? topSignalPath.substring(0, slash + 1) : ''; + final sendPaths = ['$parentDir$nodeSanitized']; + + final valueStr = formatFieldValue(node.value, node.width); + + // Wrap a cell so the whole sub-field row is selectable (left-click) and + // exposes a context menu (right-click). The inner expand-caret keeps its + // own tap handler — it wins the gesture arena over this outer tap. + Widget wrap(Widget child) => GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => _onSubFieldTap(nodeKey), + onSecondaryTapUp: (details) => unawaited( + _showSubFieldMenu( + context, + details.globalPosition, + fieldName: node.name, + fullPath: sendPaths.first, + fieldValue: valueStr, + sendPaths: sendPaths, + ), + ), + child: child, + ); + + final bitFieldStr = BitFieldUtils.formatBitRange( + node.startBit + baseOffset, + node.width, + ); + + rows.add( + TableRow( + decoration: BoxDecoration( + color: isSelectedSub + ? Theme.of(context).colorScheme.primary.withValues(alpha: 0.18) + : Theme.of(context) + .colorScheme + .surfaceContainerHighest + .withValues(alpha: 0.3), + ), + children: [ + wrap( + Padding( + padding: EdgeInsets.only(left: 8.0 + indent * 16.0), + child: SizedBox( + height: 28, + child: Align( + alignment: Alignment.centerLeft, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (hasChildren) + GestureDetector( + onTapUp: (details) { + if (isExpanded) { + setState(() { + _expandedSubFields + ..remove(nodeKey) + // Collapse descendants. + ..removeWhere( + (k) => k.startsWith('$nodeKey/'), + ); + }); + } else { + final keys = + HardwareKeyboard.instance.logicalKeysPressed; + final isShift = keys + .contains(LogicalKeyboardKey.shiftLeft) || + keys.contains(LogicalKeyboardKey.shiftRight); + if (isShift) { + setState(() { + _expandedSubFields.add(nodeKey); + _expandAllDescendants(node, nodeKey); + }); + } else { + unawaited( + _showSubFieldExpandPopup( + context, + node: node, + nodeKey: nodeKey, + tapPosition: details.globalPosition, + ), + ); + } + } + }, + child: Icon( + isExpanded + ? Icons.expand_more + : Icons.chevron_right, + size: 14, + color: Theme.of(context).colorScheme.primary, + ), + ), + Flexible( + child: Text( + node.name, + style: TextStyle( + fontSize: 12, + color: Theme.of(context).hintColor, + ), + ), + ), + ], + ), + ), + ), + ), + ), + wrap( + SizedBox( + height: 28, + child: Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: baseOffset > 0 + ? Text.rich( + TextSpan( + children: [ + TextSpan( + text: BitFieldUtils.formatBitRange( + node.startBit + baseOffset, + node.width, + ), + style: TextStyle( + fontSize: 12, + color: Theme.of(context).hintColor, + ), + ), + TextSpan( + text: ' ($bitFieldStr)', + style: TextStyle( + fontSize: 10, + color: Theme.of(context) + .hintColor + .withValues(alpha: 0.6), + ), + ), + ], + ), + ) + : Text( + BitFieldUtils.formatBitRange( + node.startBit, + node.width, + ), + style: TextStyle( + fontSize: 12, + color: Theme.of(context).hintColor, + ), + ), + ), + ), + ), + ), + wrap( + SizedBox( + height: 28, + child: direction != null + ? Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Text( + direction, + style: TextStyle( + fontSize: 12, + color: Theme.of(context).hintColor, + ), + ), + ), + ) + : null, + ), + ), + wrap( + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: SizedBox( + height: 28, + child: Align( + alignment: Alignment.centerLeft, + child: Text( + valueStr, + style: TextStyle( + fontSize: 12, + color: Theme.of(context).colorScheme.primary, + ), + ), + ), + ), + ), + ), + ], + ), + ); + + // Show the next level only if this sub-field is expanded. + if (isExpanded) { + for (final child in node.children) { + _collectSubFieldRows( + rows, + child, + indent: indent + 1, + parentKey: nodeKey, + baseOffset: baseOffset + node.startBit, + direction: direction, + topSignalPath: topSignalPath, + parentSanitized: nodeSanitized, + ); } } - return signal.value; } - Widget _buildTableHeader({required String text}) => SizedBox( - height: 32, - child: Center( - child: Text(text, - style: - const TextStyle(fontWeight: FontWeight.bold, fontSize: 15)))); + /// Derive the full sanitized wire name of a sub-field [node] from its + /// parent's sanitized name, following ROHD's flattening convention: + /// struct fields become `{parent}_{field}` and array elements `[i]` + /// become `{parent}_{i}_`. + static String _sanitizedChildName( + String parentSanitized, + TypeFieldNode node, + ) { + final arrayMatch = regExpFirstMatch(r'^\[(\d+)\]$', node.name); + if (arrayMatch != null) { + return '${parentSanitized}_${arrayMatch.group(1)}_'; + } + return '${parentSanitized}_${node.name}'; + } + + /// Select a sub-field row by its hierarchical [nodeKey], clearing any + /// top-level row selection so only one kind of selection is active. + void _onSubFieldTap(String nodeKey) { + setState(() { + _selectedIndices.clear(); + _lastClickedIndex = null; + _selectedSubFieldKey = nodeKey; + }); + } + + /// Show the right-click context menu for a sub-field row. + Future _showSubFieldMenu( + BuildContext context, + Offset position, { + required String fieldName, + required String fullPath, + required String fieldValue, + required List sendPaths, + }) async { + final canSend = widget.onSendSignals != null && sendPaths.isNotEmpty; + final canGoToSource = widget.onGoToSource != null && sendPaths.isNotEmpty; + final value = await showMenu( + context: context, + position: RelativeRect.fromLTRB( + position.dx, + position.dy, + position.dx, + position.dy, + ), + items: >[ + const PopupMenuItem( + value: 'copy', + height: 32, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.copy, size: 16), + SizedBox(width: 8), + Text('Copy Name'), + ], + ), + ), + const PopupMenuItem( + value: 'copy_path', + height: 32, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.copy_all, size: 16), + SizedBox(width: 8), + Text('Copy Full Path'), + ], + ), + ), + const PopupMenuItem( + value: 'copy_value', + height: 32, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.content_paste, size: 16), + SizedBox(width: 8), + Text('Copy Value'), + ], + ), + ), + if (canSend) ...[ + const PopupMenuDivider(height: 8), + const PopupMenuItem( + value: 'send', + height: 32, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.send, size: 16), + SizedBox(width: 8), + Text('Send Field'), + ], + ), + ), + ], + if (canGoToSource) ...[ + const PopupMenuDivider(height: 8), + ...buildGotoSourceMenuItems( + formats: widget.availableSourceFormats?.call() ?? + kDefaultNavigableFormats, + ), + ], + ], + ); + + if (!context.mounted) { + return; + } + final gotoFormat = gotoSourceFormatFromValue(value); + if (gotoFormat != null) { + widget.onGoToSource?.call(gotoFormat, sendPaths); + return; + } + switch (value) { + case 'copy': + unawaited(Clipboard.setData(ClipboardData(text: fieldName))); + case 'copy_path': + unawaited(Clipboard.setData(ClipboardData(text: fullPath))); + case 'copy_value': + unawaited(Clipboard.setData(ClipboardData(text: fieldValue))); + case 'send': + widget.onSendSignals?.call(sendPaths); + } + } + + // --------------------------------------------------------------------------- + // Recursive expansion helpers + // --------------------------------------------------------------------------- + + /// Recursively add all descendant node keys to [_expandedSubFields]. + void _expandAllDescendants(TypeFieldNode node, String parentKey) { + for (final child in node.children) { + final childKey = '$parentKey/${child.name}'; + if (child.children.isNotEmpty) { + _expandedSubFields.add(childKey); + _expandAllDescendants(child, childKey); + } + } + } + + /// Expand a top-level signal and all its sub-field descendants. + void _expandFullyFromSignal(SignalModel signal) { + final logicType = signal.logicType; + if (logicType == null) { + return; + } + + final rawValue = _lookupValue(signal); + String? binaryValue; + if (rawValue != null) { + final rawHex = _extractRawHex(rawValue); + if (rawHex != null) { + binaryValue = hexToBinary(rawHex, signal.width); + } + } + + final nodes = expandLogicType(logicType, parentBinaryValue: binaryValue); + final basePath = signal.path(); + setState(() { + _expandedSignals.add(basePath); + for (final node in nodes) { + final nodeKey = '$basePath/${node.name}'; + if (node.children.isNotEmpty) { + _expandedSubFields.add(nodeKey); + _expandAllDescendants(node, nodeKey); + } + } + }); + } + + // --------------------------------------------------------------------------- + // Pop-up menus for hierarchical expansion + // --------------------------------------------------------------------------- + + /// Show a pop-up menu to expand a top-level struct/array signal. + /// + /// If the number of direct children exceeds the expand threshold, presents a + /// confirmation menu (with range selection for arrays). Otherwise expands + /// immediately. + Future _showExpandPopup( + BuildContext context, { + required SignalModel signal, + required Offset tapPosition, + }) async { + final logicType = signal.logicType; + if (logicType == null) { + return; + } + + final numFields = _countDirectChildren(logicType); + if (numFields <= BitFieldUtils.expandThreshold) { + // Small enough — expand immediately. + setState(() => _expandedSignals.add(signal.path())); + return; + } + + // Show a confirmation/range popup. + final overlay = + Overlay.of(context).context.findRenderObject()! as RenderBox; + final local = overlay.globalToLocal(tapPosition); + + final isArray = logicType.containsKey('arrayDims'); + final items = >[ + PopupMenuItem( + height: 32, + value: 'expand', + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.unfold_more, size: 14), + const SizedBox(width: 8), + Text( + 'Expand ($numFields ${isArray ? "elements" : "fields"})', + style: const TextStyle(fontSize: 13), + ), + ], + ), + ), + if (isArray) + PopupMenuItem( + height: 32, + value: 'range', + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.linear_scale, size: 14), + const SizedBox(width: 8), + Text( + 'Select Range (0:${numFields - 1})...', + style: const TextStyle(fontSize: 13), + ), + ], + ), + ), + const PopupMenuItem( + height: 32, + value: 'cancel', + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.close, size: 14), + SizedBox(width: 8), + Text('Cancel', style: TextStyle(fontSize: 13)), + ], + ), + ), + ]; + + final value = await showMenu( + context: context, + position: RelativeRect.fromLTRB( + local.dx, + local.dy + 24, + overlay.size.width - local.dx - 200, + overlay.size.height - local.dy - 24, + ), + items: items, + ); + + if (value == null || value == 'cancel' || !mounted) { + return; + } + if (value == 'expand') { + setState(() => _expandedSignals.add(signal.path())); + } else if (value == 'range') { + await _showRangeDialog( + this.context, + signalPath: signal.path(), + maxIndex: numFields - 1, + signalName: signal.name, + ); + } + } + + /// Show a pop-up menu to expand a nested sub-field node. + /// + /// If the child count exceeds the expand threshold, asks for confirmation. + /// Otherwise expands immediately. + Future _showSubFieldExpandPopup( + BuildContext context, { + required TypeFieldNode node, + required String nodeKey, + required Offset tapPosition, + }) async { + final numChildren = node.children.length; + if (numChildren <= BitFieldUtils.expandThreshold) { + setState(() => _expandedSubFields.add(nodeKey)); + return; + } + + final overlay = + Overlay.of(context).context.findRenderObject()! as RenderBox; + final local = overlay.globalToLocal(tapPosition); + + // Determine if the children look like array elements (names are "[n]"). + final isArrayLike = + node.children.isNotEmpty && node.children.first.name.startsWith('['); + + final items = >[ + PopupMenuItem( + height: 32, + value: 'expand', + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.unfold_more, size: 14), + const SizedBox(width: 8), + Text( + 'Expand ($numChildren ${isArrayLike ? "elements" : "fields"})', + style: const TextStyle(fontSize: 13), + ), + ], + ), + ), + const PopupMenuItem( + height: 32, + value: 'cancel', + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.close, size: 14), + SizedBox(width: 8), + Text('Cancel', style: TextStyle(fontSize: 13)), + ], + ), + ), + ]; + + final value = await showMenu( + context: context, + position: RelativeRect.fromLTRB( + local.dx, + local.dy + 24, + overlay.size.width - local.dx - 200, + overlay.size.height - local.dy - 24, + ), + items: items, + ); + + if (value == null || value == 'cancel' || !mounted) { + return; + } + if (value == 'expand') { + setState(() => _expandedSubFields.add(nodeKey)); + } + } + + /// Show a dialog to select a range of array indices to expand. + Future _showRangeDialog( + BuildContext context, { + required String signalPath, + required int maxIndex, + required String signalName, + }) async { + final controller = TextEditingController(text: '0:$maxIndex'); + controller.selection = TextSelection( + baseOffset: 0, + extentOffset: controller.text.length, + ); + + final result = await showDialog( + context: context, + barrierColor: Colors.black26, + builder: (ctx) => AlertDialog( + title: Text( + '$signalName [${maxIndex + 1} elements]', + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold), + ), + content: TextField( + controller: controller, + autofocus: true, + decoration: InputDecoration( + labelText: 'Range (start:end) or single index', + hintText: '0:$maxIndex', + isDense: true, + ), + onSubmitted: (value) => Navigator.of(ctx).pop(value), + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(ctx).pop(), + child: const Text('Cancel'), + ), + TextButton( + onPressed: () => Navigator.of(ctx).pop(controller.text), + child: const Text('OK'), + ), + ], + ), + ); + + if (result == null || result.trim().isEmpty || !mounted) { + return; + } + // Parse and expand only the selected range of sub-fields. + // We expand the signal and let the rendering handle visibility. + setState(() => _expandedSignals.add(signalPath)); + } + + /// Count the number of direct children for a given logicType. + static int _countDirectChildren(Map logicType) { + final fields = logicType['fields'] as List?; + if (fields != null) { + return fields.length; + } + final arrayDims = logicType['arrayDims'] as List?; + if (arrayDims != null && arrayDims.isNotEmpty) { + return arrayDims[0] as int; + } + return 0; + } + + /// Extract raw hex from a formatted value string. + /// + /// Handles formats like "16'hfffe", "0xff", or bare hex. + static String? _extractRawHex(String value) { + // ROHD radixString: width'hHEX + final radixMatch = regExpFirstMatch(r"^\d+'h([0-9a-fA-Fxz]+)$", value); + if (radixMatch != null) { + return radixMatch.group(1); + } + + // 0x prefix + if (value.toLowerCase().startsWith('0x')) { + return value.substring(2); + } + + // Try as bare hex + if (regExpHasMatch(r'^[0-9a-fA-F]+$', value)) { + return value; + } + + return null; + } + + Widget _buildSortableHeader({ + required String text, + required int columnIndex, + }) { + final isSorted = _sortColumnIndex == columnIndex; + return InkWell( + onTap: () { + setState(() { + if (_sortColumnIndex == columnIndex) { + if (_sortAscending) { + _sortAscending = false; + } else { + // Third click clears the sort. + _sortColumnIndex = null; + } + } else { + _sortColumnIndex = columnIndex; + _sortAscending = true; + } + }); + }, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: SizedBox( + height: 32, + child: Align( + alignment: Alignment.centerLeft, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + text, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 15, + ), + ), + if (isSorted) + Padding( + padding: const EdgeInsets.only(left: 4), + child: Icon( + _sortAscending + ? Icons.arrow_upward + : Icons.arrow_downward, + size: 14, + ), + ), + ], + ), + ), + ), + ), + ); + } +} + +/// A table cell that shows a context menu with "Copy" (and optionally "Send") +/// on right-click. +class _CopyableCell extends StatelessWidget { + const _CopyableCell({ + required this.copyText, + required this.child, + this.fullPathText, + this.tooltip, + this.onSend, + this.sendLabel, + this.signalName, + this.signalPath, + this.signalWidth, + this.onSendPaths, + this.onGoToSource, + this.availableSourceFormats, + this.goToPaths, + void Function(SignalValueFormat format)? onSetFormat, + }) : _onSetFormat = onSetFormat; + + final String copyText; + final Widget child; + + /// When non-null, a "Copy Full Path" menu item is shown. + final String? fullPathText; + final String? tooltip; + + /// When non-null, a "Send Signal(s)" menu item is shown in the context menu. + final VoidCallback? onSend; + + /// Label for the send menu item (e.g. "Send SignalOccurrence" or "Send 3 + /// Signals"). + final String? sendLabel; + + /// Display name of the signal, used in the bit-expansion dialogs. + final String? signalName; + + /// Full hierarchical path of the signal; used as the parent of the + /// synthesized `path#b[...]` bit-slice IDs. + final String? signalPath; + + /// Width of the signal in bits; bit-expansion items are only shown when + /// this is `> 1`. + final int? signalWidth; + + /// Callback used to forward the encoded `path#b[...]` IDs produced by the + /// bit-expansion items to the host (typically [SignalTable.onSendSignals]). + final void Function(List signalPaths)? onSendPaths; + + /// Callback to navigate to a signal's source for a chosen [RohdSourceFormat]. + final GoToSourceCallback? onGoToSource; + + /// Discovers which source formats are navigable for the current module. + final AvailableSourceFormats? availableSourceFormats; + + /// Signal paths to navigate to when a "Go to … Source" item is chosen. + final List? goToPaths; + + final void Function(SignalValueFormat format)? _onSetFormat; + + bool get _canBitExpand => + onSendPaths != null && + signalName != null && + signalPath != null && + signalWidth != null && + signalWidth! > 1; + + @override + Widget build(BuildContext context) => GestureDetector( + onSecondaryTapUp: (details) { + _showCopyMenu(context, details.globalPosition); + }, + onLongPressStart: (details) { + _showCopyMenu(context, details.globalPosition); + }, + child: Tooltip( + message: tooltip ?? '', + waitDuration: const Duration(milliseconds: 600), + child: SizedBox( + height: 32, + child: Align(alignment: Alignment.centerLeft, child: child), + ), + ), + ); + + void _showCopyMenu(BuildContext context, Offset position) { + final items = >[ + const PopupMenuItem( + value: 'copy', + height: 32, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.copy, size: 16), + SizedBox(width: 8), + Text('Copy'), + ], + ), + ), + if (fullPathText != null) + const PopupMenuItem( + value: 'copy_path', + height: 32, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.copy_all, size: 16), + SizedBox(width: 8), + Text('Copy Full Path'), + ], + ), + ), + if (onSend != null) ...[ + const PopupMenuDivider(height: 8), + PopupMenuItem( + value: 'send', + height: 32, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.send, size: 16), + const SizedBox(width: 8), + Text(sendLabel ?? 'Send Signal'), + ], + ), + ), + ], + if (onGoToSource != null && + goToPaths != null && + goToPaths!.isNotEmpty) ...[ + const PopupMenuDivider(height: 8), + ...buildGotoSourceMenuItems( + formats: availableSourceFormats?.call() ?? kDefaultNavigableFormats, + count: goToPaths!.length, + ), + ], + if (_onSetFormat != null) ...[ + const PopupMenuDivider(height: 8), + const PopupMenuItem( + value: signalValueFormatMenuValue, + height: 32, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.numbers, size: 16), + SizedBox(width: 8), + Text('Format As'), + ], + ), + ), + ], + if (_canBitExpand) + ...buildBitExpansionMenuItems( + width: signalWidth!, + fontSize: 14, + includeDivider: onSend == null, + ), + ]; + + unawaited( + showMenu( + context: context, + position: RelativeRect.fromLTRB( + position.dx, + position.dy, + position.dx, + position.dy, + ), + items: items, + ).then((value) async { + if (value == 'copy' || value == 'copy_path') { + final text = + value == 'copy_path' ? (fullPathText ?? copyText) : copyText; + unawaited(Clipboard.setData(ClipboardData(text: text))); + if (!context.mounted) { + return; + } + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Copied: $text'), + duration: const Duration(seconds: 1), + behavior: SnackBarBehavior.floating, + width: 250, + ), + ); + } else if (value == 'send') { + onSend?.call(); + } else if (value == signalValueFormatMenuValue) { + final paths = goToPaths ?? + (signalPath == null ? const [] : [signalPath!]); + if (paths.isNotEmpty && context.mounted) { + final selectedFormat = await showSignalValueFormatMenu( + context, + globalPosition: position, + ); + if (selectedFormat != null) { + _onSetFormat?.call(selectedFormat); + } + } + } else if (gotoSourceFormatFromValue(value) != null) { + final fmt = gotoSourceFormatFromValue(value)!; + final paths = goToPaths; + if (paths != null && paths.isNotEmpty) { + onGoToSource?.call(fmt, paths); + } + } else if (_canBitExpand) { + if (!context.mounted) { + return; + } + final action = await resolveBitExpansionMenuValue( + context, + value: value, + signalName: signalName!, + width: signalWidth!, + ); + if (action == null) { + return; + } + final List paths; + switch (action) { + case BitExpandRangeAction(:final bitStart, :final bitEnd): + paths = [ + for (var b = bitStart; b <= bitEnd; b++) '$signalPath#b[$b]', + ]; + case BitDefineFieldsAction(:final fields): + paths = [ + for (final f in fields) + if (f.high == f.low) + '$signalPath#b[${f.low}]' + else + '$signalPath#b[${f.high}:${f.low}]', + ]; + } + if (paths.isNotEmpty) { + onSendPaths?.call(paths); + } + } + }), + ); + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add(StringProperty('copyText', copyText)) + ..add(StringProperty('fullPathText', fullPathText)) + ..add(StringProperty('tooltip', tooltip)) + ..add(ObjectFlagProperty.has('onSend', onSend)) + ..add(StringProperty('sendLabel', sendLabel)) + ..add(StringProperty('signalName', signalName)) + ..add(StringProperty('signalPath', signalPath)) + ..add(IntProperty('signalWidth', signalWidth)) + ..add( + ObjectFlagProperty signalPaths)?>.has( + 'onSendPaths', + onSendPaths, + ), + ) + ..add( + ObjectFlagProperty.has( + 'onGoToSource', + onGoToSource, + ), + ) + ..add( + ObjectFlagProperty.has( + 'availableSourceFormats', + availableSourceFormats, + ), + ) + ..add(IterableProperty('goToPaths', goToPaths)); + } } diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/source_frame_picker.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/source_frame_picker.dart new file mode 100644 index 0000000000..9569ed0ff2 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/source_frame_picker.dart @@ -0,0 +1,225 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// source_frame_picker.dart +// Popup menu for selecting a source frame from an enriched trace. +// +// 2026 April +// Author: Desmond Kirkpatrick + +import 'package:material_ui/material_ui.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/source_navigation_service.dart'; +import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart' + show RohdSourceFormat, sourceFormatMenuIcon; + +/// Text style used for the frame label (`file:line`). +const TextStyle _kLabelTextStyle = TextStyle(fontSize: 13); + +/// Text style used for the highlight chip (enclosing symbol). +const TextStyle _kHighlightTextStyle = TextStyle( + fontSize: 10, + fontStyle: FontStyle.italic, +); + +/// Horizontal padding inside each menu item (matches [PopupMenuItem.padding]). +const double _kItemHorizontalPadding = 12; + +/// Horizontal padding inside the small type/highlight chips. +const double _kChipHorizontalPadding = 4; + +/// Gap between the type tag and the label. +const double _kTagToLabelGap = 8; + +/// Fixed width reserved for the source-format icon. +const double _kIconSlotWidth = 22; + +/// Gap between the label and the highlight chip. +const double _kLabelToHighlightGap = 6; + +/// Last known global pointer-down position, updated by +/// [SourceFramePointerTracker]. +Offset? _lastGlobalPointerDown; + +/// A widget that wraps part of the tree to track the last pointer-down +/// position. Place this above the area that triggers Go to Source menus. +class SourceFramePointerTracker extends StatelessWidget { + final Widget _child; + + /// Creates a pointer tracker for source-frame menus. + const SourceFramePointerTracker({required Widget child, super.key}) + : _child = child; + + @override + Widget build(BuildContext context) => Listener( + behavior: HitTestBehavior.translucent, + onPointerDown: (event) { + _lastGlobalPointerDown = event.position; + }, + child: _child, + ); +} + +/// Shows a popup menu of enriched source frames and returns the selected +/// index, or `null` if the user dismissed the menu. +/// +/// If there is only one frame, returns `0` immediately without showing +/// a picker. +/// +/// When [position] is not provided, the menu appears at the last known +/// pointer-down position (tracked by [SourceFramePointerTracker]). +Future showSourceFramePicker( + BuildContext context, + List frames, { + Offset? position, +}) async { + if (frames.isEmpty) { + return null; + } + if (frames.length == 1) { + return 0; + } + + final overlay = Overlay.of(context).context.findRenderObject() as RenderBox?; + if (overlay == null) { + return null; + } + + // Use provided position, or last tracked pointer-down, or overlay centre. + final pos = position ?? + _lastGlobalPointerDown ?? + overlay.localToGlobal( + Offset(overlay.size.width / 2, overlay.size.height / 2), + ); + + final rel = RelativeRect.fromSize( + Rect.fromLTWH(pos.dx, pos.dy, 0, 0), + overlay.size, + ); + + // Size the menu to fit the widest item (type tag + label + highlight) so the + // filename and enclosing symbol are not truncated, clamped to the available + // overlay width so it never runs off-screen. + final maxAllowedWidth = (overlay.size.width - 32).clamp(0.0, double.infinity); + final contentWidth = _computeMenuContentWidth(context, frames); + final minWidth = contentWidth.clamp(0.0, maxAllowedWidth); + + final selected = await showMenu( + context: context, + position: rel, + constraints: BoxConstraints(minWidth: minWidth, maxWidth: maxAllowedWidth), + items: [ + for (var i = 0; i < frames.length; i++) + PopupMenuItem( + value: i, + height: 32, + padding: const EdgeInsets.symmetric( + horizontal: _kItemHorizontalPadding, + ), + child: _FrameMenuItem(frame: frames[i]), + ), + ], + ); + return selected; +} + +/// Measures the rendered width of [text] in [style], honouring the ambient +/// text scaler. +double _measureTextWidth(String text, TextStyle style, TextScaler scaler) { + final painter = TextPainter( + text: TextSpan(text: text, style: style), + textDirection: TextDirection.ltr, + textScaler: scaler, + maxLines: 1, + )..layout(); + return painter.width; +} + +/// Computes the width needed to display the widest menu item without +/// truncation: type tag chip + label + optional highlight chip, plus the +/// inter-element gaps and the item's own horizontal padding. +double _computeMenuContentWidth( + BuildContext context, + List frames, +) { + final scaler = MediaQuery.textScalerOf(context); + var widest = 0.0; + + for (final frame in frames) { + final hl = frame.highlight; + + // Source icon + gap + label. + var width = _kIconSlotWidth; + width += _kTagToLabelGap + + _measureTextWidth(frame.label, _kLabelTextStyle, scaler); + + // Optional highlight chip: gap + text + chip padding on both sides. + if (hl != null) { + width += _kLabelToHighlightGap + + _measureTextWidth(hl, _kHighlightTextStyle, scaler) + + (_kChipHorizontalPadding * 2); + } + + if (width > widest) { + widest = width; + } + } + + // Add the item's horizontal padding (both sides) plus a small buffer for + // chip borders and sub-pixel rounding. + return widest + (_kItemHorizontalPadding * 2) + 4; +} + +class _FrameMenuItem extends StatelessWidget { + final EnrichedFrame _frame; + + const _FrameMenuItem({required EnrichedFrame frame}) : _frame = frame; + + @override + Widget build(BuildContext context) { + final hl = _frame.highlight; + + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + width: _kIconSlotWidth, + child: Center(child: sourceFormatMenuIcon(_formatOf(_frame))), + ), + const SizedBox(width: _kTagToLabelGap), + Flexible( + child: Text( + _frame.label, + style: _kLabelTextStyle, + overflow: TextOverflow.ellipsis, + ), + ), + if (hl != null) ...[ + const SizedBox(width: _kLabelToHighlightGap), + Container( + padding: const EdgeInsets.symmetric( + horizontal: _kChipHorizontalPadding, + vertical: 1, + ), + decoration: BoxDecoration( + color: Colors.yellow.withValues(alpha: 0.2), + borderRadius: BorderRadius.circular(3), + ), + child: Text( + hl, + style: _kHighlightTextStyle.copyWith(color: Colors.amber), + ), + ), + ], + ], + ); + } + + RohdSourceFormat _formatOf(EnrichedFrame frame) { + for (final format in RohdSourceFormat.values) { + if (format.name == frame.frame.type) { + return format; + } + } + return RohdSourceFormat.rohd; + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/standalone_app_shell.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/standalone_app_shell.dart index 2c1a045818..8237282363 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/ui/standalone_app_shell.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/standalone_app_shell.dart @@ -2,64 +2,118 @@ // SPDX-License-Identifier: BSD-3-Clause // // standalone_app_shell.dart -// Minimal standalone shell for early startup/connection porting. +// Shared app shell for standalone (Linux and Web) entry points. +// This contains common UI and state management code. // -// 2026 June +// 2026 January // Author: Desmond Kirkpatrick import 'dart:async'; +import 'dart:convert'; +import 'package:dart_wellen/dart_wellen.dart' + hide HierarchyOccurrence, HierarchyService; +import 'package:dtd/dtd.dart'; +import 'package:file_selector/file_selector.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:material_ui/material_ui.dart'; +import 'package:material_ui/material_ui.dart' hide MetaData; +import 'package:rohd_devtools_extension/rohd_devtools/cli/rohd_design_dtd_service.dart'; import 'package:rohd_devtools_extension/rohd_devtools/const/app_theme.dart'; import 'package:rohd_devtools_extension/rohd_devtools/cubit/cubits.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/examples/rohd_examples.dart'; import 'package:rohd_devtools_extension/rohd_devtools/models/dtd_vm_service_info.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/services/connection_state_machine.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/models/tree_model.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/services.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/third_party_license_registry.dart'; import 'package:rohd_devtools_extension/rohd_devtools/ui/ui.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/view/tree_structure_page.dart'; +import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart' + show + LocalCrossProbeChannel, + LocalCrossProbeService, + RohdExtensionClient, + RohdModuleInfo, + RohdSourceFormat, + SignalValueFormatRegistry, + resolveNavigableFormats; +import 'package:rohd_hierarchy/rohd_hierarchy.dart' + show HierarchyOccurrence, HierarchyService; +import 'package:rohd_schematic_viewer/schematic_viewer.dart'; +import 'package:rohd_waveform/rohd_waveform.dart'; +import 'package:vm_service/vm_service.dart' hide Stack; -/// Configuration for the standalone ROHD DevTools app shell. +/// Configuration for the standalone app. class StandaloneAppConfig { /// Title shown in AppBar. final String title; + /// Path prefix for assets (e.g., 'assets/' on Linux, '' on web). + final String assetPathPrefix; + /// Strategy for connecting to VM service. final VmConnectionStrategy? connectionStrategy; + /// Default example index to start with. + final int defaultExampleIndex; + /// Constructor for [StandaloneAppConfig]. const StandaloneAppConfig({ this.title = 'ROHD DevTools (Standalone)', + this.assetPathPrefix = '', this.connectionStrategy, + this.defaultExampleIndex = 0, // Counter (first in-process example) }); } -/// Standalone app entry point that wires up theming and the app shell. +/// Shared standalone app widget. class StandaloneRohdDevToolsApp extends StatelessWidget { - /// Configuration used by the standalone app shell. + /// Configuration for the standalone app. final StandaloneAppConfig config; - /// Creates the standalone ROHD DevTools app. + /// Constructor for [StandaloneRohdDevToolsApp]. const StandaloneRohdDevToolsApp({ super.key, this.config = const StandaloneAppConfig(), }); @override - - /// Builds the top-level app and injects theme state. Widget build(BuildContext context) => BlocProvider( create: (context) => DevToolsThemeCubit(), child: BlocBuilder( builder: (context, themeMode) { final isDark = themeMode == DevToolsThemeMode.dark; - return MaterialApp( - title: config.title, + title: 'ROHD DevTools', debugShowCheckedModeBanner: false, themeMode: isDark ? ThemeMode.dark : ThemeMode.light, darkTheme: buildDarkTheme(), theme: buildLightTheme(), + builder: (context, child) => Stack( + children: [ + child!, + // Pre-warm icon and emoji fonts by painting them invisibly + // on the first frame. Opacity(0) still paints (unlike + // Offstage), forcing Skia to load and cache the glyphs + // before the connection form appears. + const Positioned( + left: -9999, + child: Opacity( + opacity: 0, + child: Row( + children: [ + Icon(Icons.developer_board, size: 1), + Icon(Icons.cloud, size: 1), + Icon(Icons.link, size: 1), + Icon(Icons.build, size: 1), + Icon(Icons.folder_open, size: 1), + Icon(Icons.show_chart, size: 1), + Text('🔧☁️🔌🔗📂🛠️', style: TextStyle(fontSize: 1)), + ], + ), + ), + ), + ], + ), home: StandaloneDevToolsPage(config: config), ); }, @@ -69,172 +123,251 @@ class StandaloneRohdDevToolsApp extends StatelessWidget { @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); - properties.add(DiagnosticsProperty('config', config)); + properties.add( + ObjectFlagProperty( + 'config', + config, + ifNull: 'default', + ), + ); } } -/// The main standalone page that manages connections and content. +/// Main DevTools page - shows full UI immediately with mock data. class StandaloneDevToolsPage extends StatefulWidget { - /// Configuration for the standalone page. + /// Configuration for the standalone app. final StandaloneAppConfig config; - /// Creates the standalone DevTools page. + /// Constructor for [StandaloneDevToolsPage]. const StandaloneDevToolsPage({required this.config, super.key}); @override - - /// Creates the mutable state for [StandaloneDevToolsPage]. State createState() => _StandaloneDevToolsPageState(); @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); - properties.add(DiagnosticsProperty('config', config)); + properties.add( + ObjectFlagProperty('config', config, ifNull: 'none'), + ); } } class _StandaloneDevToolsPageState extends DevToolsConnectionHostState { - late final RohdServiceCubit _rohdServiceCubit = RohdServiceCubit( - manageServiceManager: false, - ); - late final SnapshotCubit _snapshotCubit = SnapshotCubit(); - late final TreeSearchTermCubit _treeSearchTermCubit = TreeSearchTermCubit(); - late final SelectedModuleCubit _selectedModuleCubit = SelectedModuleCubit(); - late final SignalSearchTermCubit _signalSearchTermCubit = - SignalSearchTermCubit(); + // Connection state - starts as not connected (shows connection page first) + bool _isConnected = false; - @override + // True while the VM connection handshake is in progress. + // Set immediately so the main UI composites (with a loading indicator) + // without waiting for the WebSocket + isolate search to complete. + bool _isConnecting = false; - /// Returns the connection strategy requested by the widget config. - VmConnectionStrategy? get connectionStrategy => - widget.config.connectionStrategy; + // True when the VM service has been detected as dead (polling failed). + // The UI stays on the main page but the AppBar badge turns red. + // The user can hit Refresh to reload design data without reconnecting. + bool _isVmDead = false; - @override + // True when the user deliberately disconnected from the VM via the + // plug/pause button. The main UI stays visible (tree, schematic, + // waveforms are preserved) but the VM service is torn down to reduce + // load on the ROHD program. Clicking the icon again reconnects. + bool _isPaused = false; - /// Initializes the connection dialog and supporting listeners. - void initState() { - super.initState(); - // Auto-pop the connection dialog after the first frame, once - // fonts have settled on web (so glyphs render correctly). - WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted && !isConnected) { - unawaited(_showConnectionDialogWhenReady()); - } - }); - } + // The VM service URI that was active before pausing, so we can + // reconnect to the same VM. + String? _lastVmServiceUri; - /// Wait for icon fonts to load on web before showing the dialog so - /// the form's glyphs (e.g. dropdown chevrons) render on the first - /// frame instead of as boxes. No-op on native platforms. - Future _showConnectionDialogWhenReady() async { - if (kIsWeb) { - final completer = Completer(); - void onFontsChanged() { - if (!completer.isCompleted) { - completer.complete(); - } - } + // The isolate ID from the last successful connection. Used during + // reconnect to detect whether the same VM process is still running + // (same ID → lightweight reconnect) or a fresh process started at + // the same URI (different ID → full reconnect). + String? _lastIsolateId; - PaintingBinding.instance.systemFonts.addListener(onFontsChanged); - await completer.future.timeout( - const Duration(milliseconds: 1500), - onTimeout: () {}, - ); - PaintingBinding.instance.systemFonts.removeListener(onFontsChanged); + // The name of the VM we connected to (from DiscoveredVmService.name). + // Used for auto-reconnect: after a VM death we re-discover via DTD and + // try to find a newly spawned VM with the same name. + String? _connectedVmName; - // Give CanvasKit one extra frame to rasterise the glyphs. - await Future.delayed(const Duration(milliseconds: 100)); - if (mounted) { - await WidgetsBinding.instance.endOfFrame; - } + // Whether automatic reconnection by name is enabled for the current + // session. Set when the user connects to a VM that has + // [DiscoveredVmService.autoReconnect] checked. + bool _autoReconnect = false; + + // Tree model - starts with loopback data + TreeModel? _treeModel; + + /// The schematic JSON extracted from the ROHD WaveformService. + Map? _schematicJson; + + /// Signal paths whose modules are currently being expanded (fetching full + /// connectivity from the server). Prevents duplicate fetch requests. + final Set _pendingModuleExpansions = {}; + + String? _error; + + /// Whether color emoji fonts are available on this system. + /// Web always uses emoji; native starts optimistically and verifies. + late bool _hasColorEmoji; + + // Data source abstraction - starts with loopback mode + TreeDataSource? _dataSource; + late int _selectedExampleIndex; + + // Whether a user-supplied design JSON has been loaded in loopback mode. + // When true, the "Load Waveform" button is shown. + bool _hasLoadedDesign = false; + + // Human-readable name of the loaded design (e.g. file name). + String? _loadedDesignName; + + /// In-process transport for real ROHD examples. + late InProcessTransport _inProcessTransport; + + /// In-process waveform data source for real ROHD examples (legacy). + InProcessWaveformDataSource? _inProcessWaveformDataSource; + + /// Completer that keeps the in-process ROHD example alive. + /// Complete it to shut down the example (when switching or disconnecting). + Completer? _exampleKeepAlive; + late VmServiceTransport _vmTransport; + SignalWaveformApi? _waveformApi; + + // Monotonically increasing counter bumped on every full reconnect. + // Used in the WaveformViewerWrapper key so Flutter recreates the widget + // (and its repository / BLoC state) instead of reusing stale data. + int _connectionGeneration = 0; + + // Monitored signal hierarchy paths saved before a full reconnect. + // After the new hierarchy loads and SignalBloc is recreated, these + // paths are passed to SignalBloc so it can attempt to re-add each + // signal to the monitor list. Cleared after being handed off. + List _savedMonitoredSignalPaths = []; + + // Cubits - created once in initState to prevent recreation on rebuilds + late final TreeSearchTermCubit _treeSearchTermCubit; + late final SignalSearchTermCubit _signalSearchTermCubit; + late final DetailsTabCubit _detailsTabCubit; + late final DevToolsHierarchyCubit _hierarchyCubit; + late final SnapshotCubit _snapshotCubit; + + /// Cross-call cache for [evaluateSignalOnDemand]. Cleared on snapshot + /// changes; reset on hierarchy reload. + final _evalCache = EvalOnDemandCache(); + int? _evalCacheSnapshotTime; + + /// Shared [NetlistEvaluator] instance. + /// + /// Created lazily from [_schematicJson] and [_treeModel]. Invalidated + /// when either changes (hierarchy reload, new connection, etc.). + /// Used by details-pane, schematic-hover, and waveform-synthesis. + NetlistEvaluator? _sharedEvaluator; + + /// Get or create the shared [NetlistEvaluator]. + NetlistEvaluator? _getSharedEvaluator() { + if (_sharedEvaluator != null) { + return _sharedEvaluator; } - if (!mounted || isConnected) { - return; + final modules = _schematicJson?['modules'] as Map?; + if (modules == null) { + return null; } - await showConnectionDialog(); + _sharedEvaluator = NetlistEvaluator(modules, _evalCache); + debugPrint('[Shell] Created shared NetlistEvaluator'); + return _sharedEvaluator; } - @override + /// Shared cross-probe channel and per-viewer services. + final LocalCrossProbeChannel _crossProbeChannel = LocalCrossProbeChannel(); + late final LocalCrossProbeService _waveformXp; + late final LocalCrossProbeService _schematicXp; + late final LocalCrossProbeService _shellXp; - /// Handles a successful VM connection by configuring the ROHD service. - Future onVmConnected(VmConnectionResult result, String uri) async { - await _rohdServiceCubit.configureStandaloneVmService( - result.vmService, - result.isolateId, - ); - await _loadHierarchyFromVm(); - } + // ── Source navigation (Go to Source via DTD) ────────────────────── + SourceNavigationService? _sourceNavService; - @override - Future onCsmLoadHierarchy() => _loadHierarchyFromVm(); + /// Extension client — exposes what source formats are available per module. + /// Created alongside [_sourceNavService] using the same [FlcService]. + FlcExtensionClient? _extensionClient; - @override + /// The current FlcService backing [_extensionClient], kept for DTD + /// queryModule refresh (file-existence sanity check). + FlcService? _currentFlcService; - /// Clears the standalone tree service when the connection is torn down. - Future tearDownOldConnection({ - required VmConnectionTransition transition, - }) async { - _rohdServiceCubit.treeService = null; - } + // ValueNotifier for snapshot availability — survives Navigator + // route caching and updates the wave viewer's snapshot button + // reactively via ValueListenableBuilder. + final ValueNotifier _canSnapshotNotifier = ValueNotifier(false); - @override + // Cached dropdown items to prevent recreation on rebuild + late final List> _exampleDropdownItems; - /// Reopens the connection dialog after the VM disconnects. - void onVmDisconnected() { - // Re-pop the connection dialog so the user can reconnect. - if (mounted) { - unawaited(showConnectionDialog()); - } - } + // Cached callbacks to prevent recreation on rebuild + late final ValueChanged _onExampleChanged; + late final VoidCallback _onDisconnect; + late final VoidCallback _onConnect; + late final VoidCallback _onPauseVm; + late final VoidCallback _onResumeVm; + late final VoidCallback _onRefresh; + late final VoidCallback _onLicenses; + late final VoidCallback _onLoadDesign; + late final VoidCallback _onLoadWaveform; - @override + // Cached AppBar widget - only recreated when state actually changes + _StandaloneAppBar? _cachedAppBar; + bool _lastIsLoopbackMode = false; + bool _lastIsVmConnected = false; + bool _lastIsConnecting = false; + bool _lastIsVmDead = false; + bool _lastIsPaused = false; + int _lastSelectedExampleIndex = 1; + bool _lastHasColorEmoji = false; + bool _lastHasLoadedDesign = false; - /// Reconfigures the ROHD service after a lightweight reconnect. - Future onLightweightReconnectSuccess( - VmConnectionResult result, - String uri, - ) async { - await _rohdServiceCubit.configureStandaloneVmService( - result.vmService, - result.isolateId, - ); - await _loadHierarchyFromVm(); - } + // VM service reference (for disposal) + VmService? _vmService; - Future _loadHierarchyFromVm() async { - await _rohdServiceCubit.evalModuleTree(); + // VM liveness polling timer — cancels on disconnect or dispose + Timer? _vmLivenessTimer; - final state = _rohdServiceCubit.state; - final success = switch (state) { - RohdServiceLoaded(treeModel: _) => true, - _ => false, - }; + // Remembered VM services across reconnects (includes dead ones) + final ScrollController _horizontalController = ScrollController(); + final ScrollController _verticalController = ScrollController(); - connectionStateMachine.handleEvent(HierarchyLoadResult(success: success)); - } + @override + VmConnectionStrategy? get connectionStrategy => + widget.config.connectionStrategy; @override + Future onCsmLoadHierarchy() => _loadModuleTree(); - /// Releases cubits used by the standalone shell. - void dispose() { - unawaited(_rohdServiceCubit.close()); - unawaited(_snapshotCubit.close()); - unawaited(_treeSearchTermCubit.close()); - unawaited(_selectedModuleCubit.close()); - unawaited(_signalSearchTermCubit.close()); - super.dispose(); + @override + Future onBeforeVmConnected( + VmConnectionResult result, + String uri, { + required VmConnectionTransition transition, + }) async { + _handleBeforeVmConnected(result, uri, transition: transition); } - void _openConnectionDialog() => unawaited(showConnectionDialog()); + @override + Future onVmConnected(VmConnectionResult result, String uri) async { + debugPrint('[Connection] Creating VmServiceTreeDataSource...'); + final vmDataSource = VmServiceTreeDataSource( + vmService: result.vmService, + isolateId: result.isolateId, + ); - void _disconnect() => unawaited(disconnect()); + _initVmWaveformDataSource(result.vmService, result.isolateId); + _handleConnectedVmState(result, uri, vmDataSource); - /// Override the base dialog content to wire dismiss-on-success and - /// the standalone shell's discovered-services memory. - @override + WidgetsBinding.instance.addPostFrameCallback((_) { + unawaited(_loadModuleTree()); + }); + debugPrint('[Connection] Deferred _loadModuleTree to next frame'); + } - /// Builds the standalone connection dialog content. + @override Widget buildConnectionDialogContent(BuildContext dialogContext) => VmConnectionForm( vmServiceUriController: vmServiceUriController, @@ -243,7 +376,7 @@ class _StandaloneDevToolsPageState onConnect: () async { try { await attemptConnection(); - if (mounted && dialogContext.mounted && isConnected) { + if (mounted && dialogContext.mounted && _isConnected) { Navigator.of(dialogContext).pop(); } } on Exception catch (e) { @@ -252,10 +385,15 @@ class _StandaloneDevToolsPageState }); } }, + onDemoMode: () { + Navigator.of(dialogContext).pop(); + onDemoModeRequested(); + }, + showDemoButton: true, + hasColorEmoji: _hasColorEmoji, cleanVmServiceUri: DevToolsConnectionHostState.cleanVmServiceUri, cleanDtdUri: DevToolsConnectionHostState.cleanDtdUri, discoverVmServices: discoverVmServices, - hasColorEmoji: true, initialDiscoveredServices: rememberedServices ?.map( (s) => DiscoveredVmService( @@ -282,99 +420,3226 @@ class _StandaloneDevToolsPageState }, ); - /// Builds the empty state shown before any connection is established. - Widget _buildEmptyConnectionState() { - final isDark = Theme.of(context).brightness == Brightness.dark; - final secondaryTextColor = isDark ? Colors.white70 : Colors.black54; - - return Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - Icons.cable_outlined, - size: 72, - color: Theme.of(context).disabledColor, - ), - const SizedBox(height: 16), - const Text( - 'Not connected', - style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500), - ), - const SizedBox(height: 8), - Text( - 'Connect to a running ROHD application to begin.', - style: TextStyle(color: secondaryTextColor), - ), - const SizedBox(height: 24), - FilledButton.icon( - icon: const Icon(Icons.link), - label: const Text('Connect…'), - onPressed: () => unawaited(showConnectionDialog()), - ), - ], - ), + @override + void onDemoModeRequested() { + unawaited(_enterDemoMode()); + } + + @override + Future tearDownOldConnection({ + required VmConnectionTransition transition, + }) => + _tearDownOldConnection(transition); + + @override + void onVmDisconnected() { + _handleExplicitDisconnect(); + } + + @override + Future onVmPaused() async { + debugPrint('[Pause] Pausing waveform fetches (connection stays alive)'); + _handlePausedVm(); + setState(() { + _isPaused = true; + }); + debugPrint( + '[Pause] Fetches paused — VM still connected at ' + '$_lastVmServiceUri', ); } @override + Future onVmResumed() async { + debugPrint('[Resume] Resuming waveform fetches'); + setState(() { + _isPaused = false; + }); + await _handleResumedVm(); + debugPrint('[Resume] Fetches resumed — gap data backfilled'); + } + + @override + Future onLightweightReconnectSuccess( + VmConnectionResult result, + String uri, + ) async { + final newDataSource = await _handleLightweightReconnectSuccess(result); + setState(() { + _vmService = result.vmService; + _dataSource = newDataSource; + _isConnecting = false; + _isPaused = false; + _isVmDead = false; + _lastIsolateId = result.isolateId; + }); + } - /// Builds the standalone shell, switching between connected and empty UI. - Widget build(BuildContext context) { - final isDark = Theme.of(context).brightness == Brightness.dark; - final accentColor = Theme.of(context).colorScheme.primary; - return Scaffold( - appBar: AppBar( - title: Text(widget.config.title), - actions: [ - if (isConnected) ...[ - IconButton( - tooltip: 'Disconnect', - onPressed: _disconnect, - icon: const Icon(Icons.link_off), - ), - ] else - IconButton( - tooltip: 'Connect…', - onPressed: _openConnectionDialog, - icon: const Icon(Icons.link), - ), - BlocBuilder( - builder: (context, themeMode) { - final isDark = themeMode == DevToolsThemeMode.dark; + @override + void onVmDead() { + setState(() { + _isVmDead = true; + }); + } - return IconButton( - tooltip: - isDark ? 'Switch to light theme' : 'Switch to dark theme', - onPressed: () { - context.read().toggleTheme(); - }, - icon: platformIcon( - isDark ? Icons.light_mode : Icons.dark_mode, - isDark ? '☀️' : '🌙', - size: 24, - color: accentColor, - hasColorEmoji: kIsWeb, - ), - ); - }, - ), - DevToolsHelpButton(isDark: isDark), - ], - ), - body: !isConnected - ? _buildEmptyConnectionState() - : MultiBlocProvider( - providers: [ - BlocProvider.value(value: _rohdServiceCubit), - BlocProvider.value(value: _snapshotCubit), - BlocProvider.value(value: _treeSearchTermCubit), - BlocProvider.value(value: _selectedModuleCubit), - BlocProvider.value(value: _signalSearchTermCubit), - BlocProvider(create: (context) => DetailsTabCubit()), - ], - child: TreeStructurePage(screenSize: MediaQuery.of(context).size), + @override + void onVmRecovered() { + setState(() { + _isVmDead = false; + }); + } + + @override + void onDtdConnected(DartToolingDaemon dtd) { + _handleDtdConnected(dtd); + unawaited(_registerCrossProbeOnDtd(dtd)); + unawaited(_registerSignalFormatOnDtd(dtd)); + } + + @override + void onDtdDisconnected() { + _handleDtdDisconnected(); + } + + Future _registerCrossProbeOnDtd(DartToolingDaemon dtd) async { + try { + final services = await dtd.getRegisteredServices(); + final registered = services.clientServices.any( + (service) => + service.name == rohdCrossProbeDtdServiceName && + service.methods.containsKey(rohdCrossProbeSendDtdMethod), + ); + if (registered) { + return; + } + await dtd.registerService( + rohdCrossProbeDtdServiceName, + rohdCrossProbeSendDtdMethod, + (parameters) async { + final paths = jsonDecode(parameters['paths'].asString); + if (paths is! List || !paths.every((path) => path is String)) { + throw const FormatException('paths must be a list of strings.'); + } + _shellXp.send(paths.cast(), source: 'rohd-shell-cli'); + return const {'type': 'RohdCrossProbeResponse', 'ok': true}; + }, + ); + } on Object catch (error) { + debugPrint('[CrossProbe] DTD service unavailable: $error'); + } + } + + Future _registerSignalFormatOnDtd(DartToolingDaemon dtd) async { + try { + final services = await dtd.getRegisteredServices(); + final registered = services.clientServices.any( + (service) => + service.name == rohdSignalFormatDtdServiceName && + service.methods.containsKey(rohdSignalFormatGetDtdMethod), + ); + if (registered) { + return; + } + await dtd.registerService( + rohdSignalFormatDtdServiceName, + rohdSignalFormatGetDtdMethod, + (parameters) async { + final path = parameters['path'].asString; + final hierarchyState = _hierarchyCubit.state; + final address = hierarchyState is HierarchyLoaded + ? hierarchyState.hierarchyService?.pathnameToAddress(path) + : null; + return { + 'type': 'RohdSignalFormatResponse', + 'format': SignalValueFormatRegistry.formatToString( + SignalValueFormatRegistry.formatForAny([address]), ), + }; + }, + ); + } on Object catch (error) { + debugPrint('[SignalFormat] DTD service unavailable: $error'); + } + } + + @override + void initState() { + super.initState(); + _selectedExampleIndex = widget.config.defaultExampleIndex.clamp( + 0, + rohdExamples.length - 1, + ); + + // Detect color emoji font availability + // Assume emoji is available (optimistic) to avoid icon flash on startup. + // The async check will flip to false if no color emoji font is found. + _hasColorEmoji = true; + if (!kIsWeb) { + unawaited(_detectEmojiFont()); + } + + // Create cubits once - use BlocProvider.value() in build to avoid + // recreation + _treeSearchTermCubit = TreeSearchTermCubit(); + _signalSearchTermCubit = SignalSearchTermCubit(); + _detailsTabCubit = DetailsTabCubit(); + _hierarchyCubit = DevToolsHierarchyCubit(); + _snapshotCubit = SnapshotCubit(); + + // Cache dropdown items to prevent recreation on rebuild + _exampleDropdownItems = _buildExampleDropdownItems(); + + // Cache callbacks to prevent recreation on rebuild + _onExampleChanged = (index) { + if (index != null) { + unawaited(_switchExample(index)); + } + }; + _onDisconnect = () => unawaited(disconnect()); + _onConnect = () => unawaited(showConnectionDialog()); + _onPauseVm = () => unawaited(pauseVm()); + _onResumeVm = () => unawaited(resumeVm()); + _onRefresh = () => unawaited(_fullRefresh()); + _onLicenses = _showLicenses; + _onLoadDesign = () => unawaited(_loadDesignFromFile()); + _onLoadWaveform = () => unawaited(_loadWaveformFromFile()); + + // Note: We don't initialize loopback mode here anymore. + // The main UI is shown immediately with empty panels, and the + // connection dialog opens automatically so the user can connect + // to a VM or choose "Demo mode" to enter loopback mode. + + // Cross-probing: create per-viewer services on the shared channel. + _waveformXp = LocalCrossProbeService( + _crossProbeChannel, + source: 'waveform', + ); + _schematicXp = LocalCrossProbeService( + _crossProbeChannel, + source: 'schematic', + ); + _shellXp = LocalCrossProbeService(_crossProbeChannel, source: 'rohd-shell'); + + // Show the connection dialog once fonts are loaded so icon glyphs + // render correctly on the first frame of the dialog. + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted && !_isConnected) { + unawaited(_showConnectionDialogWhenReady()); + } + }); + } + + /// Build dropdown items from [rohdExamples]. + List> _buildExampleDropdownItems() => + rohdExamples.asMap().entries.map((entry) { + final index = entry.key; + final example = entry.value; + return DropdownMenuItem(value: index, child: Text(example.name)); + }).toList(); + + /// Default signals to pre-load in the waveform monitor for each example. + /// These are discovered dynamically from the real ROHD module hierarchy, + /// so we start with an empty list and let the tree load populate them. + static List _defaultMonitoredSignals(int exampleIndex) => []; + + /// Initialize loopback mode with the selected example. + /// + /// Launches a real ROHD simulation in-process, then creates + /// in-process tree and waveform data sources that call ROHD services + /// directly. + Future _initLoopbackMode() async { + final examples = rohdExamples; + if (_selectedExampleIndex >= examples.length) { + debugPrint('[Shell] Invalid example index: $_selectedExampleIndex'); + return; + } + + final example = examples[_selectedExampleIndex]; + debugPrint('[Shell] Launching in-process example: ${example.name}'); + + // Shut down any previous in-process example. + _shutdownInProcessExample(); + + // Launch the ROHD simulation. This builds the module, runs simulation, + // and returns a Completer we can complete to shut it down. + try { + _exampleKeepAlive = await example.launcher(); + } on Exception catch (e) { + debugPrint('[Shell] Example launch failed: $e'); + setState(() { + _error = 'Failed to launch example: $e'; + }); + return; + } + + // Create data sources that call the ROHD singletons directly. + final inProcessDataSource = InProcessTreeDataSource(name: example.name); + _dataSource = inProcessDataSource; + _inProcessTransport = InProcessTransport(name: example.name); + _inProcessWaveformDataSource = InProcessWaveformDataSource( + name: example.name, + ); + _waveformApi = LoopbackSignalWaveformApi(_inProcessTransport) + ..evalCache = _evalCache; + + // Initialize cross-probe source navigation with in-process FlcService. + // This proxies the ROHD extension's DTD services locally — the lookup + // calls ModuleServices directly instead of going over DTD. + final loopbackFlc = FlcService( + fetchModuleFlc: inProcessDataSource.fetchModuleFlc, + fetchFlcHierarchy: inProcessDataSource.fetchFlcHierarchy, + fetchFlcFilePath: inProcessDataSource.fetchFlcFilePath, + onClearCache: inProcessDataSource.clearFlcCache, + ); + _sourceNavService = SourceNavigationService()..setFlcService(loopbackFlc); + _extensionClient?.dispose(); + _extensionClient = FlcExtensionClient(flcService: loopbackFlc); + _currentFlcService = loopbackFlc; + debugPrint('[Shell] SourceNavigationService created (loopback mode)'); + + // Pre-load default signals for this example. + _savedMonitoredSignalPaths = _defaultMonitoredSignals( + _selectedExampleIndex, + ); + + // Defer tree loading until after the UI frame renders. + WidgetsBinding.instance.addPostFrameCallback((_) { + unawaited(_loadModuleTree()); + }); + } + + /// Shut down a running in-process ROHD example. + void _shutdownInProcessExample() { + if (_exampleKeepAlive != null && !_exampleKeepAlive!.isCompleted) { + _exampleKeepAlive!.complete(); + debugPrint('[Shell] Completed in-process example keep-alive'); + } + _exampleKeepAlive = null; + _inProcessWaveformDataSource = null; + // Tear down loopback source navigation. + _sourceNavService?.clearFlcService(); + _sourceNavService = null; + _extensionClient?.dispose(); + _extensionClient = null; + _currentFlcService = null; + } + + /// Tear down all state from a previous VM connection. + /// + /// Disposes the old waveform data source, cancels subscriptions, + /// clears stale tree/schematic/hierarchy/snapshot data, and bumps + /// the connection generation so the WaveformViewerWrapper is fully + /// recreated. Safe to call even when no prior connection exists + /// (e.g. the very first connect). + Future _tearDownOldConnection(VmConnectionTransition transition) async { + // Each step is individually guarded so that a failure in one step + // (e.g. LateInitializationError on first connect) never prevents + // subsequent steps from executing. Without this resilience, a + // single error can leave stale cubits, metadata, and widget keys + // intact — causing wrong timebase/data on the next connection. + + // Shut down any running in-process ROHD example (completes the + // keep-alive Completer, resets the simulator, clears the waveform + // data source) so design data doesn't leak into the next session. + try { + _shutdownInProcessExample(); + } on Object catch (e) { + debugPrint('[Connection] _shutdownInProcessExample failed: $e'); + } + + // Save monitored signal keys before disposing so they can be + // restored in the new SignalBloc after the next hierarchy loads. + // Only save when the transport is still connected — a disposed + // transport still holds stale keys that must not be re-saved. + try { + if (_vmTransport.isConnected) { + final keys = _vmTransport.trackedSignalKeys; + if (keys.isNotEmpty) { + _savedMonitoredSignalPaths = keys; + debugPrint( + '[Connection] Saved ${keys.length} monitored signal paths ' + 'for restore: $keys', + ); + } + } + } on Object catch (_) { + // _vmTransport is `late` — first connect hasn't set it yet. + // Clear stale saved paths (e.g. demo-mode defaults) so they don't + // leak into the next connection's monitor list. + _savedMonitoredSignalPaths = []; + } + + // Waveform data source + try { + await _vmTransport.dispose(); + } on Object catch (_) { + // _vmTransport is `late` — first connect hasn't set it yet. + } + _waveformApi = null; + + // Tree data source + try { + await _dataSource?.dispose(); + } on Exception catch (e) { + debugPrint('[Connection] dataSource dispose failed: $e'); + } + + // Old VM service + try { + unawaited(_vmService?.dispose()); + } on Exception catch (e) { + debugPrint('[Connection] vmService dispose failed: $e'); + } + + // Snapshot/evaluator state is always connection-scoped. + _snapshotCubit.clear(); + _evalCache.reset(); + _sharedEvaluator = null; + _error = null; + + if (transition.preservesAppState) { + debugPrint( + '[Connection] Tore down transport for same-VM restart — ' + 'preserving widget state', + ); + return; + } + + _hierarchyCubit.clear(); + + // Stale model/UI state + _treeModel = null; + _schematicJson = null; + _pendingModuleExpansions.clear(); + _hasLoadedDesign = false; + _loadedDesignName = null; + + // Bump generation so the WaveformViewerWrapper key changes and + // Flutter creates a brand-new widget (with fresh BLoC + repository) + // instead of recycling stale state. + _connectionGeneration++; + + debugPrint( + '[Connection] Tore down old connection — ' + 'generation=$_connectionGeneration', + ); + } + + /// Initialize VM service waveform data source for live mode. + void _initVmWaveformDataSource(VmService vmService, String isolateId) { + _vmTransport = VmServiceTransport( + vmService: vmService, + isolateId: isolateId, + ); + _waveformApi = VmServiceSignalWaveformApi(_vmTransport) + ..schematicModules = _schematicJson?['modules'] as Map? + ..rootName = _treeModel?.name + ..fetchModuleSchematic = _dataSource?.fetchModuleSchematic + ..evalCache = _evalCache + ..sharedEvaluator = _getSharedEvaluator(); + debugPrint('[Connection] Created VmServiceSignalWaveformApi'); + + // Immediately fetch the current simulation time so the waveform + // panel shows the real endTime even when connecting to an already- + // paused isolate (no new pause event will fire to trigger _onPause). + unawaited(_vmTransport.fetchAndEmitCurrentTime()); + } + + /// Detect color emoji font availability without causing rebuild flicker. + Future _detectEmojiFont() async { + final hasFont = await isEmojiFontInstalled(); + if (mounted && hasFont != _hasColorEmoji) { + setState(() => _hasColorEmoji = hasFont); + } + debugPrint('[StandaloneDevTools] Color emoji available: $hasFont'); + } + + /// Switch to a different example hierarchy. + Future _switchExample(int index) async { + setState(() { + _selectedExampleIndex = index; + _hasLoadedDesign = false; + _loadedDesignName = null; + }); + + // Dispose old data sources. + if (_dataSource is InProcessTreeDataSource || + _dataSource is StaticJsonTreeDataSource) { + await _dataSource?.dispose(); + } + _shutdownInProcessExample(); + + // Launch the new example and create data sources. + final examples = rohdExamples; + if (index >= examples.length) { + return; + } + + final example = examples[index]; + debugPrint('[Shell] Switching to example: ${example.name}'); + + try { + _exampleKeepAlive = await example.launcher(); + } on Exception catch (e) { + debugPrint('[Shell] Example launch failed: $e'); + setState(() => _error = 'Failed to launch example: $e'); + return; + } + + _dataSource = InProcessTreeDataSource(name: example.name); + _inProcessTransport = InProcessTransport(name: example.name); + _inProcessWaveformDataSource = InProcessWaveformDataSource( + name: example.name, + ); + _waveformApi = LoopbackSignalWaveformApi(_inProcessTransport) + ..evalCache = _evalCache; + + // Pre-load default signals for this example. + _savedMonitoredSignalPaths = _defaultMonitoredSignals(index); + + await _loadModuleTree(); + } + + @override + void dispose() { + _vmLivenessTimer?.cancel(); + stopDtdListener(); + _horizontalController.dispose(); + _verticalController.dispose(); + unawaited(_dataSource?.dispose()); + unawaited(_vmService?.dispose()); + // Dispose cubits + unawaited(_treeSearchTermCubit.close()); + unawaited(_signalSearchTermCubit.close()); + unawaited(_detailsTabCubit.close()); + unawaited(_hierarchyCubit.close()); + unawaited(_snapshotCubit.close()); + _canSnapshotNotifier.dispose(); + _waveformXp.dispose(); + _schematicXp.dispose(); + _shellXp.dispose(); + _crossProbeChannel.dispose(); + super.dispose(); + } + + /// Whether connected to a VM service (vs loopback mode). + bool get _isVmConnected => _vmService != null; + + /// Whether in loopback/demo mode (in-process or file-backed). + bool get _isLoopbackMode => + _dataSource is InProcessTreeDataSource || + _dataSource is StaticJsonTreeDataSource; + + Future _shellTarget() async { + if (_dataSource is InProcessTreeDataSource) { + return const InProcessRohdDesignTarget(); + } + final currentVmService = _vmService; + final currentIsolateId = _lastIsolateId; + if (currentVmService == null || currentIsolateId == null || _isVmDead) { + return null; + } + return VmServiceRohdDesignTarget(currentVmService, currentIsolateId); + } + + @override + void setState(VoidCallback fn) { + super.setState(fn); + _syncLocalConnectionStateFromHost(); + _syncCanSnapshot(); + } + + /// Push the current snapshot-availability to the [ValueNotifier] that + /// the wave viewer's snapshot button listens to via + /// [ValueListenableBuilder]. Called automatically after every + /// [setState]; the notifier deduplicates so only actual changes + /// trigger a rebuild. + void _syncCanSnapshot() { + _canSnapshotNotifier.value = + (_isVmConnected && !_isVmDead) || _isLoopbackMode; + } + + void _syncLocalConnectionStateFromHost() { + _isConnected = isConnected; + _isConnecting = isConnecting; + _isVmDead = isVmDead; + _isPaused = isPaused; + _vmService = vmService; + _lastVmServiceUri = lastVmServiceUri; + _lastIsolateId = lastIsolateId; + _connectedVmName = connectedVmName; + _autoReconnect = autoReconnect; + } + + /// Wait for icon fonts to finish loading, then show the connection dialog. + /// + /// On Flutter web (CanvasKit), fonts from FontManifest.json are loaded and + /// parsed by the WASM Skia engine asynchronously. There is no reliable + /// framework-level signal for when glyphs are actually renderable — the + /// `systemFonts` notification fires before CanvasKit finishes parsing. + /// We wait for the notification AND an additional frame to allow CanvasKit + /// to rasterise the glyphs, with a hard delay fallback. + Future _showConnectionDialogWhenReady() async { + if (kIsWeb) { + final completer = Completer(); + void onFontsChanged() { + if (!completer.isCompleted) { + completer.complete(); + } + } + + PaintingBinding.instance.systemFonts.addListener(onFontsChanged); + // Wait for the font-loaded signal (or timeout as fallback). + await completer.future.timeout( + const Duration(milliseconds: 1500), + onTimeout: () {}, + ); + PaintingBinding.instance.systemFonts.removeListener(onFontsChanged); + + // Give CanvasKit one more frame to rasterise the glyphs after loading. + await Future.delayed(const Duration(milliseconds: 100)); + if (mounted) { + await WidgetsBinding.instance.endOfFrame; + } + } + if (!mounted || _isConnected) { + return; + } + await showConnectionDialog(); + } + + void _handleBeforeVmConnected( + VmConnectionResult result, + String uri, { + required VmConnectionTransition transition, + }) { + final previousUri = transition.previousUri; + final previousIsolateId = transition.previousIsolateId; + if (!transition.isSameLogicalVm && + previousIsolateId != null && + result.isolateId != previousIsolateId) { + debugPrint( + '[Connection] Isolate ID changed ' + '($previousIsolateId → ${result.isolateId}) with ' + 'URI change ($previousUri → $uri) — ' + 'clearing saved monitored signals', + ); + _savedMonitoredSignalPaths = []; + } else if (transition.isSameLogicalVm && + previousIsolateId != null && + result.isolateId != previousIsolateId) { + debugPrint( + '[Connection] Isolate ID changed ' + '($previousIsolateId → ${result.isolateId}) at the same URI ' + '($uri) during same-VM restart — preserving saved monitored ' + 'signals', + ); + } + } + + void _handleConnectedVmState( + VmConnectionResult result, + String vmServiceUri, + VmServiceTreeDataSource vmDataSource, + ) { + // Transition to the main UI immediately — shows AppBar, empty panels, + // and a loading indicator while the (potentially large) design JSON + // is fetched and parsed in the background. + setState(() { + _vmService = result.vmService; + _dataSource = vmDataSource; + _isConnected = true; + _isConnecting = false; + _isVmDead = false; + _isPaused = false; + + final vmFlc = FlcService( + fetchModuleFlc: vmDataSource.fetchModuleFlc, + fetchFlcHierarchy: vmDataSource.fetchFlcHierarchy, + fetchFlcFilePath: vmDataSource.fetchFlcFilePath, + onClearCache: vmDataSource.clearFlcCache, + ); + _sourceNavService = SourceNavigationService() + ..sourceLineFetcher = vmDataSource.fetchSourceLine + ..setFlcService(vmFlc); + _extensionClient?.dispose(); + _extensionClient = FlcExtensionClient(flcService: vmFlc); + _currentFlcService = vmFlc; + if (persistentDtd != null && !persistentDtd!.isClosed) { + _sourceNavService!.setDtd(persistentDtd!); + } + debugPrint('[Shell] SourceNavigationService created'); + _lastVmServiceUri = vmServiceUri; + _lastIsolateId = result.isolateId; + }); + } + + void _handleExplicitDisconnect() { + // Explicit disconnect — don't carry signals to a future connection. + _savedMonitoredSignalPaths = []; + + setState(() { + _vmService = null; + _dataSource = null; + _treeModel = null; + _error = null; + _isConnected = false; + _isConnecting = false; + _isVmDead = false; + _isPaused = false; + connectionError = null; + _lastVmServiceUri = null; + _lastIsolateId = null; + _connectedVmName = null; + _autoReconnect = false; + _hasLoadedDesign = false; + _loadedDesignName = null; + _sourceNavService?.clearFlcService(); + _sourceNavService = null; + _extensionClient?.dispose(); + _extensionClient = null; + _currentFlcService = null; + }); + + unawaited(showConnectionDialog()); + } + + void _handlePausedVm() { + _vmTransport.pauseFetches(); + } + + Future _handleResumedVm() => _vmTransport.resumeFetches(); + + Future _handleLightweightReconnectSuccess( + VmConnectionResult result, + ) async { + await _vmTransport.reconnect( + result.vmService, + result.isolateId, + preserveTracking: true, + ); + + unawaited(_vmTransport.fetchAndEmitCurrentTime()); + + return VmServiceTreeDataSource( + vmService: result.vmService, + isolateId: result.isolateId, + ); + } + + void _handleDtdConnected(DartToolingDaemon dtd) { + _sourceNavService?.setDtd(dtd); + } + + void _handleDtdDisconnected() { + _sourceNavService?.clearDtd(); + } + + /// Full design+waveform refresh used by the module tree refresh button. + /// + /// Flushes all cached design/waveform state (snapshot, evaluator, + /// waveform cache) and bumps the connection generation so that a + /// brand-new WaveformViewerWrapper (with fresh BLoC + repository) is + /// created. Then reloads the module tree — which re-fetches structure + /// and endTime from the data source. + Future _fullRefresh() async { + debugPrint('[Refresh] Full design+waveform refresh'); + + // Flush cached evaluation / snapshot state. + _snapshotCubit.clear(); + _evalCache.reset(); + _sharedEvaluator = null; + + // Clear schematic so it's refetched. + _schematicJson = null; + + // Bump generation so WaveformViewerWrapper is fully recreated — + // this gives us a fresh SignalBloc, WaveformRepository (empty + // waveform cache), and RohdModuleBloc (empty endTime metadata). + _connectionGeneration++; + debugPrint( + '[Refresh] Bumped connection generation to ' + '$_connectionGeneration', + ); + + // For VM connections, also flush the per-signal timepoints in the + // data source so the next fetch retrieves full waveform history + // instead of only incremental data since the last fetch. + try { + _vmTransport.untrackAllSignals(); + } on Object catch (_) { + // late init / loopback — no VM data source + } + + // For loopback, clear the cached module structure so it's re-read + // from WaveformService on the next getModuleStructure() call. + _inProcessWaveformDataSource?.clearCache(); + + // Clear the waveform API caches (structure, index maps, waveform + // data) so everything is re-fetched from scratch. + final api = _waveformApi; + if (api is LoopbackSignalWaveformApi) { + api.clearCache(); + } else if (api is VmServiceSignalWaveformApi) { + api.clearCache(); + } + + // Re-fetch the current simulation time so endTime is correct. + if (_waveformApi != null) { + try { + final time = await _waveformApi!.getCurrentTime(); + if (time != null && time > 0) { + debugPrint('[Refresh] Current simulation time: $time'); + } + } on Object catch (_) {} + } + + // Reload the module tree (re-fetches hierarchy + schematic + + // endTime from the data source). + await _loadModuleTree(); + } + + Future _loadModuleTree() async { + debugPrint( + '[LoadTree] _loadModuleTree called, _dataSource: ' + '${_dataSource?.runtimeType}', + ); + if (_dataSource == null) { + debugPrint('[LoadTree] _dataSource is null, returning'); + return; + } + + // Capture the connection generation so we can detect if a + // disconnect/reconnect happened while we were awaiting. If the + // generation changes, this invocation must bail out to avoid + // writing stale data from an old design into the new API. + final startGeneration = _connectionGeneration; + final previousSelectedModulePath = _hierarchyCubit.selectedModule?.path(); + + debugPrint('[LoadTree] Loading module tree...'); + // Signal loading via the cubit only — no setState so the rest of the + // app (waveform, schematic, AppBar) is untouched. + _error = null; + _hierarchyCubit.setLoading(); + + try { + debugPrint('[LoadTree] Calling evalModuleTree...'); + var tree = await _dataSource!.evalModuleTree(); + debugPrint('[LoadTree] evalModuleTree returned: ${tree?.runtimeType}'); + + // Bail out if the connection changed during the await. + if (_connectionGeneration != startGeneration) { + debugPrint('[LoadTree] Generation changed — aborting stale load'); + return; + } + + // If eval returned null but the VM is alive, the isolate may have + // changed (e.g. hot restart). Try to re-discover the main isolate + // and create a fresh data source before giving up. + if (tree == null && _isVmConnected && _vmService != null) { + debugPrint('[LoadTree] Tree is null — trying isolate rediscovery'); + final refreshed = await _tryRefreshDataSource(); + if (refreshed) { + tree = await _dataSource!.evalModuleTree(); + debugPrint('[LoadTree] After rediscovery: ${tree?.runtimeType}'); + } + } + + // Bail out if the connection changed during isolate rediscovery. + if (_connectionGeneration != startGeneration) { + debugPrint('[LoadTree] Generation changed — aborting stale load'); + return; + } + + // Extract schematic JSON from data source if available + final schematicJson = _dataSource!.getSchematicJson(); + if (schematicJson != null) { + debugPrint( + '[LoadTree] Schematic JSON available: ' + '${schematicJson.length} keys', + ); + } else { + debugPrint('[LoadTree] No schematic JSON from data source'); + } + + if (tree == null && _isVmConnected) { + // Check if the VM service connection is actually still alive. + // After a debugger restart the old VmService object is disposed + // but _vmService isn't cleared until we detect it. If the + // connection is dead, fire VmDied immediately so auto-reconnect + // kicks in — don't wait for the 30-second liveness polling cycle. + final alive = await isVmServiceAlive(); + if (!alive) { + debugPrint('[LoadTree] VM service is dead — triggering VmDied'); + connectionStateMachine.handleEvent(const VmDied()); + if (mounted) { + setState(() { + _isVmDead = true; + }); + } + if (_autoReconnect) { + unawaited(attemptAutoReconnect()); + } + return; + } + + // The ROHD app may not have finished building ModuleTree yet. + // Instead of retrying in a blocking loop ("spinning"), we notify + // the state machine that the attempt returned null. The CSM + // will automatically retry on the next debug pause event when + // the app is more likely to have data ready. + debugPrint( + '[LoadTree] Tree is null — CSM will retry on next ' + 'debug pause', + ); + connectionStateMachine.handleEvent( + const HierarchyLoadResult(success: false), + ); + + // Re-subscribe to debug events in case the subscription was + // lost during reconnect. This is idempotent — if already + // subscribed, it just cancels and re-adds the listener. + if (_vmService != null) { + unawaited(connectionStateMachine.subscribeToDebugEvents(_vmService!)); + } + + _hierarchyCubit.setError( + 'Waiting for design data — will load automatically at next ' + 'breakpoint', + ); + return; + } + + _treeModel = tree; + _schematicJson = schematicJson; + _sharedEvaluator = null; // invalidate; will be recreated lazily + + // Push schematic modules, root name, and fetch callback to the + // waveform API for client-side evaluation of computed signals. + final api = _waveformApi; + if (schematicJson != null) { + final modules = schematicJson['modules'] as Map?; + if (api is VmServiceSignalWaveformApi) { + api.schematicModules = modules; + if (tree != null) { + api.rootName = tree.name; + } + api + ..fetchModuleSchematic = _dataSource?.fetchModuleSchematic + ..sharedEvaluator = _getSharedEvaluator(); + } else if (api is LoopbackSignalWaveformApi) { + api + ..schematicModules = modules + ..fetchModuleSchematic = _dataSource?.fetchModuleSchematic + ..sharedEvaluator = _getSharedEvaluator(); + } + } + + // Notify the state machine of the successful load. + if (tree != null) { + connectionStateMachine.handleEvent( + const HierarchyLoadResult(success: true), + ); + if (schematicJson != null) { + connectionStateMachine.markSchematicLoaded(); + } + } + + // Update the shared hierarchy cubit so embedded viewers can access it + if (tree != null) { + // Assign index-based addresses to every node and signal so + // OccurrenceAddress-based lookups and cross-probing work. + tree.buildAddresses(); + + _hierarchyCubit.loadFromNode(tree); + + final restoredSelection = previousSelectedModulePath == null + ? null + : _findHierarchyOccurrenceByPath(tree, previousSelectedModulePath); + if (restoredSelection != null) { + _hierarchyCubit.selectModule(restoredSelection); + } + + // Wire the hierarchy into source navigation so instance paths + // (from the waveform viewer) can be translated to definition + // paths for FLC lookup. + final hs = _hierarchyCubit.state; + if (hs is HierarchyLoaded && + hs.hierarchyService != null && + _sourceNavService != null) { + _sourceNavService!.setHierarchy(hs.hierarchyService!); + } + + // Push the hierarchy-derived module structure to the waveform API + // so it builds its DFS dictionary from the same tree the hierarchy + // cubit uses. This avoids a redundant fetch of module data via + // WaveformService — WaveformService should only transport signal + // *values*, not module structure. + if (_waveformApi != null && _connectionGeneration == startGeneration) { + final structure = ModuleStructure( + metadata: const MetaData( + source: 'TreeDataSource', + timescale: '1ps', + date: '', + ), + modules: [tree], + ); + final wfApi = _waveformApi; + if (wfApi is VmServiceSignalWaveformApi) { + await wfApi.setExternalStructure(structure); + } else if (wfApi is LoopbackSignalWaveformApi) { + await wfApi.setExternalStructure(structure); + } + } + + // Auto-select the top block so the Module panel highlights it and + // the Details tab shows its signals. Only do this on the initial + // load (when nothing is selected yet) so that a user's manual + // selection is preserved across refreshes. + if (_connectionGeneration != startGeneration) { + debugPrint('[LoadTree] Generation changed — aborting stale load'); + return; + } + if (_hierarchyCubit.selectedModule == null) { + _hierarchyCubit.selectModule(tree); + } + + // setState so non-cubit-driven parts of the UI (schematic viewer, + // AppBar) also see the updated _treeModel / _schematicJson. + if (mounted) { + setState(() {}); + } + + // In loopback mode, take an initial snapshot so signal values + // are visible in the schematic hover / details pane immediately. + if (_isLoopbackMode && _waveformApi != null) { + final signalValueSource = WaveformSignalValueSource( + api: _waveformApi!, + ); + final time = await signalValueSource.getCurrentTime(); + if (time != null && time > 0) { + unawaited(_snapshotCubit.takeSnapshot(signalValueSource, time)); + } + } + } else { + _hierarchyCubit.clear(); + } + } on Object catch (error, stackTrace) { + debugPrint('[LoadTree] Error loading module tree: $error\n$stackTrace'); + _error = 'Error loading module tree: $error'; + _hierarchyCubit.setError('Error loading module tree: $error'); + } + } + + /// Try to refresh the tree data source by re-discovering the current + /// main isolate. Returns true if the data source was replaced. + /// + /// This handles the case where the isolate changed (hot restart, debugger + /// reload) but the VM service connection is still alive. + Future _tryRefreshDataSource() async { + final vm = _vmService; + if (vm == null) { + return false; + } + try { + // During a debugger restart the test isolate (with ROHD) may not + // have spawned yet. Retry a few times with a short delay so we + // don't give up prematurely and wait for the CSM debug-pause retry. + String? newIsolateId; + const maxRetries = 4; + const retryDelay = Duration(milliseconds: 500); + + for (var attempt = 1; attempt <= maxRetries; attempt++) { + final vmInfo = await vm.getVM().timeout(const Duration(seconds: 3)); + final isolates = vmInfo.isolates ?? []; + if (isolates.isEmpty) { + if (attempt < maxRetries) { + debugPrint( + '[LoadTree] No isolates yet ' + '(attempt $attempt/$maxRetries) — retrying', + ); + await Future.delayed(retryDelay); + continue; + } + return false; + } + + for (final ref in isolates) { + final id = ref.id; + if (id == null) { + continue; + } + try { + final iso = await vm + .getIsolate(id) + .timeout(const Duration(milliseconds: 500)); + final libs = iso.libraries ?? []; + final hasRohd = libs.any( + (lib) => + lib.uri != null && + lib.uri!.contains('rohd') && + lib.uri!.contains('inspector_service'), + ); + if (hasRohd) { + newIsolateId = id; + break; + } + } on Exception { + continue; + } + } + + if (newIsolateId != null) { + break; + } + + // Isolates exist but none had ROHD yet. On the last attempt, + // fall back to the first isolate only if it differs from the + // current one (otherwise there's nothing new to try). + if (attempt < maxRetries) { + debugPrint( + '[LoadTree] ROHD isolate not found yet ' + '(attempt $attempt/$maxRetries, ' + '${isolates.length} isolate(s)) — retrying', + ); + await Future.delayed(retryDelay); + } else { + newIsolateId = isolates.first.id; + } + } + + if (newIsolateId == null) { + return false; + } + + // If the isolate is the same, no point in replacing the data source + if (newIsolateId == _lastIsolateId) { + return false; + } + + debugPrint( + '[LoadTree] Isolate changed: $_lastIsolateId → ' + '$newIsolateId — refreshing data source', + ); + _lastIsolateId = newIsolateId; + + // Replace the tree data source with the correct isolate + await _dataSource?.dispose(); + final newDataSource = VmServiceTreeDataSource( + vmService: vm, + isolateId: newIsolateId, + ); + setState(() { + _dataSource = newDataSource; + }); + + // Also update the waveform data source to use the correct isolate. + // Without this, _vmTransport still points at the old + // (wrong) isolate and all evaluate() calls return null. + await _vmTransport.reconnect(vm, newIsolateId, preserveTracking: true); + debugPrint( + '[LoadTree] Waveform data source updated to ' + 'isolate $newIsolateId', + ); + + // Clear stale cached data from the previous isolate's session. + // The waveform API caches the old dictionary, structure, and + // waveform data — all invalid after the debugger reloaded. + final api = _waveformApi; + if (api is VmServiceSignalWaveformApi) { + api.clearCache(); + debugPrint('[LoadTree] Cleared VmServiceSignalWaveformApi cache'); + } + + // Keep the current tree/schematic widgets alive until the refreshed + // design data arrives from the restarted VM. + _snapshotCubit.clear(); + _evalCache.reset(); + _sharedEvaluator = null; + + // Update the CSM identity + final identity = VmIdentity( + uri: _lastVmServiceUri ?? '', + isolateId: newIsolateId, + vmName: _connectedVmName, + ); + connectionStateMachine.handleEvent(ConnectionEstablished(vm, identity)); + unawaited(connectionStateMachine.subscribeToDebugEvents(vm)); + + return true; + } on Exception catch (e) { + debugPrint('[LoadTree] Isolate rediscovery failed: $e'); + return false; + } + } + + HierarchyOccurrence? _findHierarchyOccurrenceByPath( + HierarchyOccurrence root, + String path, + ) { + if (root.path() == path) { + return root; + } + + for (final child in root.children) { + final match = _findHierarchyOccurrenceByPath(child, path); + if (match != null) { + return match; + } + } + + return null; + } + + // NOTE: _retryLoadModuleTree has been removed. The old approach used + // an exponential-backoff loop (2s, 4s, 8s, ...) that "spun" after + // connect waiting for data. The ConnectionStateMachine now handles + // retries: when a debug pause event arrives and hierarchy data is + // still missing, it triggers a single _loadModuleTree call. This is + // event-driven instead of polling-driven. + + /// Show licenses page (cached callback to prevent rebuild). + void _showLicenses() { + registerBundledThirdPartyLicenses(); + showLicensePage(context: context); + } + + /// Get or create cached AppBar - only recreates if values changed. + _StandaloneAppBar _getAppBar() { + final currentIsLoopbackMode = _isLoopbackMode; + final currentIsVmConnected = _isVmConnected; + + if (_cachedAppBar == null || + _lastIsLoopbackMode != currentIsLoopbackMode || + _lastIsVmConnected != currentIsVmConnected || + _lastIsConnecting != _isConnecting || + _lastIsVmDead != _isVmDead || + _lastIsPaused != _isPaused || + _lastSelectedExampleIndex != _selectedExampleIndex || + _lastHasColorEmoji != _hasColorEmoji || + _lastHasLoadedDesign != _hasLoadedDesign || + _cachedAppBar!._extensionClient != _extensionClient) { + _lastIsLoopbackMode = currentIsLoopbackMode; + _lastIsVmConnected = currentIsVmConnected; + _lastIsConnecting = _isConnecting; + _lastIsVmDead = _isVmDead; + _lastIsPaused = _isPaused; + _lastSelectedExampleIndex = _selectedExampleIndex; + _lastHasColorEmoji = _hasColorEmoji; + _lastHasLoadedDesign = _hasLoadedDesign; + _cachedAppBar = _StandaloneAppBar( + title: widget.config.title, + isLoopbackMode: currentIsLoopbackMode, + isVmConnected: currentIsVmConnected, + isConnecting: _isConnecting, + isVmDead: _isVmDead, + isPaused: _isPaused, + selectedExampleIndex: _selectedExampleIndex, + exampleDropdownItems: _exampleDropdownItems, + onExampleChanged: _onExampleChanged, + onDisconnect: _onDisconnect, + onConnect: _onConnect, + onPause: _onPauseVm, + onResume: _onResumeVm, + onRefresh: _onRefresh, + onLicenses: _onLicenses, + onLoadDesign: _onLoadDesign, + onLoadWaveform: _onLoadWaveform, + hasLoadedDesign: _hasLoadedDesign, + loadedDesignName: _loadedDesignName, + canConnect: widget.config.connectionStrategy != null, + hasColorEmoji: _hasColorEmoji, + extensionClient: _extensionClient, + hierarchyCubit: _hierarchyCubit, + onRefreshModuleInfo: _refreshModuleInfoViaDtd, + ); + } + return _cachedAppBar!; + } + + // Cached body widget - rebuilt when tree model, error state, or + // connection generation changes. Connection generation MUST be + // tracked so that the WaveformViewerWrapper (which is baked into + // the cached widget tree) gets the new _waveformApi after a + // reconnect instead of routing to the disposed old data source. + Widget? _cachedBody; + TreeModel? _lastTreeModel; + String? _lastError; + int _lastConnectionGeneration = 0; + + Widget _getCachedBody(BuildContext context) { + if (_cachedBody == null || + _lastTreeModel != _treeModel || + _lastError != _error || + _lastConnectionGeneration != _connectionGeneration) { + _lastTreeModel = _treeModel; + _lastError = _error; + _lastConnectionGeneration = _connectionGeneration; + _cachedBody = _buildBody(context); + } + return _cachedBody!; + } + + @override + Widget build(BuildContext context) => MultiBlocProvider( + // Use BlocProvider.value to reuse existing cubits + // (prevents recreation on rebuild) + providers: [ + BlocProvider.value(value: _treeSearchTermCubit), + BlocProvider.value(value: _signalSearchTermCubit), + BlocProvider.value(value: _detailsTabCubit), + BlocProvider.value(value: _hierarchyCubit), + BlocProvider.value(value: _snapshotCubit), + ], + // Use Column with independent RepaintBoundary for each section + // This completely isolates AppBar repaints from body repaints + child: Column( + children: [ + // AppBar in its own RepaintBoundary with Listener to absorb pointer + // events This prevents pointer event bubbling that could cause + // waveform flicker on hover + RepaintBoundary( + child: Listener( + onPointerMove: (_) {}, // Consume pointer move events + onPointerDown: (_) {}, // Consume pointer down events + onPointerUp: (_) {}, // Consume pointer up events + behavior: HitTestBehavior.opaque, + child: _getAppBar(), + ), + ), + // Body in its own RepaintBoundary + Expanded(child: RepaintBoundary(child: _getCachedBody(context))), + ], + ), + ); + + /// Enter demo mode with loopback data. + Future _enterDemoMode() async { + connectionStateMachine.handleEvent(const DemoModeEntered()); + // Set connected first so the main UI renders immediately + setState(() { + _isConnected = true; + }); + await _initLoopbackMode(); + } + + /// Load a design JSON file from the user's file system. + /// + /// Supports ROHD hierarchy, Yosys netlist, and Unified formats. + /// The loaded design replaces the current loopback example. + /// After loading, the "Load Waveform" button becomes available. + /// + /// Uses file_selector (same as the wave viewer) for consistent native + /// file dialog behavior on Linux, macOS, and Windows. + Future _loadDesignFromFile() async { + try { + const typeGroup = XTypeGroup( + label: 'Design files', + extensions: ['json'], + ); + final xfile = await openFile(acceptedTypeGroups: [typeGroup]); + + if (xfile == null) { + return; // User cancelled + } + + final bytes = await xfile.readAsBytes(); + if (bytes.isEmpty) { + setState(() { + _error = 'Could not read file contents'; + }); + return; + } + + final fileName = xfile.name; + debugPrint( + '[LoadDesign] Loading design from: $fileName ' + '(${bytes.length} bytes)', + ); + + final jsonString = utf8.decode(bytes); + final jsonMap = jsonDecode(jsonString) as Map; + + // Dispose old data source (loopback or in-process) + if (_dataSource is StaticJsonTreeDataSource || + _dataSource is InProcessTreeDataSource) { + await _dataSource?.dispose(); + } + _shutdownInProcessExample(); + unawaited(_inProcessWaveformDataSource?.dispose()); + _inProcessWaveformDataSource = null; + + // Create a static tree data source from the loaded JSON + _dataSource = StaticJsonTreeDataSource(jsonMap, name: fileName); + + // Clear waveform data (will need to load a VCD separately) + // Keep the current _waveformApi so the wave viewer has something; + // it will be replaced when a waveform file is loaded. + + // Mark that we have a loaded design + setState(() { + _hasLoadedDesign = true; + _loadedDesignName = fileName; + _savedMonitoredSignalPaths = []; + _error = null; + }); + + // Bump connection generation so wave viewer recreates + _connectionGeneration++; + + await _loadModuleTree(); + + debugPrint('[LoadDesign] Design loaded successfully: $fileName'); + } on FormatException catch (e) { + setState(() { + _error = 'Invalid JSON format: $e'; + }); + } on Exception catch (e) { + setState(() { + _error = 'Error loading design: $e'; + }); + } + } + + /// Load a waveform file (VCD/FST/GHW) from the user's file system. + /// + /// This replaces the current waveform data while preserving the loaded + /// design hierarchy. Can be called multiple times to reload waveforms. + /// + /// Uses file_selector (same as the wave viewer) for consistent native + /// file dialog behavior on Linux, macOS, and Windows. + Future _loadWaveformFromFile() async { + try { + const typeGroup = XTypeGroup( + label: 'Waveform files', + extensions: ['vcd', 'fst', 'ghw'], + ); + final xfile = await openFile(acceptedTypeGroups: [typeGroup]); + + if (xfile == null) { + return; // User cancelled + } + + final bytes = await xfile.readAsBytes(); + if (bytes.isEmpty) { + setState(() { + _error = 'Could not read file contents'; + }); + return; + } + + final fileName = xfile.name; + debugPrint( + '[LoadWaveform] Loading waveform from: $fileName ' + '(${bytes.length} bytes)', + ); + + // Parse the VCD/FST/GHW via Wellen (like WaveDumper writes VCD) + final wellenApi = WellenSignalWaveformApi(); + await wellenApi.loadBytes(bytes.toList(), fileName: fileName); + + // Get the design hierarchy if one has been loaded — this provides + // richer signal metadata (port directions, types) than VCD alone. + HierarchyService? designHierarchy; + final hierarchyState = _hierarchyCubit.state; + if (hierarchyState is HierarchyLoaded) { + designHierarchy = hierarchyState.hierarchyService; + } + + // Create a WaveformDataSource that serves Wellen data through the + // same interface as ROHD's WaveformService. This parallels what + // WaveDumper does on the sim side: VCD → in-process repository. + final wellenDataSource = WellenBackedWaveformDataSource( + wellenApi: wellenApi, + designHierarchy: designHierarchy, + name: fileName, + ); + + // Dispose old in-process waveform data source + unawaited(_inProcessWaveformDataSource?.dispose()); + _inProcessWaveformDataSource = null; + _shutdownInProcessExample(); + + // Wrap with LoopbackSignalWaveformApi — the same adapter used by + // the in-process examples and by the VM service path. This gives + // us signal dictionary, compact transport, and snapshot cascade + // for free, hiding the transport layer. + _waveformApi = LoopbackSignalWaveformApi(wellenDataSource) + ..evalCache = _evalCache; + _connectionGeneration++; + _savedMonitoredSignalPaths = []; + + setState(() { + _error = null; + }); + + debugPrint('[LoadWaveform] Waveform loaded successfully: $fileName'); + } on Exception catch (e) { + setState(() { + _error = 'Error loading waveform: $e'; + }); + } + } + + Widget _buildBody(BuildContext context) { + // Show error banner if there's an error but we have data + Widget? errorBanner; + if (_error != null) { + errorBanner = Container( + width: double.infinity, + padding: const EdgeInsets.all(8), + color: Colors.orange.withValues(alpha: 0.2), + child: Row( + children: [ + platformIcon( + Icons.warning, + '⚠️', + color: Colors.orange, + size: 16, + hasColorEmoji: _hasColorEmoji, + ), + const SizedBox(width: 8), + Expanded( + child: Text( + _error!, + style: const TextStyle(fontSize: 12, color: Colors.orange), + ), + ), + IconButton( + icon: platformIcon( + Icons.close, + '✖️', + size: 16, + hasColorEmoji: _hasColorEmoji, + ), + onPressed: () => setState(() => _error = null), + padding: EdgeInsets.zero, + constraints: const BoxConstraints(), + ), + ], + ), + ); + } + + return Column( + children: [ + if (errorBanner != null) errorBanner, + Expanded(child: _buildTreeStructurePage(context)), + ], + ); + } + + Widget _buildTreeStructurePage(BuildContext context) => + BlocBuilder( + builder: (context, hierarchyState) { + final hierarchyService = hierarchyState is HierarchyLoaded + ? hierarchyState.hierarchyService + : null; + + return DevToolsSplitLayout( + moduleTreeConfig: ModuleTreePanelConfig( + icon: platformIcon( + Icons.account_tree, + '🌳', + hasColorEmoji: _hasColorEmoji, + ), + refreshIcon: platformIcon( + Icons.refresh, + '🔃', + size: 24, + hasColorEmoji: _hasColorEmoji, + ), + onRefresh: _fullRefresh, + treeContent: _buildTreeContent(context), + verticalController: _verticalController, + horizontalController: _horizontalController, + hierarchyService: hierarchyService, + bottomContent: RohdDesignShell( + targetProvider: _shellTarget, + formatForPath: (path) => SignalValueFormatRegistry.formatForAny( + [hierarchyService?.pathnameToAddress(path)], + ), + onSendSignals: (paths) { + _shellXp.send(paths, source: 'rohd-shell'); + }, + headerActions: [ + RohdShellHelpButton( + isDark: context.watch().state == + DevToolsThemeMode.dark, + hasColorEmoji: _hasColorEmoji, + ), + ], + ), + ), + detailsConfig: DetailsPanelConfig( + content: SourceFramePointerTracker( + child: DetailsPanelContent( + waveformConfig: WaveformTabConfig( + waveformViewer: WaveformViewerWrapper( + // Force recreation on example change or full reconnect + key: ValueKey( + '$_selectedExampleIndex:$_connectionGeneration', + ), + signalWaveformApi: _waveformApi, + crossProbeService: _waveformXp, + canSnapshotNotifier: _canSnapshotNotifier, + initialMonitoredSignalPaths: + _savedMonitoredSignalPaths.isNotEmpty + ? _savedMonitoredSignalPaths + : null, + onGoToSource: _sourceNavService != null + ? (format, paths) => _goToSource(paths, format) + : null, + extensionClient: _extensionClient, + ), + ), + schematicConfig: SchematicTabConfig( + assetPath: 'rohd_schematic.json', + customWidgetBuilder: ({required isVisible}) => + _buildStandaloneSchematicViewer( + context, + isVisible: isVisible, + ), + ), + hasColorEmoji: _hasColorEmoji, + signalValueFallback: _evaluateForDetailsPane, + onExpandModule: _expandModuleForDetailsPane, + onSendSignals: (paths) { + _crossProbeChannel.broadcast(paths, 'details'); + }, + onGoToSource: _sourceNavService != null + ? (format, paths) => _goToSource(paths, format) + : null, + availableSourceFormats: () => resolveNavigableFormats( + _extensionClient?.currentModuleInfo.value, + ), + ), + ), + ), + ); + }, + ); + + /// Build tree content driven by the hierarchy cubit. + /// + /// Only the tree panel rebuilds on refresh — the rest of the app + /// (waveform, schematic, AppBar) is untouched. + Widget _buildTreeContent(BuildContext context) => + BlocBuilder( + bloc: _hierarchyCubit, + builder: (context, state) { + if (state is HierarchyLoading) { + return const Center(child: CircularProgressIndicator()); + } + + if (state is HierarchyLoaded) { + return ModuleTreeCard(futureModuleTree: state.root); + } + + // HierarchyNotLoaded, HierarchyError, or null tree + return ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 320), + child: Padding( + padding: const EdgeInsets.all(20), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Text( + 'Friendly Notice: Please make sure that you use the ' + 'Module.build() method to fill in this Module Tree, ' + 'and also remember to put your first breakpoint past ' + 'the start of simulation.', + style: TextStyle(fontSize: 16), + textAlign: TextAlign.center, + softWrap: true, + ), + if (state is HierarchyError) ...[ + const SizedBox(height: 12), + Text( + state.message, + style: const TextStyle( + fontSize: 12, + color: Colors.orange, + ), + textAlign: TextAlign.center, + ), + ], + const SizedBox(height: 20), + ElevatedButton.icon( + onPressed: _loadModuleTree, + icon: const Icon(Icons.refresh), + label: const Text('Retry'), + ), + ], + ), + ), + ); + }, + ); + + /// Builds the schematic viewer with theme and hierarchy integration. + Widget _buildStandaloneSchematicViewer( + BuildContext context, { + required bool isVisible, + }) => + BlocBuilder( + builder: (context, hierarchyState) { + final hierarchyService = hierarchyState is HierarchyLoaded + ? hierarchyState.hierarchyService + : null; + + // Show loading message if hierarchy hasn't loaded yet + if (hierarchyService == null && hierarchyState is! HierarchyLoaded) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const CircularProgressIndicator(), + const SizedBox(height: 16), + Text( + 'Loading module hierarchy...', + style: Theme.of(context).textTheme.bodyMedium, + ), + ], + ), + ); + } + + final selectedModule = hierarchyState is HierarchyLoaded + ? hierarchyState.selectedModule + : null; + // Use the selected module's path, or fall back to the root + // module's path so that even top-level lookups are scoped. + final lookupModulePath = selectedModule?.path() ?? + (hierarchyState is HierarchyLoaded + ? hierarchyState.root.path() + : null); + return BlocBuilder( + builder: (context, themeMode) { + final schematicThemeMode = themeMode == DevToolsThemeMode.dark + ? SchematicThemeMode.dark + : SchematicThemeMode.light; + // Rebuild when snapshot state changes so that + // signalValueLookupFn picks up new snapshot data + // (e.g. after returning from a snapshot). + return BlocBuilder( + builder: (context, _) => EmbeddedSchematicViewer.fromHierarchy( + // Don't pass assetPath - use externalHierarchy instead + themeMode: schematicThemeMode, + externalHierarchy: hierarchyService!, + netlistJsonMap: _schematicJson, + selectedModule: selectedModule, + isVisible: isVisible, + signalValueLookupFn: _buildSignalValueLookup( + modulePath: lookupModulePath, + ), + fetchModuleNetlist: _dataSource?.fetchModuleSchematic, + crossProbeService: _schematicXp, + onGoToSourceCallback: _sourceNavService != null + ? (format, paths) => _goToSource(paths, format) + : null, + extensionClient: _extensionClient, + ), + ); + }, + ); + }, + ); + + /// Refresh module info via DTD's `rohd.queryModule` which performs + /// file-existence checks on the VS Code extension host side. + /// Returns the fresh [RohdModuleInfo], or `null` if DTD is unavailable. + Future _refreshModuleInfoViaDtd(String module) async { + final dtd = persistentDtd; + final flcService = _currentFlcService; + if (dtd == null || dtd.isClosed || flcService == null) { + debugPrint( + '[CrossProbe] DTD refresh unavailable ' + '(dtd=${dtd != null}, flcService=${flcService != null})', + ); + return null; + } + + final flcPath = await flcService.getFlcPath(); + if (flcPath == null) { + debugPrint( + '[CrossProbe] DTD refresh: no FLC path available; ' + 'using in-memory FLC data', + ); + final info = await _refreshModuleInfoLocally( + module, + dtdStatusMessage: 'No written FLC sidecar path is available; ' + 'using in-memory FLC data without VS Code file-existence checks.', + ); + return info; + } + + debugPrint( + '[CrossProbe] DTD rohd.queryModule: ' + 'module=$module, flcPath=$flcPath', + ); + + try { + final response = await dtd.call( + 'rohd', + 'queryModule', + params: {'flcPath': flcPath, 'module': module}, + ).timeout(const Duration(seconds: 3)); + final result = Map.from(response.result); + debugPrint('[CrossProbe] DTD queryModule result: $result'); + + // A successful live query is the strongest health signal for cross-probe. + final status = (result['status'] as String?)?.toLowerCase(); + final querySucceeded = status == null || status == 'ok'; + if (querySucceeded) { + result['dtdHealthy'] = true; + result['dtdRegistrationConflict'] = false; + result['dtdStatusMessage'] = + 'DTD service rohd responded successfully to queryModule.'; + } + + return RohdModuleInfo.fromJson(result); + } on Exception catch (e) { + debugPrint('[CrossProbe] DTD queryModule failed: $e'); + final dtdHealth = await _inspectRohdDtdService(dtd); + debugPrint('[CrossProbe] DTD health: $dtdHealth'); + return RohdModuleInfo( + extensionAvailable: false, + module: module, + error: e.toString(), + dtdHealthy: false, + dtdRegistrationConflict: + dtdHealth['dtdRegistrationConflict'] as bool? ?? false, + dtdStatusMessage: dtdHealth['dtdStatusMessage'] as String? ?? + 'DTD rohd.queryModule failed: $e', + ); + } + } + + /// Refresh module info using the local in-memory FLC client. + /// + /// This is the fallback when DTD cannot perform host-side file checks, for + /// example when the running ROHD app has not written an FLC sidecar file. + Future _refreshModuleInfoLocally( + String module, { + String? dtdStatusMessage, + }) async { + final client = _extensionClient; + if (client == null) { + return null; + } + + List? instancePath; + final hierarchyState = _hierarchyCubit.state; + if (hierarchyState is HierarchyLoaded) { + final selectedModule = + hierarchyState.selectedModule ?? hierarchyState.root; + instancePath = selectedModule.path().split('/'); + } + + final localInfo = await client.queryModule( + module, + instancePath: instancePath, + ); + return RohdModuleInfo( + extensionAvailable: localInfo.extensionAvailable, + module: localInfo.module, + formats: localInfo.formats, + error: localInfo.error, + dtdHealthy: true, + dtdStatusMessage: dtdStatusMessage, + fstLoading: localInfo.fstLoading, + ); + } + + static const Set _requiredRohdDtdMethods = { + 'goToSource', + 'resolveFrames', + 'queryModule', + 'lookupSignal', + }; + + static const String _rohdDtdBridgeCapabilityKey = 'rohdDtdBridge'; + static const int _rohdDtdBridgeCapabilityVersion = 1; + + /// Inspect live DTD service registration state without claiming ownership. + /// + /// This detects the common stale-window failure mode where `rohd` is already + /// registered by another client. New bridge owners advertise a capability + /// marker; an owner without it is treated as suspect so the UI can warn while + /// the failing DTD state is still live. + Future> _inspectRohdDtdService( + DartToolingDaemon dtd, + ) async { + try { + debugPrint('[CrossProbe] Inspecting DTD rohd service registration'); + final services = await dtd.getRegisteredServices().timeout( + const Duration(milliseconds: 900), + ); + final rohdServices = services.clientServices.where( + (service) => service.name == 'rohd', + ); + if (rohdServices.isEmpty) { + return const { + 'dtdHealthy': false, + 'dtdStatusMessage': 'DTD service rohd is not registered.', + }; + } + + final service = rohdServices.first; + final methods = service.methods; + final missingMethods = _requiredRohdDtdMethods + .where((method) => !methods.containsKey(method)) + .toList(); + final ownerHasBridgeCapability = methods.values.any((method) { + final capabilities = method.capabilities; + return capabilities != null && + capabilities[_rohdDtdBridgeCapabilityKey] == + _rohdDtdBridgeCapabilityVersion; + }); + + if (missingMethods.isNotEmpty) { + return { + 'dtdHealthy': false, + 'dtdRegistrationConflict': !ownerHasBridgeCapability, + 'dtdStatusMessage': 'DTD service rohd is missing method(s): ' + '${missingMethods.join(', ')}.', + }; + } + + if (!ownerHasBridgeCapability) { + // All required methods are present, but the owner does not advertise + // the bridge capability marker. Older/legacy ROHD extensions register + // the service without the marker, so treat this as a healthy (legacy) + // owner rather than a conflict. The capability marker is a positive + // confirmation signal, not a hard requirement — gating on it produced + // false "registration conflict" reports during normal DTD churn. + return const { + 'dtdHealthy': true, + 'dtdRegistrationConflict': false, + 'dtdStatusMessage': + 'DTD service rohd is registered by a ROHD bridge (legacy owner ' + 'without capability marker).', + }; + } + + return const { + 'dtdHealthy': true, + 'dtdRegistrationConflict': false, + 'dtdStatusMessage': + 'DTD service rohd is registered by the ROHD bridge.', + }; + } on Exception catch (e) { + final rohdKnownRegistered = isServiceAvailable('rohd'); + debugPrint( + '[CrossProbe] DTD service inspection failed: $e ' + '(cached rohd=$rohdKnownRegistered)', + ); + return { + 'dtdHealthy': false, + if (rohdKnownRegistered) 'dtdRegistrationConflict': true, + 'dtdStatusMessage': rohdKnownRegistered + ? 'DTD service rohd is registered, but this DevTools app could ' + 'not inspect its owner. This often indicates a stale or ' + 'mismatched DTD service owner.' + : 'Could not inspect DTD services: $e', + }; + } + } + + /// Resolve signal paths to enriched frames for the requested [format], then + /// navigate to the first matching frame via the ROHD VS Code extension. + Future _goToSource( + List signalPaths, + RohdSourceFormat format, + ) async { + final nav = _sourceNavService; + if (nav == null) { + return; + } + + final enriched = await nav.resolveSourceFrames(signalPaths, format: format); + if (enriched.isEmpty) { + debugPrint( + '[GoToSource] No ${format.name} frames found for signal — ' + '${format.name} source not available', + ); + return; + } + + debugPrint( + '[GoToSource] format=${format.name}, ' + 'enriched=${enriched.length} frames, ' + 'types=${enriched.map((e) => e.frame.type).toList()}', + ); + + // Filter to the requested format only. When the user explicitly requests a + // format, never fall back to unrelated source types. + final filtered = + enriched.where((e) => e.frame.type == format.name).toList(); + debugPrint('[GoToSource] filtered=${filtered.length} frames'); + if (filtered.isEmpty) { + debugPrint( + '[GoToSource] No ${format.name} frames found for signal — ' + '${format.name} source not available', + ); + return; + } + + if (!mounted) { + return; + } + // For output languages (SystemVerilog, SystemC) the FLC lists each + // signal's frames declaration-first followed by every assignment/driver + // in source order. Present them last-driver-first so the most recent + // assignment is at the top of the picker and the declaration is last. + // ROHD (Dart) frames keep their outermost-first ordering. + final isOutputLanguage = + format == RohdSourceFormat.sv || format == RohdSourceFormat.sc; + final ordered = isOutputLanguage ? filtered.reversed.toList() : filtered; + + final selectedIndex = await showSourceFramePicker(context, ordered); + if (selectedIndex == null) { + return; + } + await nav.navigateToFormat(ordered, selectedIndex, format); + } + + /// Eagerly expand a module's connectivity (slim → full JSON) so that + /// [_evaluateForDetailsPane] can compute internal signal values. + /// + /// Called from [SignalDetailsCard] when the internals toggle is activated. + /// Expands both the selected module and all of its immediate child modules + /// (whose cell definitions may still be slim), since internal signals are + /// often ports routed through child instances. + Future _expandModuleForDetailsPane(String moduleInstancePath) async { + final api = _waveformApi; + Future Function(String)? expandFn; + if (api is VmServiceSignalWaveformApi && api.fetchModuleSchematic != null) { + expandFn = api.ensureFullModules; + } else if (api is LoopbackSignalWaveformApi && + api.fetchModuleSchematic != null) { + expandFn = api.ensureFullModules; + } + if (expandFn == null) { + return; + } + + var anyExpanded = false; + + // 1. Expand the selected module itself. + final syntheticSignalPath = '$moduleInstancePath/_dummy'; + if (await expandFn(syntheticSignalPath)) { + anyExpanded = true; + } + + // 2. Expand all immediate child module definitions. + // Walk the cells of the selected module's definition to find child + // types that are still slim, then expand each one. + final modules = _schematicJson?['modules'] as Map?; + if (modules != null) { + final childPaths = _childInstancePaths(moduleInstancePath, modules); + for (final childPath in childPaths) { + final childSynthetic = '$childPath/_dummy'; + if (await expandFn(childSynthetic)) { + anyExpanded = true; + } + } + } + + if (anyExpanded && mounted) { + _sharedEvaluator = null; + _evalCache.reset(); // full reset — discard stale module indices too + setState(() {}); + } + } + + /// Return instance paths for all immediate children of [moduleInstancePath] + /// whose module definitions are still slim. + List _childInstancePaths( + String moduleInstancePath, + Map modules, + ) { + // Resolve the module definition key for [moduleInstancePath]. + final parts = moduleInstancePath.split('/'); + String? topKey; + for (final e in modules.entries) { + final attrs = (e.value as Map)['attributes'] + as Map?; + if (attrs?['top'] == 1) { + topKey = e.key; + break; + } + } + topKey ??= modules.keys.isNotEmpty ? modules.keys.first : null; + if (topKey == null) { + return const []; + } + + // Walk path to find the target module's definition. + var defName = topKey; + for (var i = 1; i < parts.length; i++) { + final cellName = parts[i]; + final modData = modules[defName] as Map?; + if (modData == null) { + return const []; + } + final cells = modData['cells'] as Map? ?? {}; + final cell = cells[cellName] as Map?; + final nextType = cell?['type'] as String?; + if (nextType == null || !modules.containsKey(nextType)) { + return const []; + } + defName = nextType; + } + + // Now enumerate the children of [defName]. + final modData = modules[defName] as Map?; + if (modData == null) { + return const []; + } + final cells = modData['cells'] as Map? ?? {}; + final result = []; + for (final entry in cells.entries) { + final cell = entry.value as Map; + final childType = cell['type'] as String?; + if (childType == null) { + continue; + } + final childDef = modules[childType] as Map?; + if (childDef != null && BaseSignalWaveformApi.isSlimModule(childDef)) { + result.add('$moduleInstancePath/${entry.key}'); + } + } + return result; + } + + /// Fallback value evaluator for the details-pane signal table. + /// + /// Follows the same protocol as [_buildSignalValueLookup] (schematic hover): + /// 1. Try the snapshot (direct match, then leaf-name match). If the + /// signal is present its value is authoritative — even 'x' (which + /// is a valid simulation value meaning unknown / don't-care). + /// 2. Evaluate on-demand via the client-side Yosys netlist for signals + /// absent from the snapshot (untracked / computed gate outputs). + /// 3. If the module is slim, schedule async expansion. + ({String value, bool computed})? _evaluateForDetailsPane(String signalPath) { + final snapshotState = _snapshotCubit.state; + if (snapshotState is! SnapshotLoaded) { + return null; + } + + // Clear resolved-value cache when the snapshot time changes. + final snapTime = snapshotState.time; + if (snapTime != _evalCacheSnapshotTime) { + _evalCache.clear(); + _evalCacheSnapshotTime = snapTime; + } + + // Derive the selected module's instance path so we can re-root + // definition-based signal paths to instance-based snapshot keys + // (mirrors hover steps 2 & 3 in [_buildSignalValueLookup]). + final hierState = _hierarchyCubit.state; + final modulePath = hierState is HierarchyLoaded + ? (hierState.selectedModule?.path() ?? hierState.root.path()) + : null; + + // ── 1. Snapshot lookup (mirrors hover steps 1–4) ── + // Presence in the snapshot means the value is authoritative. + final exact = snapshotState.getSignal(signalPath); + if (exact != null) { + return (value: exact.value, computed: exact.computed); + } + + // 1b. Re-root: replace the first segment (definition/type name) with + // the instance path so the key matches the snapshot. + // Skip when signalPath is already an absolute instance path + // (starts with the hierarchy root's ID), otherwise re-rooting + // duplicates segments (e.g. root/adder0/sig → root/adder0/adder0/sig). + String? rerooted; + final rootId = hierState is HierarchyLoaded ? hierState.root.path() : null; + final alreadyAbsolute = rootId != null && signalPath.startsWith('$rootId/'); + if (modulePath != null && signalPath.contains('/') && !alreadyAbsolute) { + final slash = signalPath.indexOf('/'); + final rest = signalPath.substring(slash); // includes leading '/' + rerooted = '$modulePath$rest'; + final byReroot = snapshotState.getSignal(rerooted); + if (byReroot != null) { + return (value: byReroot.value, computed: byReroot.computed); + } + } + + // 1c. Bare leaf name → prepend modulePath. + if (modulePath != null && !signalPath.contains('/')) { + final qualified = '$modulePath/$signalPath'; + final byQualified = snapshotState.getSignal(qualified); + if (byQualified != null) { + return (value: byQualified.value, computed: byQualified.computed); + } + } + + // 1d. Leaf-name match (last resort for snapshot). + final leafName = signalPath.contains('/') + ? signalPath.substring(signalPath.lastIndexOf('/') + 1) + : signalPath; + final byName = snapshotState.getSignalByName(leafName); + if (byName != null) { + return (value: byName.value, computed: byName.computed); + } + + // ── 2. On-demand evaluation via client-side Yosys netlist ── + // Signal is absent from the snapshot (untracked). Evaluate locally. + // Use the re-rooted path when available so the evaluator resolves + // against instance-keyed module data. + final evalPath = rerooted ?? signalPath; + + String? Function(String) snapshotLookup(SnapshotLoaded snap) => + (fullPath) => snap.getSignal(fullPath)?.value; + + final eval = _getSharedEvaluator(); + if (eval != null) { + final r = eval.evaluate(evalPath, snapshotLookup(snapshotState)); + if (r != null) { + return (value: r.value, computed: true); + } + } + + // ── 3. Module may be slim — schedule async expansion ── + _maybeExpandModuleForSignal(evalPath); + return null; + } + + /// Fire-and-forget expansion of the module(s) along [signalPath]. + /// + /// Deduplicates by the module instance path (signal path minus the + /// last segment) so that multiple signals in the same module produce + /// only one expansion request. + void _maybeExpandModuleForSignal(String signalPath) { + // Extract the module instance path (everything before the signal name). + final lastSlash = signalPath.lastIndexOf('/'); + final moduleKey = + lastSlash > 0 ? signalPath.substring(0, lastSlash) : signalPath; + if (_pendingModuleExpansions.contains(moduleKey)) { + return; + } + + final api = _waveformApi; + Future Function(String)? expandFn; + if (api is VmServiceSignalWaveformApi && api.fetchModuleSchematic != null) { + expandFn = api.ensureFullModules; + } else if (api is LoopbackSignalWaveformApi && + api.fetchModuleSchematic != null) { + expandFn = api.ensureFullModules; + } + if (expandFn == null) { + return; + } + + _pendingModuleExpansions.add(moduleKey); + unawaited( + expandFn(signalPath).then((expanded) { + _pendingModuleExpansions.remove(moduleKey); + if (expanded && mounted) { + // Modules were enriched in-place — invalidate the evaluator + // so it re-walks the now-full module data, then rebuild. + _sharedEvaluator = null; + _evalCache.clear(); + debugPrint( + '[DetailsPane] Module expanded for "$signalPath" — ' + 'rebuilding', + ); + setState(() {}); + } + }).catchError((Object e) { + _pendingModuleExpansions.remove(moduleKey); + debugPrint( + '[DetailsPane] Module expansion failed for ' + '"$signalPath": $e', + ); + }), + ); + } + + /// Build a signal value lookup callback from the current snapshot state. + /// + /// The schematic canvas now resolves wire / port names to fully-qualified + /// hierarchy paths (e.g. `"top/adder0/sum"`) using scope metadata from the + /// ELK layout. The lookup therefore tries, in order: + /// + /// 1. Direct signal-ID match — the canvas already built the full path. + /// 2. `modulePath/wireName` — fallback for the JS-first rendering path + /// or when the ELK metadata is absent. + /// 3. Leaf-name match — last resort when neither of the above hits. + /// + /// Returns `null` when no snapshot is available. + ({String value, bool computed, String signalId})? Function(String wireName)? + _buildSignalValueLookup({String? modulePath}) { + final snapshotState = _snapshotCubit.state; + if (snapshotState is! SnapshotLoaded) { + return null; + } + + // ── Diagnostic: log snapshot summary once per lookup batch ── + var dumpedKeys = false; + + ({String value, bool computed, String signalId}) hit(SignalSnapshot s) => + (value: s.value, computed: s.computed, signalId: s.signalId); + + return (String wireName) { + if (!dumpedKeys) { + dumpedKeys = true; + var withValue = 0; + var withX = 0; + var computed = 0; + for (final sig in snapshotState.signals.values) { + if (sig.computed) { + computed++; + } + if (sig.value == 'x' || sig.value.isEmpty) { + withX++; + } else { + withValue++; + } + } + debugPrint( + '[SignalLookup] modulePath=$modulePath, ' + '${snapshotState.signals.length} signals ' + '($withValue valued, $withX x/empty, $computed computed)', + ); + } + + // 1. Direct signal-ID match — works when the ELK hierarchy paths + // already use instance paths (matching snapshot keys exactly). + final exact = snapshotState.getSignal(wireName); + if (exact != null) { + return hit(exact); + } + + // 2. Re-root: the canvas sends paths rooted at the Yosys **type + // name** (e.g. "FloatingPointAdderDualPath_E8M23/sub/sum"), + // but snapshot keys use **instance paths** + // (e.g. "top/adder0/sub/sum"). + // Replace the first segment with `modulePath`. + if (modulePath != null && wireName.contains('/')) { + final slash = wireName.indexOf('/'); + final rest = wireName.substring(slash); // includes leading '/' + final rerooted = '$modulePath$rest'; + final byId = snapshotState.getSignal(rerooted); + if (byId != null) { + return hit(byId); + } + } + + // 3. Bare leaf name → prepend modulePath. + if (modulePath != null && !wireName.contains('/')) { + final qualifiedId = '$modulePath/$wireName'; + final byId = snapshotState.getSignal(qualifiedId); + if (byId != null) { + return hit(byId); + } + } + + // 4. Fall back to leaf-name match (works for top-level or when the + // qualified path doesn't match, e.g. hyperedge aliases). + final leafName = wireName.contains('/') + ? wireName.substring(wireName.lastIndexOf('/') + 1) + : wireName; + final byName = snapshotState.getSignalByName(leafName); + if (byName != null) { + return hit(byName); + } + + // 5. On-demand evaluation via client-side Yosys netlist. + // The snapshot only contains tracked (recorded) signals. + // Computed signals (gate outputs) can be derived from the + // expanded netlist JSON that is already on the client. + + // Build a re-rooted path the evaluator understands. + String? evalPath; + if (modulePath != null && wireName.contains('/')) { + final slash = wireName.indexOf('/'); + evalPath = '$modulePath${wireName.substring(slash)}'; + } else if (modulePath != null) { + evalPath = '$modulePath/$wireName'; + } + + if (evalPath != null) { + String? Function(String) snapLookup(SnapshotLoaded snap) => + (fullPath) => snap.getSignal(fullPath)?.value; + + // Try the shared evaluator (full cross-module resolution). + final eval = _getSharedEvaluator(); + if (eval != null) { + final r = eval.evaluate(evalPath, snapLookup(snapshotState)); + if (r != null) { + return (value: r.value, computed: true, signalId: evalPath); + } + } + + // Evaluation failed — module may be slim. Schedule expansion. + _maybeExpandModuleForSignal(evalPath); + } + + return null; + }; + } +} + +// Pre-defined colors to avoid recreating on each build +const _connectedColor = Color(0x3300FF00); // green with alpha +const _loopbackColor = Color(0x332196F3); // blue with alpha +const _disconnectedColor = Color(0x33FF0000); // red with alpha +const _connectingColor = Color(0x33FFB74D); // amber with alpha +const _pausedColor = Color(0x33FF9800); // orange with alpha +const _connectedTextColor = Color(0xFF81C784); // Colors.green.shade300 +const _loopbackTextColor = Color(0xFF64B5F6); // Colors.blue.shade300 +const _disconnectedTextColor = Color(0xFFE57373); // Colors.red.shade300 +const _connectingTextColor = Color(0xFFFFB74D); // Colors.amber.shade300 +const _pausedTextColor = Color(0xFFFFB74D); // Colors.amber.shade300 + +/// Separate AppBar widget to isolate hover effects from body rebuilds. +class _StandaloneAppBar extends StatefulWidget implements PreferredSizeWidget { + final String title; + final bool isLoopbackMode; + final bool isVmConnected; + final bool isConnecting; + final bool isVmDead; + final bool isPaused; + final int selectedExampleIndex; + final List> exampleDropdownItems; + final ValueChanged onExampleChanged; + final VoidCallback onDisconnect; + final VoidCallback onConnect; + final VoidCallback onPause; + final VoidCallback onResume; + final VoidCallback onRefresh; + final VoidCallback onLicenses; + final VoidCallback onLoadDesign; + final VoidCallback onLoadWaveform; + final bool hasLoadedDesign; + final String? loadedDesignName; + final bool canConnect; + final bool hasColorEmoji; + final RohdExtensionClient? _extensionClient; + final DevToolsHierarchyCubit? _hierarchyCubit; + + /// Optional callback to refresh module info with file-existence checks + /// via DTD. Called when the crossprobe icon is clicked. + final Future Function(String module)? _onRefreshModuleInfo; + + const _StandaloneAppBar({ + required this.title, + required this.isLoopbackMode, + required this.isVmConnected, + required this.isConnecting, + required this.isVmDead, + required this.isPaused, + required this.selectedExampleIndex, + required this.exampleDropdownItems, + required this.onExampleChanged, + required this.onDisconnect, + required this.onConnect, + required this.onPause, + required this.onResume, + required this.onRefresh, + required this.onLicenses, + required this.onLoadDesign, + required this.onLoadWaveform, + required this.hasLoadedDesign, + required this.canConnect, + required this.hasColorEmoji, + this.loadedDesignName, + RohdExtensionClient? extensionClient, + DevToolsHierarchyCubit? hierarchyCubit, + Future Function(String module)? onRefreshModuleInfo, + }) : _extensionClient = extensionClient, + _hierarchyCubit = hierarchyCubit, + _onRefreshModuleInfo = onRefreshModuleInfo; + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add(StringProperty('title', title)) + ..add( + FlagProperty( + 'isLoopbackMode', + value: isLoopbackMode, + ifFalse: 'VM connected', + ), + ) + ..add( + FlagProperty( + 'isVmConnected', + value: isVmConnected, + ifFalse: 'loopback mode', + ), + ) + ..add( + FlagProperty('isConnecting', value: isConnecting, ifTrue: 'connecting'), + ) + ..add(FlagProperty('isVmDead', value: isVmDead, ifTrue: 'VM dead')) + ..add(FlagProperty('isPaused', value: isPaused, ifTrue: 'paused')) + ..add(IntProperty('selectedExampleIndex', selectedExampleIndex)) + ..add( + IterableProperty>( + 'exampleDropdownItems', + exampleDropdownItems, + ), + ) + ..add( + ObjectFlagProperty>( + 'onExampleChanged', + onExampleChanged, + ifNull: 'disabled', + ), + ) + ..add( + ObjectFlagProperty( + 'onDisconnect', + onDisconnect, + ifNull: 'disabled', + ), + ) + ..add( + ObjectFlagProperty( + 'onConnect', + onConnect, + ifNull: 'disabled', + ), + ) + ..add( + ObjectFlagProperty( + 'onPause', + onPause, + ifNull: 'disabled', + ), + ) + ..add( + ObjectFlagProperty( + 'onResume', + onResume, + ifNull: 'disabled', + ), + ) + ..add( + ObjectFlagProperty( + 'onRefresh', + onRefresh, + ifNull: 'disabled', + ), + ) + ..add( + ObjectFlagProperty( + 'onLicenses', + onLicenses, + ifNull: 'disabled', + ), + ) + ..add( + ObjectFlagProperty( + 'onLoadDesign', + onLoadDesign, + ifNull: 'disabled', + ), + ) + ..add( + ObjectFlagProperty( + 'onLoadWaveform', + onLoadWaveform, + ifNull: 'disabled', + ), + ) + ..add( + FlagProperty( + 'hasLoadedDesign', + value: hasLoadedDesign, + ifTrue: 'design loaded', + ), + ) + ..add(StringProperty('loadedDesignName', loadedDesignName)) + ..add( + FlagProperty( + 'canConnect', + value: canConnect, + ifFalse: 'cannot connect', + ), + ) + ..add( + FlagProperty( + 'hasColorEmoji', + value: hasColorEmoji, + ifFalse: 'fallback emojis', + ), + ); + } + + @override + Size get preferredSize => const Size.fromHeight(kToolbarHeight); + + @override + State<_StandaloneAppBar> createState() => _StandaloneAppBarState(); +} + +class _StandaloneAppBarState extends State<_StandaloneAppBar> { + // Cache background color to avoid Theme.of(context) on every build + Color? _backgroundColor; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _backgroundColor = Theme.of(context).colorScheme.onPrimary; + } + + @override + Widget build(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + return AppBar( + backgroundColor: _backgroundColor, + title: Text(widget.title), + leading: Padding( + padding: const EdgeInsets.all(8), + child: Image.asset( + 'assets/rohd_icon.png', + width: 28, + height: 28, + fit: BoxFit.contain, + ), + ), + actions: [ + // Example selector + if (widget.isLoopbackMode) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: DropdownButton( + value: widget.selectedExampleIndex, + underline: const SizedBox(), + dropdownColor: isDark ? const Color(0xFF3C3C3C) : Colors.white, + borderRadius: BorderRadius.circular(8), + style: TextStyle( + fontSize: 13, + color: isDark ? Colors.white : Colors.black87, + ), + items: widget.exampleDropdownItems, + onChanged: widget.onExampleChanged, + ), + ), + // Load Design button (loopback mode only) + if (widget.isLoopbackMode) + Tooltip( + message: 'Load design JSON file', + child: TextButton.icon( + onPressed: widget.onLoadDesign, + icon: platformIcon( + Icons.folder_open, + '📂', + size: 18, + hasColorEmoji: widget.hasColorEmoji, + ), + label: Text( + 'Load Design', + style: TextStyle( + fontSize: 12, + color: isDark ? Colors.white70 : Colors.black87, + ), + ), + ), + ), + // Load Waveform button (loopback mode, only after design is loaded) + if (widget.isLoopbackMode && widget.hasLoadedDesign) + Tooltip( + message: 'Load VCD/FST/GHW waveform file', + child: TextButton.icon( + onPressed: widget.onLoadWaveform, + icon: platformIcon( + Icons.show_chart, + '📊', + size: 18, + hasColorEmoji: widget.hasColorEmoji, + ), + label: Text( + 'Load Waveform', + style: TextStyle( + fontSize: 12, + color: isDark ? Colors.white70 : Colors.black87, + ), + ), + ), + ), + // Connection status badge — reflects actual connection state + if (widget.isVmDead) + _ConnectionStatusBadge( + color: _disconnectedColor, + icon: Icons.cancel, + emoji: '❌', + iconColor: Colors.red, + label: 'VM Ended', + textColor: _disconnectedTextColor, + hasColorEmoji: widget.hasColorEmoji, + ) + else if (widget.isConnecting) + _ConnectionStatusBadge( + color: _connectingColor, + icon: Icons.sync, + emoji: '⏳', + iconColor: Colors.amber, + label: 'Connecting…', + textColor: _connectingTextColor, + hasColorEmoji: widget.hasColorEmoji, + ) + else if (widget.isPaused) + _ConnectionStatusBadge( + color: _pausedColor, + icon: Icons.pause_circle, + emoji: '⏸️', + iconColor: Colors.orange, + label: 'Paused', + textColor: _pausedTextColor, + hasColorEmoji: widget.hasColorEmoji, + ) + else if (widget.isVmConnected) + _ConnectionStatusBadge( + color: _connectedColor, + icon: Icons.check_circle, + emoji: '✅', + iconColor: Colors.green, + label: 'Connected', + textColor: _connectedTextColor, + hasColorEmoji: widget.hasColorEmoji, + ) + else + _ConnectionStatusBadge( + color: _loopbackColor, + icon: Icons.developer_mode, + emoji: '🔄', + iconColor: Colors.blue, + label: widget.hasLoadedDesign && widget.loadedDesignName != null + ? 'Loopback: ${widget.loadedDesignName}' + : 'Loopback Mode', + textColor: _loopbackTextColor, + hasColorEmoji: widget.hasColorEmoji, + ), + // Connect button is always available so users can force reconnect. + if (widget.canConnect) + IconButton( + icon: platformIcon( + Icons.link, + '🔗', + size: 24, + hasColorEmoji: widget.hasColorEmoji, + ), + onPressed: widget.onConnect, + tooltip: widget.isVmConnected + ? 'Reconnect / switch VM connection' + : 'Connect to VM', + ), + + // Pause / Resume waveform updates (shown only when connection is live + // or currently paused). + if (widget.canConnect && + ((widget.isVmConnected && !widget.isVmDead) || widget.isPaused)) + IconButton( + icon: platformIcon( + widget.isPaused ? Icons.play_arrow : Icons.pause, + widget.isPaused ? '▶️' : '⏸️', + size: 24, + hasColorEmoji: widget.hasColorEmoji, + ), + onPressed: widget.isPaused ? widget.onResume : widget.onPause, + tooltip: widget.isPaused + ? 'Resume waveform updates' + : 'Pause waveform updates (keeps connection alive)', + ), + IconButton( + icon: platformIcon( + Icons.refresh, + '🔃', + size: 24, + hasColorEmoji: widget.hasColorEmoji, + ), + onPressed: widget.onRefresh, + tooltip: 'Refresh', + ), + // Help button + DevToolsHelpButton(isDark: isDark), + // Licenses button + TextButton( + onPressed: widget.onLicenses, + child: Text( + 'Licenses', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Theme.of(context).brightness == Brightness.dark + ? Colors.white + : Colors.black87, + ), + ), + ), + // Cross-probe status icon: lit when extension is reachable, + // click shows available source formats for the current module. + if (widget._extensionClient != null) + _CrossProbeStatusButton( + extensionClient: widget._extensionClient!, + hierarchyCubit: widget._hierarchyCubit, + onRefreshModuleInfo: widget._onRefreshModuleInfo, + ), + // Theme toggle button + BlocBuilder( + builder: (context, themeMode) { + final isDark = themeMode == DevToolsThemeMode.dark; + return Tooltip( + message: + isDark ? 'Switch to light theme' : 'Switch to dark theme', + child: IconButton( + icon: platformIcon( + isDark ? Icons.light_mode : Icons.dark_mode, + isDark ? '☀️' : '🌙', + size: 24, + hasColorEmoji: widget.hasColorEmoji, + ), + onPressed: () { + context.read().toggleTheme(); + }, + ), + ); + }, + ), + const SizedBox(width: 8), + ], + ); + } +} + +/// Const-constructible connection status badge. +class _ConnectionStatusBadge extends StatelessWidget { + final Color color; + final IconData icon; + final String emoji; + final Color iconColor; + final String label; + final Color textColor; + final bool hasColorEmoji; + + const _ConnectionStatusBadge({ + required this.color, + required this.icon, + required this.emoji, + required this.iconColor, + required this.label, + required this.textColor, + required this.hasColorEmoji, + }); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add(ColorProperty('color', color)) + ..add(DiagnosticsProperty('icon', icon)) + ..add(ColorProperty('iconColor', iconColor)) + ..add(StringProperty('emoji', emoji)) + ..add(StringProperty('label', label)) + ..add(ColorProperty('textColor', textColor)) + ..add( + FlagProperty( + 'hasColorEmoji', + value: hasColorEmoji, + ifFalse: 'fallback emojis', + ), + ); + } + + @override + Widget build(BuildContext context) => Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + margin: const EdgeInsets.symmetric(vertical: 8), + decoration: BoxDecoration( + color: color, + borderRadius: BorderRadius.circular(4), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + platformIcon( + icon, + emoji, + color: iconColor, + size: 16, + hasColorEmoji: hasColorEmoji, + ), + const SizedBox(width: 8), + Text(label, style: TextStyle(fontSize: 12, color: textColor)), + ], + ), + ); +} + +/// App bar button that shows cross-probe availability. +/// +/// The icon is lit (full opacity) when the extension client reports available +/// true, and dim otherwise. Tapping it opens a small popup menu listing the +/// source formats available for the currently-selected module. +class _CrossProbeStatusButton extends StatefulWidget { + final RohdExtensionClient _extensionClient; + final DevToolsHierarchyCubit? _hierarchyCubit; + + /// Optional callback to refresh module info with file-existence checks + /// (e.g. via DTD). When provided, clicking the icon triggers a fresh + /// sanity check before showing the popup. + final Future Function(String module)? _onRefreshModuleInfo; + + const _CrossProbeStatusButton({ + required RohdExtensionClient extensionClient, + DevToolsHierarchyCubit? hierarchyCubit, + Future Function(String module)? onRefreshModuleInfo, + }) : _extensionClient = extensionClient, + _hierarchyCubit = hierarchyCubit, + _onRefreshModuleInfo = onRefreshModuleInfo; + + @override + State<_CrossProbeStatusButton> createState() => + _CrossProbeStatusButtonState(); +} + +class _CrossProbeStatusButtonState extends State<_CrossProbeStatusButton> { + bool _isAvailable = false; + RohdModuleInfo? _moduleInfo; + String? _treeModuleName; + StreamSubscription? _cubitsub; + + @override + void initState() { + super.initState(); + _isAvailable = widget._extensionClient.isAvailable.value; + _moduleInfo = widget._extensionClient.currentModuleInfo.value; + widget._extensionClient.isAvailable.addListener(_onAvailableChanged); + widget._extensionClient.currentModuleInfo.addListener(_onModuleInfoChanged); + _cubitsub = widget._hierarchyCubit?.stream.listen(_onCubitState); + // Seed from current cubit state. + final cur = widget._hierarchyCubit?.state; + if (cur is HierarchyLoaded) { + final mod = cur.selectedModule ?? cur.root; + _treeModuleName = mod.definition ?? mod.name; + } + } + + @override + void didUpdateWidget(_CrossProbeStatusButton oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget._extensionClient != widget._extensionClient) { + oldWidget._extensionClient.isAvailable.removeListener( + _onAvailableChanged, + ); + oldWidget._extensionClient.currentModuleInfo.removeListener( + _onModuleInfoChanged, + ); + widget._extensionClient.isAvailable.addListener(_onAvailableChanged); + widget._extensionClient.currentModuleInfo.addListener( + _onModuleInfoChanged, + ); + _isAvailable = widget._extensionClient.isAvailable.value; + _moduleInfo = widget._extensionClient.currentModuleInfo.value; + } + } + + @override + void dispose() { + widget._extensionClient.isAvailable.removeListener(_onAvailableChanged); + widget._extensionClient.currentModuleInfo.removeListener( + _onModuleInfoChanged, + ); + unawaited(_cubitsub?.cancel()); + super.dispose(); + } + + void _onCubitState(DevToolsHierarchyState state) { + if (!mounted) { + return; + } + if (state is HierarchyLoaded) { + final mod = state.selectedModule ?? state.root; + final name = mod.definition ?? mod.name; + if (name != _treeModuleName) { + setState(() => _treeModuleName = name); + } + } else { + if (_treeModuleName != null) { + setState(() => _treeModuleName = null); + } + } + } + + void _onAvailableChanged() { + if (mounted) { + setState(() => _isAvailable = widget._extensionClient.isAvailable.value); + } + } + + void _onModuleInfoChanged() { + if (mounted) { + setState( + () => _moduleInfo = widget._extensionClient.currentModuleInfo.value, + ); + } + } + + static const _formatLabel = { + RohdSourceFormat.rohd: ('ROHD Dart Source', Icons.code), + RohdSourceFormat.sv: ('SystemVerilog', Icons.developer_board), + RohdSourceFormat.sc: ('SystemC', Icons.memory), + RohdSourceFormat.fst: ('FST Waveform', Icons.show_chart), + }; + + Future _showFormatsMenu(BuildContext context) async { + final renderBox = context.findRenderObject() as RenderBox?; + if (renderBox == null) { + return; + } + final overlay = + Overlay.of(context).context.findRenderObject()! as RenderBox; + final position = RelativeRect.fromRect( + Rect.fromPoints( + renderBox.localToGlobal(Offset.zero, ancestor: overlay), + renderBox.localToGlobal( + renderBox.size.bottomRight(Offset.zero), + ancestor: overlay, + ), + ), + Offset.zero & overlay.size, + ); + + // If a refresh callback is available and we have a module name, + // do a fresh DTD query with file-existence checks before showing + // the menu. + final module = _treeModuleName ?? _moduleInfo?.module; + var info = _moduleInfo; + if (module != null && widget._onRefreshModuleInfo != null) { + debugPrint('[CrossProbe] Refreshing module info for "$module" via DTD'); + try { + final freshInfo = await widget._onRefreshModuleInfo!(module); + if (freshInfo != null && mounted) { + info = freshInfo; + setState(() => _moduleInfo = freshInfo); + // Also update the extension client's notifier so other + // consumers see the refreshed data. + widget._extensionClient.currentModuleInfo.value = freshInfo; + } + } on Exception catch (e) { + debugPrint('[CrossProbe] DTD refresh failed: $e'); + // Fall through — show whatever we have cached. + } + } + + if (!mounted) { + return; + } + + final items = >[]; + final dtdWarning = info?.dtdHealthy == false; + + if (!_isAvailable) { + items.add( + const PopupMenuItem( + enabled: false, + height: 32, + child: Text( + 'Extension not reachable', + style: TextStyle(fontSize: 13, color: Colors.red), + ), + ), + ); + } else if (_treeModuleName == null && info == null) { + items.add( + const PopupMenuItem( + enabled: false, + height: 32, + child: Text('No module selected', style: TextStyle(fontSize: 13)), + ), + ); + } else { + if (dtdWarning) { + final message = info?.dtdStatusMessage ?? 'DTD service health unknown'; + items + ..add( + PopupMenuItem( + enabled: false, + height: 40, + child: Row( + children: [ + const Icon(Icons.warning_amber, size: 16, color: Colors.red), + const SizedBox(width: 8), + Flexible( + child: Text( + message, + style: const TextStyle(fontSize: 12, color: Colors.red), + ), + ), + ], + ), + ), + ) + ..add(const PopupMenuDivider(height: 6)); + } + + // Show the tree-selected module name (preferred) or schematic-selected. + final displayName = _treeModuleName ?? info?.module; + if (displayName != null) { + items + ..add( + PopupMenuItem( + enabled: false, + height: 28, + child: Text( + 'Module: $displayName', + style: const TextStyle( + fontSize: 12, + fontStyle: FontStyle.italic, + ), + ), + ), + ) + ..add(const PopupMenuDivider(height: 6)); + } + + final availableFormats = RohdSourceFormat.values + .where((f) => info?.formats[f]?.available ?? false) + .toList(); + + if (availableFormats.isEmpty) { + items.add( + const PopupMenuItem( + enabled: false, + height: 32, + child: Text( + 'No source formats available', + style: TextStyle(fontSize: 13), + ), + ), + ); + } else { + for (final fmt in availableFormats) { + final (label, _) = + _formatLabel[fmt] ?? (fmt.name.toUpperCase(), Icons.description); + final fmtInfo = info?.formats[fmt]; + final fileFound = fmtInfo?.fileFound ?? true; + final filePath = fmtInfo?.path; + + // Show a short path: last 2 segments (e.g. "build/Foo.sv"). + String? shortPath; + if (filePath != null) { + final segments = filePath.split('/'); + shortPath = segments.length > 2 + ? '…/${segments.sublist(segments.length - 2).join('/')}' + : filePath; + } + + items.add( + PopupMenuItem( + enabled: false, + height: 32, + child: Tooltip( + message: filePath ?? '', + waitDuration: const Duration(milliseconds: 300), + child: Row( + children: [ + Icon( + Icons.check_circle, + size: 14, + color: fileFound ? Colors.green : Colors.orange, + ), + const SizedBox(width: 8), + Text(label, style: const TextStyle(fontSize: 13)), + if (!fileFound) ...[ + const SizedBox(width: 4), + const Text( + '(missing)', + style: TextStyle(fontSize: 11, color: Colors.orange), + ), + ], + if (shortPath != null) ...[ + const SizedBox(width: 8), + Flexible( + child: Text( + shortPath, + style: TextStyle( + fontSize: 10, + color: fileFound + ? Colors.grey + : Colors.orange.shade300, + ), + overflow: TextOverflow.ellipsis, + ), + ), + ], + ], + ), + ), + ), + ); + } + + if (info?.error != null) { + items + ..add(const PopupMenuDivider(height: 6)) + ..add( + PopupMenuItem( + enabled: false, + height: 32, + child: Text( + 'Error: ${info!.error}', + style: const TextStyle(fontSize: 12, color: Colors.red), + overflow: TextOverflow.ellipsis, + ), + ), + ); + } + } + } + + if (!mounted) { + return; + } + + unawaited( + showMenu( + // The method checks [mounted] immediately before opening this menu. + // ignore: use_build_context_synchronously + context: context, + position: position, + items: items, + ), + ); + } + + @override + Widget build(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + final availableColor = isDark ? Colors.lightBlueAccent : Colors.blue; + final warningColor = isDark ? Colors.orangeAccent : Colors.deepOrange; + final unavailableColor = isDark ? Colors.white24 : Colors.black26; + final dtdWarning = _moduleInfo?.dtdHealthy == false; + + return Tooltip( + message: dtdWarning + ? 'Source cross-probe: DTD service conflict detected' + : _isAvailable + ? 'Source cross-probe: available — click to see formats' + : 'Source cross-probe: extension not reachable', + child: Opacity( + opacity: _isAvailable || dtdWarning ? 1.0 : 0.35, + child: IconButton( + icon: Icon( + dtdWarning ? Icons.warning_amber : Icons.swap_horiz, + color: dtdWarning + ? warningColor + : _isAvailable + ? availableColor + : unavailableColor, + ), + onPressed: () => _showFormatsMenu(context), + iconSize: 24, + ), + ), ); } } diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/ui.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/ui.dart index 7f54631213..b2f3a43b50 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/ui/ui.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/ui.dart @@ -7,15 +7,22 @@ // NOTE: standalone_app_shell.dart is excluded because it imports this barrel. export 'details_help_button.dart'; +export 'details_panel_content.dart'; export 'devtool_appbar.dart'; export 'devtools_connection_host.dart'; export 'devtools_help_button.dart'; +export 'devtools_split_layout.dart'; +export 'module_search_overlay.dart'; export 'module_tree_card.dart'; export 'module_tree_details_navbar.dart'; export 'platform_icon.dart'; +export 'rohd_design_shell.dart'; +export 'rohd_shell_help_button.dart'; export 'schematic_icon.dart'; export 'signal_details_card.dart'; export 'signal_table.dart'; export 'signal_table_text_field.dart'; export 'simulation_time_display.dart'; +export 'source_frame_picker.dart'; export 'vm_connection_form.dart'; +export 'waveform_viewer_wrapper.dart'; diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/vm_connection_form.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/vm_connection_form.dart index 6d51e52e45..ff7edb27d4 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/ui/vm_connection_form.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/vm_connection_form.dart @@ -74,7 +74,8 @@ class DiscoveredVmService with Diagnosticable { /// /// Returns the list of services found, or throws on error. typedef DiscoverVmServicesCallback = Future> Function( - String dtdUri); + String dtdUri, +); /// Reusable VM connection form that can be embedded in different contexts. /// @@ -240,8 +241,9 @@ class _VmConnectionFormState extends State { final cleaned = widget.cleanVmServiceUri(raw); if (cleaned.isNotEmpty && cleaned != raw) { widget.vmServiceUriController.text = cleaned; - widget.vmServiceUriController.selection = - TextSelection.collapsed(offset: cleaned.length); + widget.vmServiceUriController.selection = TextSelection.collapsed( + offset: cleaned.length, + ); } widget.onConnect(); } diff --git a/rohd_devtools_extension/lib/rohd_devtools/ui/waveform_viewer_wrapper.dart b/rohd_devtools_extension/lib/rohd_devtools/ui/waveform_viewer_wrapper.dart new file mode 100644 index 0000000000..7c2e8e73b9 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/ui/waveform_viewer_wrapper.dart @@ -0,0 +1,274 @@ +// Copyright (C) 2025-2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// waveform_viewer_wrapper.dart +// Wrapper widget that sets up the ROHD Wave Viewer with required providers. +// Supports both mock data and loopback waveform data sources. +// +// 2025 January 12 +// Author: Copilot +// 2026 January - Added loopback waveform data source support +// Author: Desmond Kirkpatrick + +import 'dart:async' show unawaited; + +import 'package:flutter/foundation.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:material_ui/material_ui.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/cubit/cubits.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/services.dart'; +import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart' + show CrossProbeService, GoToSourceCallback, RohdSourceFormat; +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; +import 'package:rohd_wave_viewer/rohd_wave_viewer.dart'; +import 'package:rohd_waveform/rohd_waveform.dart' + show SignalWaveformApi, WaveformUpdateEvent; + +/// A wrapper widget that configures the embedded ROHD Wave Viewer. +/// +/// It syncs the wave viewer's theme with the main app's DevToolsThemeCubit. +/// +/// When `useSharedHierarchy` is true (default), the wrapper listens to +/// [DevToolsHierarchyCubit] and will use the shared hierarchy from DevTools +/// instead of loading its own. This enables synchronized selection across +/// the module tree, waveform viewer, and schematic viewer. +/// +/// When `signalWaveformApi` is null, the viewer displays its empty state until +/// a waveform source becomes available. +class WaveformViewerWrapper extends StatefulWidget { + /// If true, use hierarchy from DevToolsHierarchyCubit. + /// If false, the wave viewer loads its own hierarchy from VCD data. + final bool _useSharedHierarchy; + + /// Optional waveform API, such as [LoopbackSignalWaveformApi]. + final SignalWaveformApi? _signalWaveformApi; + + /// Live notifier for snapshot availability. + /// + /// When provided, the wave viewer's snapshot button listens to this + /// notifier via `ValueListenableBuilder` instead of deriving + /// availability from `onSnapshotRequested` being non-null. + /// This bypasses Navigator route caching that can prevent widget + /// prop updates from reaching the snapshot button after pause/resume. + final ValueNotifier? _canSnapshotNotifier; + + /// SignalOccurrence hierarchy paths to restore after the new hierarchy loads. + /// + /// Saved before a full reconnect so the SignalBloc can attempt to + /// re-add each signal to the monitor list. Null when there is + /// nothing to restore. + final List? _initialMonitoredSignalPaths; + + /// Called whenever the monitored signal list changes. + /// The parent uses this to track which signals are actively monitored. + final ValueChanged>? _onMonitoredSignalsChanged; + + /// Callback when user wants to navigate to a signal's source for a chosen + /// [RohdSourceFormat]. + final GoToSourceCallback? _onGoToSource; + + /// Optional cross-probe service for cross-probing between viewers. + final CrossProbeService? _crossProbeService; + + /// Optional ROHD extension client for source-format handshaking. + final FlcExtensionClient? _extensionClient; + + /// Creates a waveform viewer wrapper. + const WaveformViewerWrapper({ + super.key, + bool useSharedHierarchy = true, + SignalWaveformApi? signalWaveformApi, + ValueNotifier? canSnapshotNotifier, + List? initialMonitoredSignalPaths, + ValueChanged>? onMonitoredSignalsChanged, + GoToSourceCallback? onGoToSource, + CrossProbeService? crossProbeService, + FlcExtensionClient? extensionClient, + }) : _useSharedHierarchy = useSharedHierarchy, + _signalWaveformApi = signalWaveformApi, + _canSnapshotNotifier = canSnapshotNotifier, + _initialMonitoredSignalPaths = initialMonitoredSignalPaths, + _onMonitoredSignalsChanged = onMonitoredSignalsChanged, + _onGoToSource = onGoToSource, + _crossProbeService = crossProbeService, + _extensionClient = extensionClient; + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add( + FlagProperty( + 'useSharedHierarchy', + value: _useSharedHierarchy, + ifFalse: 'loads own hierarchy', + ), + ) + ..add( + ObjectFlagProperty( + 'signalWaveformApi', + _signalWaveformApi, + ifNull: 'uses default mock API', + ), + ); + } + + @override + State createState() => _WaveformViewerWrapperState(); +} + +class _WaveformViewerWrapperState extends State { + SignalWaveformApi? get _api => widget._signalWaveformApi; + + /// Get the liveUpdates stream from the current API (if supported). + Stream? get _liveUpdatesStream { + final api = _api; + if (api is LoopbackSignalWaveformApi) { + return api.liveUpdates; + } + if (api is VmServiceSignalWaveformApi) { + return api.liveUpdates; + } + return null; + } + + SignalValueSource get _signalValueSource => WaveformSignalValueSource( + api: _api ?? + (throw StateError( + 'Cannot capture a snapshot without waveform data.')), + liveUpdates: _liveUpdatesStream, + ); + + /// Toggle between camera and video snapshot modes. + void _toggleSnapshotMode() { + final cubit = context.read(); + if (cubit.mode == SignalTrackingMode.camera) { + cubit.setMode(SignalTrackingMode.video); + // Start auto-tracking if a live stream is available + final source = _signalValueSource; + if (source.updates != null) { + cubit.startVideoTracking(source); + } + // Immediately snapshot at the current simulation time so the + // Details pane updates without waiting for the next debug event. + unawaited( + source.getCurrentTime().then((time) { + if (time != null && time > 0 && mounted) { + unawaited(cubit.takeSnapshot(source, time)); + } + }), + ); + } else { + cubit.setMode(SignalTrackingMode.camera); + // Camera mode — cubit.setMode already stops video tracking + } + // Force rebuild so the button icon updates + setState(() {}); + } + + @override + // Listen to DevToolsThemeCubit and DevToolsHierarchyCubit + Widget build(BuildContext context) { + final cubit = context.read(); + final isVideoMode = cubit.mode == SignalTrackingMode.video; + + // Build the wave viewer with theme and optional external hierarchy + Widget buildWaveViewer( + WaveViewerThemeMode themeMode, + HierarchyService? externalHierarchy, + HierarchyOccurrence? selectedModule, + int? lastSnapshotTimePs, + ) => + RepaintBoundary( + child: EmbeddedWaveViewer( + waveformApi: _api, + themeMode: themeMode, + externalHierarchy: externalHierarchy, + selectedModule: selectedModule, + title: 'ROHD DevTools', + liveUpdates: _liveUpdatesStream, + isExtensionMode: true, + initialMonitoredSignalPaths: widget._initialMonitoredSignalPaths, + onMonitoredSignalsChanged: widget._onMonitoredSignalsChanged, + onSnapshotRequested: (time) { + unawaited( + context.read().takeSnapshot( + _signalValueSource, + time, + ), + ); + }, + canSnapshotNotifier: widget._canSnapshotNotifier, + lastSnapshotTimePs: lastSnapshotTimePs, + isVideoMode: isVideoMode, + onVideoModeToggled: + _liveUpdatesStream != null && _api is! LoopbackSignalWaveformApi + ? _toggleSnapshotMode + : null, + onGoToSource: widget._onGoToSource, + crossProbeService: widget._crossProbeService, + extensionClient: widget._extensionClient, + ), + ); + + // Watch hierarchy cubit if using shared hierarchy + if (widget._useSharedHierarchy) { + return BlocBuilder( + buildWhen: (prev, curr) { + // Only rebuild when the snapshot time changes + final prevTime = prev is SnapshotLoaded ? prev.time : null; + final currTime = curr is SnapshotLoaded ? curr.time : null; + return prevTime != currTime; + }, + builder: (context, snapshotState) { + final lastSnapTime = + snapshotState is SnapshotLoaded ? snapshotState.time : null; + return BlocBuilder( + builder: (context, hierarchyState) { + final sharedHierarchy = hierarchyState is HierarchyLoaded + ? hierarchyState.hierarchyService + : null; + final selectedModule = hierarchyState is HierarchyLoaded + ? hierarchyState.selectedModule + : null; + return BlocBuilder( + builder: (context, themeMode) { + final waveViewerTheme = themeMode == DevToolsThemeMode.dark + ? WaveViewerThemeMode.dark + : WaveViewerThemeMode.light; + return buildWaveViewer( + waveViewerTheme, + sharedHierarchy, + selectedModule, + lastSnapTime, + ); + }, + ); + }, + ); + }, + ); + } + + // No shared hierarchy - just watch theme + snapshot + return BlocBuilder( + buildWhen: (prev, curr) { + final prevTime = prev is SnapshotLoaded ? prev.time : null; + final currTime = curr is SnapshotLoaded ? curr.time : null; + return prevTime != currTime; + }, + builder: (context, snapshotState) { + final lastSnapTime = + snapshotState is SnapshotLoaded ? snapshotState.time : null; + return BlocBuilder( + builder: (context, themeMode) { + final waveViewerTheme = themeMode == DevToolsThemeMode.dark + ? WaveViewerThemeMode.dark + : WaveViewerThemeMode.light; + return buildWaveViewer(waveViewerTheme, null, null, lastSnapTime); + }, + ); + }, + ); + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/utils/browser_window.dart b/rohd_devtools_extension/lib/rohd_devtools/utils/browser_window.dart new file mode 100644 index 0000000000..e47e183a51 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/utils/browser_window.dart @@ -0,0 +1,12 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// browser_window.dart +// Conditional export facade for browser/window helpers. +// +// 2026 June +// Author: Desmond Kirkpatrick + +export 'browser_window_stub.dart' + if (dart.library.io) 'browser_window_io.dart' + if (dart.library.js_interop) 'browser_window_web.dart'; diff --git a/rohd_devtools_extension/lib/rohd_devtools/utils/browser_window_io.dart b/rohd_devtools_extension/lib/rohd_devtools/utils/browser_window_io.dart new file mode 100644 index 0000000000..d47c24c488 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/utils/browser_window_io.dart @@ -0,0 +1,32 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// browser_window_io.dart +// IO-backed browser/window helpers for desktop platforms. +// +// 2026 June +// Author: Desmond Kirkpatrick + +import 'dart:async'; +import 'dart:io'; + +/// Returns the current browser location when available. +String browserCurrentHref() => Uri.base.toString(); + +/// Opens [url] using the platform default browser. +void openBrowserTab(String url) { + final uri = Uri.parse(url); + if (Platform.isLinux) { + unawaited(Process.start('xdg-open', [uri.toString()])); + return; + } + if (Platform.isMacOS) { + unawaited(Process.start('open', [uri.toString()])); + return; + } + if (Platform.isWindows) { + unawaited( + Process.start('cmd', ['/c', 'start', '', uri.toString()]), + ); + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/utils/browser_window_stub.dart b/rohd_devtools_extension/lib/rohd_devtools/utils/browser_window_stub.dart new file mode 100644 index 0000000000..ecb7bab165 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/utils/browser_window_stub.dart @@ -0,0 +1,16 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// browser_window_stub.dart +// Fallback browser/window helpers for unsupported platforms. +// +// 2026 June +// Author: Desmond Kirkpatrick + +/// Returns the current browser location when available. +String browserCurrentHref() => Uri.base.toString(); + +/// Opens [url] in a new browser tab when supported. +void openBrowserTab(String url) { + // No-op on unsupported platforms. +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/utils/browser_window_web.dart b/rohd_devtools_extension/lib/rohd_devtools/utils/browser_window_web.dart new file mode 100644 index 0000000000..bc61a27d0f --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/utils/browser_window_web.dart @@ -0,0 +1,18 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// browser_window_web.dart +// Web-backed browser/window helpers for opening tabs and reading location. +// +// 2026 June +// Author: Desmond Kirkpatrick + +import 'package:web/web.dart' as web; + +/// Returns the current browser location. +String browserCurrentHref() => web.window.location.href; + +/// Opens [url] in a new browser tab. +void openBrowserTab(String url) { + web.window.open(url, '_blank'); +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/utils/hierarchy_extensions.dart b/rohd_devtools_extension/lib/rohd_devtools/utils/hierarchy_extensions.dart new file mode 100644 index 0000000000..adbc6eedab --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/utils/hierarchy_extensions.dart @@ -0,0 +1,24 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// hierarchy_extensions.dart +// Convenience extensions for HierarchyOccurrence checks. +// +// 2026 June +// Author: Desmond Kirkpatrick + +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; + +/// Convenience helpers for [HierarchyOccurrence] nodes. +extension HierarchyOccurrenceExtensions on HierarchyOccurrence { + /// True when this node is the top/root of the provided [service]. + /// + /// If [service] is omitted, falls back to `parent == null` which + /// matches nodes that have not been parented (root of the tree). + bool isTop([HierarchyService? service]) { + if (service != null) { + return path() == service.root.path(); + } + return parent == null; + } +} diff --git a/rohd_devtools_extension/lib/rohd_devtools/utils/regex_utils.dart b/rohd_devtools_extension/lib/rohd_devtools/utils/regex_utils.dart new file mode 100755 index 0000000000..ad99f50823 --- /dev/null +++ b/rohd_devtools_extension/lib/rohd_devtools/utils/regex_utils.dart @@ -0,0 +1,73 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause + +// RegExp remains the compatibility implementation until Pattern gains parity. +// ignore_for_file: deprecated_member_use, unnecessary_ignore + +/// Creates a regular-expression [Pattern] while keeping direct RegExp +/// construction isolated from call sites. +Pattern regExpPattern( + String source, { + bool multiLine = false, + bool caseSensitive = true, + bool unicode = false, + bool dotAll = false, +}) => + RegExp( + source, + multiLine: multiLine, + caseSensitive: caseSensitive, + unicode: unicode, + dotAll: dotAll, + ); + +/// Returns whether [input] matches the regular expression [source]. +bool regExpHasMatch( + String source, + String input, { + bool multiLine = false, + bool caseSensitive = true, + bool unicode = false, + bool dotAll = false, +}) => + regExpPattern( + source, + multiLine: multiLine, + caseSensitive: caseSensitive, + unicode: unicode, + dotAll: dotAll, + ).allMatches(input).isNotEmpty; + +/// Returns the first regular-expression match for [source] in [input]. +Match? regExpFirstMatch( + String source, + String input, { + bool multiLine = false, + bool caseSensitive = true, + bool unicode = false, + bool dotAll = false, +}) => + RegExp( + source, + multiLine: multiLine, + caseSensitive: caseSensitive, + unicode: unicode, + dotAll: dotAll, + ).firstMatch(input); + +/// Returns all regular-expression matches for [source] in [input]. +Iterable regExpAllMatches( + String source, + String input, { + bool multiLine = false, + bool caseSensitive = true, + bool unicode = false, + bool dotAll = false, +}) => + RegExp( + source, + multiLine: multiLine, + caseSensitive: caseSensitive, + unicode: unicode, + dotAll: dotAll, + ).allMatches(input); diff --git a/rohd_devtools_extension/lib/rohd_devtools/view/rohd_devtools_page.dart b/rohd_devtools_extension/lib/rohd_devtools/view/rohd_devtools_page.dart index a17923cd22..6092131ff2 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/view/rohd_devtools_page.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/view/rohd_devtools_page.dart @@ -7,77 +7,155 @@ // 2025 January 28 // Author: Roberto Torres -import 'package:flutter/foundation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:material_ui/material_ui.dart'; -import 'package:rohd_devtools_extension/rohd_devtools/const/app_theme.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/cubit/cubits.dart'; import 'package:rohd_devtools_extension/rohd_devtools/rohd_devtools.dart'; import 'package:rohd_devtools_extension/rohd_devtools/ui/ui.dart'; -/// Main page for the embedded ROHD DevTools experience. +/// The main ROHD DevTools page with all necessary BlocProviders. class RohdDevToolsPage extends StatelessWidget { - /// Whether this page should wire [RohdServiceCubit] to the DevTools - /// extension service manager. - final bool manageServiceManager; + /// Whether the page-owned service cubit manages the global service manager. + final bool _manageServiceManager; - /// Creates the DevTools page. - const RohdDevToolsPage({super.key, this.manageServiceManager = true}); + /// Creates the ROHD DevTools page. + const RohdDevToolsPage({super.key, bool manageServiceManager = true}) + : _manageServiceManager = manageServiceManager; @override - - /// Adds the page configuration to Flutter's diagnostics tree. - void debugFillProperties(DiagnosticPropertiesBuilder properties) { - super.debugFillProperties(properties); - properties.add( - DiagnosticsProperty('manageServiceManager', manageServiceManager), + Widget build(BuildContext context) { + debugPrint('[RohdDevToolsPage] Building page with BlocProviders...'); + return MultiBlocProvider( + providers: [ + BlocProvider( + create: (context) { + debugPrint('[RohdDevToolsPage] Creating DevToolsThemeCubit...'); + return DevToolsThemeCubit(); + }, + ), + BlocProvider( + create: (context) { + debugPrint('[RohdDevToolsPage] Creating RohdServiceCubit...'); + final cubit = RohdServiceCubit( + manageServiceManager: _manageServiceManager, + ); + debugPrint('[RohdDevToolsPage] RohdServiceCubit created'); + return cubit; + }, + ), + BlocProvider( + create: (context) { + debugPrint('[RohdDevToolsPage] Creating TreeSearchTermCubit...'); + final cubit = TreeSearchTermCubit(); + debugPrint('[RohdDevToolsPage] TreeSearchTermCubit created'); + return cubit; + }, + ), + BlocProvider( + create: (context) { + debugPrint('[RohdDevToolsPage] Creating DevToolsHierarchyCubit...'); + final cubit = DevToolsHierarchyCubit(); + debugPrint('[RohdDevToolsPage] DevToolsHierarchyCubit created'); + return cubit; + }, + ), + BlocProvider( + create: (context) { + debugPrint('[RohdDevToolsPage] Creating SignalSearchTermCubit...'); + final cubit = SignalSearchTermCubit(); + debugPrint('[RohdDevToolsPage] SignalSearchTermCubit created'); + return cubit; + }, + ), + BlocProvider( + create: (context) { + debugPrint('[RohdDevToolsPage] Creating DetailsTabCubit...'); + final cubit = DetailsTabCubit(); + debugPrint('[RohdDevToolsPage] DetailsTabCubit created'); + return cubit; + }, + ), + BlocProvider( + create: (context) { + debugPrint('[RohdDevToolsPage] Creating SnapshotCubit...'); + return SnapshotCubit(); + }, + ), + ], + child: const RohdExtensionModule(), ); } - - @override - - /// Builds the themed DevTools page and its bloc providers. - Widget build(BuildContext context) => MultiBlocProvider( - providers: [ - BlocProvider(create: (context) => DevToolsThemeCubit()), - BlocProvider( - create: (context) => RohdServiceCubit( - manageServiceManager: manageServiceManager)), - BlocProvider(create: (context) => TreeSearchTermCubit()), - BlocProvider(create: (context) => SelectedModuleCubit()), - BlocProvider(create: (context) => SignalSearchTermCubit()), - BlocProvider(create: (context) => DetailsTabCubit()), - BlocProvider(create: (context) => SnapshotCubit()) - ], - child: BlocBuilder( - builder: (context, themeMode) { - final theme = themeMode == DevToolsThemeMode.dark - ? buildDarkTheme() - : buildLightTheme(); - - return Theme(data: theme, child: const RohdExtensionModule()); - })); } -/// Extension module wrapper used by the DevTools host. +/// The main ROHD DevTools module widget. class RohdExtensionModule extends StatefulWidget { - /// Creates the extension module. + /// Creates the ROHD DevTools module. const RohdExtensionModule({super.key}); @override - - /// Creates the module state. State createState() => _RohdExtensionModuleState(); } class _RohdExtensionModuleState extends State { + /// Whether the VM connection is paused (debug events disconnected, + /// UI state preserved). + bool _isPaused = false; + + /// Whether the VM connection is live. + bool _isConnected = false; + + /// Key for the [TreeStructurePage] so we can call pause/resume on it. + final _treePageKey = GlobalKey(); + @override + void initState() { + super.initState(); + debugPrint('[RohdExtensionModule] initState called'); + } + + void _onPauseResume() { + final treeState = _treePageKey.currentState; + if (treeState == null) { + return; + } + + if (_isPaused) { + debugPrint('[RohdExtensionModule] Resuming waveform fetches'); + treeState.resumeVmConnection(); + setState(() { + _isPaused = false; + }); + } else { + debugPrint('[RohdExtensionModule] Pausing waveform fetches'); + treeState.pauseVmConnection(); + setState(() { + _isPaused = true; + }); + } + } - /// Builds the module scaffold and tree view. + /// Called by [TreeStructurePage] when its connection state changes. + void _onConnectionStateChanged({required bool connected}) { + if (mounted && _isConnected != connected) { + setState(() => _isConnected = connected); + } + } + + @override Widget build(BuildContext context) { + debugPrint('[RohdExtensionModule] Building scaffold...'); final screenSize = MediaQuery.of(context).size; return Scaffold( - appBar: const DevtoolAppBar(), - body: TreeStructurePage(screenSize: screenSize)); + appBar: DevtoolAppBar( + isPaused: _isPaused, + onPauseResume: (_isConnected || _isPaused) ? _onPauseResume : null, + ), + body: TreeStructurePage( + key: _treePageKey, + screenSize: screenSize, + onConnectionStateChanged: _onConnectionStateChanged, + ), + ); } } diff --git a/rohd_devtools_extension/lib/rohd_devtools/view/tree_structure_page.dart b/rohd_devtools_extension/lib/rohd_devtools/view/tree_structure_page.dart index 8369557ffa..4f2a143ec1 100644 --- a/rohd_devtools_extension/lib/rohd_devtools/view/tree_structure_page.dart +++ b/rohd_devtools_extension/lib/rohd_devtools/view/tree_structure_page.dart @@ -2,34 +2,53 @@ // SPDX-License-Identifier: BSD-3-Clause // // tree_structure_page.dart -// Page for the tree structure. +// Page for the tree structure - used by DevTools extension. // // 2024 January 5 // Author: Yao Jing Quek +import 'dart:async'; + +import 'package:dtd/dtd.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:material_ui/material_ui.dart'; +import 'package:material_ui/material_ui.dart' hide MetaData; +import 'package:rohd_devtools_extension/rohd_devtools/cli/rohd_shell_dtd_service.dart'; import 'package:rohd_devtools_extension/rohd_devtools/cubit/cubits.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/devtools_dtd_connection.dart'; +import 'package:rohd_devtools_extension/rohd_devtools/services/services.dart' + hide serviceManager; import 'package:rohd_devtools_extension/rohd_devtools/ui/ui.dart'; -import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart'; +import 'package:rohd_devtools_widgets/rohd_devtools_widgets.dart' + show + LocalCrossProbeChannel, + LocalCrossProbeService, + RohdSourceFormat, + resolveNavigableFormats; +import 'package:rohd_hierarchy/rohd_hierarchy.dart' show HierarchyOccurrence; +import 'package:rohd_schematic_viewer/schematic_viewer.dart'; +import 'package:rohd_waveform/rohd_waveform.dart'; -/// Split-pane page showing the module tree and selected module details. -class TreeStructurePage extends StatelessWidget { - /// Creates the tree structure page. - TreeStructurePage({required this.screenSize, super.key}); +/// Page showing the ROHD module tree alongside details, waveform, and +/// schematics. +/// +/// This is used by the DevTools extension (embedded in Chrome DevTools). +/// For standalone mode, see `StandaloneDevToolsPage`. +class TreeStructurePage extends StatefulWidget { + /// Creates the page with the given [screenSize] for layout calculations. + const TreeStructurePage({ + required this.screenSize, + void Function({required bool connected})? onConnectionStateChanged, + super.key, + }) : _onConnectionStateChanged = onConnectionStateChanged; - /// Available size used to split the page into two panes. + /// Size of the screen used to determine layout constraints. final Size screenSize; - /// Horizontal scroll controller for the tree pane. - final ScrollController _horizontal = ScrollController(); - - /// Vertical scroll controller for the tree pane. - final ScrollController _vertical = ScrollController(); - - /// Boundary used when exporting the tree pane as PNG. - final GlobalKey _treeBoundaryKey = GlobalKey(); + /// Called when the VM connection state changes (connected/disconnected). + /// Allows parent widgets (e.g. RohdExtensionModule) to track connection + /// state for the pause/resume button. + final void Function({required bool connected})? _onConnectionStateChanged; @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { @@ -38,201 +57,680 @@ class TreeStructurePage extends StatelessWidget { } @override + State createState() => TreeStructurePageState(); +} + +/// State for [TreeStructurePage]. +/// +/// Public so that the parent extension module can call +/// `pauseVmConnection` and `resumeVmConnection` via a `GlobalKey`. +class TreeStructurePageState extends State { + late final ScrollController _horizontal; + late final ScrollController _vertical; + + /// Transport layer for VM service RPCs. + VmServiceTransport? _vmTransport; + + /// Waveform API adapter wrapping [_vmTransport]. + VmServiceSignalWaveformApi? _waveformApi; + + /// Subscription to waveform structure events. + StreamSubscription? _waveformStructureSub; + + /// Whether the VM connection is currently paused by the user. + bool _isPaused = false; + + // ── Cross-probing ────────────────────────────────────────────────── + final LocalCrossProbeChannel _crossProbeChannel = LocalCrossProbeChannel(); + late final LocalCrossProbeService _waveformXp; + late final LocalCrossProbeService _schematicXp; + late final LocalCrossProbeService _shellXp; + + // ── Source navigation (Go to Source via DTD) ────────────────────── + SourceNavigationService? _sourceNavService; + FlcExtensionClient? _extensionClient; + + /// DTD-hosted shell bound to the diagnostics-loaded design. + late final RohdShellDtdService _shellDtdService; + + /// Listener attached to `dtdManager.connection` that forwards the + /// current DTD connection into the source navigation service. + /// Needed so the embedded extension can + /// invoke `rohd.goToSource` once the DevTools host establishes its + /// DTD connection. + VoidCallback? _dtdConnectionListener; + + /// Listener that publishes the DevTools-owned shell on the active DTD. + VoidCallback? _shellDtdConnectionListener; + + String? _lastQueriedModulePath; + + @override + void initState() { + super.initState(); + _horizontal = ScrollController(); + _vertical = ScrollController(); + _waveformXp = LocalCrossProbeService( + _crossProbeChannel, + source: 'waveform', + ); + _schematicXp = LocalCrossProbeService( + _crossProbeChannel, + source: 'schematic', + ); + _shellXp = LocalCrossProbeService(_crossProbeChannel, source: 'rohd-shell'); + _shellDtdService = RohdShellDtdService(crossProbeService: _shellXp); + _wireDtdToShell(); + } + + @override + void dispose() { + if (_dtdConnectionListener != null) { + devToolsDtdConnection.removeListener(_dtdConnectionListener!); + _dtdConnectionListener = null; + } + if (_shellDtdConnectionListener != null) { + devToolsDtdConnection.removeListener(_shellDtdConnectionListener!); + _shellDtdConnectionListener = null; + } + unawaited(_waveformStructureSub?.cancel()); + _waveformXp.dispose(); + _schematicXp.dispose(); + _shellXp.dispose(); + _crossProbeChannel.dispose(); + _shellDtdService.clearDesign(); + _horizontal.dispose(); + _vertical.dispose(); + super.dispose(); + } - /// Builds the split-pane tree structure page. - Widget build(BuildContext context) => MultiBlocListener( - listeners: [ - BlocListener( - listener: (context, state) { - final snapshotCubit = context.read(); - - if (state is RohdServiceLoaded) { - final source = - context.read().signalValueSource; - if (source == null) { - return; - } - - if (snapshotCubit.mode != SignalTrackingMode.video) { - snapshotCubit.setMode(SignalTrackingMode.video); - } - - snapshotCubit.startVideoTracking(source); - } else if (state is RohdServiceInitial || - state is RohdServiceError) { - snapshotCubit.clear(); + /// Initialize (or re-initialize) the waveform data source from the + /// DevTools service manager. + /// + /// Called when `RohdServiceCubit` loads a tree successfully, which + /// proves the DevTools service manager is available. + /// + /// [tree] is the loaded hierarchy; it is wrapped into a + /// `ModuleStructure` and passed to `setExternalStructure` so the + /// waveform API can build its DFS signal dictionary. + /// + /// [rohdIsolateId] is the isolate discovered by the ROHD service cubit's + /// isolate scan. If `null`, falls back to DevTools' `mainIsolate`. + void _initWaveformDataSource( + HierarchyOccurrence? tree, { + String? rohdIsolateId, + Map? schematicJson, + }) { + final vmService = devToolsVmService; + if (vmService == null) { + return; + } + + // Prefer the explicitly discovered ROHD isolate; fall back to + // DevTools' mainIsolate (which may be the test runner). + final isolateId = rohdIsolateId ?? devToolsMainIsolateId; + if (isolateId == null) { + return; + } + + // Tear down previous data source if any (reconnect case). + unawaited(_waveformStructureSub?.cancel()); + _waveformStructureSub = null; + + _vmTransport = VmServiceTransport( + vmService: vmService, + isolateId: isolateId, + ); + _waveformApi = VmServiceSignalWaveformApi(_vmTransport!) + ..schematicModules = schematicJson?['modules'] as Map? + ..rootName = tree?.name + ..fetchModuleSchematic = + context.read().treeService?.fetchModuleSchematic; + debugPrint( + '[TreeStructurePage] Created VmServiceSignalWaveformApi' + ' (schematicModules: ${schematicJson?['modules'] != null})', + ); + + // Provide the hierarchy tree so the waveform API can build its + // DFS signal dictionary (compact index mapping). + if (tree != null) { + final structure = ModuleStructure( + metadata: const MetaData( + source: 'TreeDataSource', + timescale: '1ps', + date: '', + ), + modules: [tree], + ); + unawaited(_waveformApi!.setExternalStructure(structure)); + debugPrint( + '[TreeStructurePage] Provided external structure to ' + 'waveform API', + ); + } + + _waveformStructureSub = _vmTransport!.liveUpdates.listen((event) { + if (event.reason == WaveformUpdateReason.structureAvailable) { + debugPrint('[TreeStructurePage] Waveform structure available'); + } + }); + + // Notify parent that we're connected + widget._onConnectionStateChanged?.call(connected: true); + + // Trigger rebuild so WaveformViewerWrapper picks up the new API + setState(() {}); + } + + /// Pause waveform fetches — the VM connection stays alive and the + /// simulation timeline continues to advance, but expensive evaluate() + /// calls for waveform data and signal values are skipped. + void pauseVmConnection() { + if (_isPaused) { + return; + } + + debugPrint( + '[TreeStructurePage] Pausing waveform fetches ' + '(connection stays alive)', + ); + + _vmTransport?.pauseFetches(); + + setState(() { + _isPaused = true; + }); + } + + /// Resume waveform fetches — immediately backfills any data that + /// accumulated during the paused gap. + void resumeVmConnection() { + if (!_isPaused) { + return; + } + + debugPrint('[TreeStructurePage] Resuming waveform fetches'); + + setState(() { + _isPaused = false; + }); + + // Resume fetches and backfill gap data. + if (_vmTransport != null) { + unawaited(_vmTransport!.resumeFetches()); + } + + debugPrint('[TreeStructurePage] Waveform fetches resumed'); + } + + /// Bridge the DevTools-managed `dtdManager` connection into the + /// freshly-created source navigation service, pushing the current + /// DTD connection state and listening for future changes. + void _wireDtdToSourceNav() { + if (_sourceNavService == null) { + return; + } + // Push current value, if available. + final current = devToolsDtdConnection.value; + if (current != null) { + _sourceNavService!.setDtd(current); + } else { + debugPrint( + '[TreeStructurePage] DTD not yet connected — ' + 'waiting for dtdManager.connection', + ); + } + // Subscribe for future changes (replace any prior listener). + if (_dtdConnectionListener != null) { + devToolsDtdConnection.removeListener(_dtdConnectionListener!); + } + _dtdConnectionListener = () { + final dtd = devToolsDtdConnection.value; + if (dtd != null) { + _sourceNavService?.setDtd(dtd); + debugPrint( + '[TreeStructurePage] DTD connection established ' + '— wired into SourceNavigationService', + ); + } else { + _sourceNavService?.clearDtd(); + } + }; + devToolsDtdConnection.addListener(_dtdConnectionListener!); + } + + /// Publishes the shell independently of optional source navigation setup. + void _wireDtdToShell() { + void registerCurrentDtd() { + final dtd = devToolsDtdConnection.value; + if (dtd != null) { + unawaited(_registerShellOnDtd(dtd)); + } + } + + registerCurrentDtd(); + _shellDtdConnectionListener = registerCurrentDtd; + devToolsDtdConnection.addListener(_shellDtdConnectionListener!); + } + + /// Registers the DevTools-owned design shell on the active DTD connection. + Future _registerShellOnDtd(DartToolingDaemon dtd) async { + try { + await _shellDtdService.register(dtd); + debugPrint( + '[TreeStructurePage] Registered DTD service rohdDevtoolsShell', + ); + } on Object catch (error) { + debugPrint( + '[TreeStructurePage] DTD service rohdDevtoolsShell ' + 'unavailable: $error', + ); + } + } + + /// Replaces the shell interpreter with the newly diagnostics-loaded design. + void _configureShell( + HierarchyOccurrence tree, + Map? schematicJson, + ) { + if (schematicJson == null) { + _shellDtdService.clearDesign(); + return; + } + _shellDtdService.configure(schematicJson, designName: tree.name); + } + + @override + Widget build(BuildContext context) => + // Keep DevToolsHierarchyCubit in sync with RohdServiceCubit tree loads + BlocListener( + listener: (context, state) { + final hierarchyCubit = context.read(); + if (state is RohdServiceLoaded && state.treeModel != null) { + hierarchyCubit.loadFromNode(state.treeModel!); + // Auto-select root on initial load + if (hierarchyCubit.selectedModule == null) { + hierarchyCubit.selectModule(state.treeModel); + } + // Initialize waveform data source. + // Skip if paused — user deliberately disconnected. + if (!_isPaused) { + final serviceCubit = context.read(); + final rohdIsoId = serviceCubit.rohdIsolateId; + final schematicJson = + serviceCubit.treeService?.getSchematicJson(); + _configureShell(state.treeModel!, schematicJson); + _initWaveformDataSource( + state.treeModel, + rohdIsolateId: rohdIsoId, + schematicJson: schematicJson, + ); + // Initialize cross-probe services when tree service is ready. + final treeService = serviceCubit.treeService; + if (treeService != null && _sourceNavService == null) { + final tspFlc = FlcService( + fetchModuleFlc: treeService.fetchModuleFlc, + fetchFlcHierarchy: treeService.fetchFlcHierarchy, + fetchFlcFilePath: treeService.fetchFlcFilePath, + onClearCache: treeService.clearFlcCache, + ); + _sourceNavService = SourceNavigationService() + ..sourceLineFetcher = treeService.fetchSourceLine + ..setFlcService(tspFlc); + _wireDtdToSourceNav(); + _extensionClient?.dispose(); + _extensionClient = FlcExtensionClient(flcService: tspFlc); + _lastQueriedModulePath = null; + _queryModuleInfoForSelection(hierarchyCubit.selectedModule); + debugPrint( + '[TreeStructurePage] SourceNavigationService created ' + '(with FlcService fallback)', + ); } - }) - ], - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - _buildTreePane(context), - _buildDetailsPane(context) - ])))); - - Widget _buildTreePane(BuildContext context) => SizedBox( - width: screenSize.width / 2, - child: Card( - clipBehavior: Clip.antiAlias, - child: Stack(children: [ - RepaintBoundary( - key: _treeBoundaryKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildTreeToolbar(context), - Expanded( - child: Scrollbar( - thumbVisibility: true, - controller: _vertical, - child: SingleChildScrollView( - controller: _vertical, - child: Row(children: [ - Expanded( - child: Scrollbar( - thumbVisibility: true, - controller: _horizontal, - child: SingleChildScrollView( - scrollDirection: - Axis.horizontal, - controller: _horizontal, - child: BlocBuilder< - RohdServiceCubit, - RohdServiceState>( - builder: (context, state) => - _buildTreeStateBody( - state))))) - ])))) - ])), - Positioned( - right: 8, - bottom: 8, - child: ExportPngButton( - onPressed: () => captureBoundaryToPng(context, - boundaryKey: _treeBoundaryKey, - filePrefix: 'module_tree'))) - ]))); - - Widget _buildTreeToolbar(BuildContext context) => Padding( - padding: const EdgeInsets.all(10), - child: Row(children: [ - const Icon(Icons.account_tree), - const SizedBox(width: 10), - const Text('Module Tree'), - Expanded( - child: Row(mainAxisAlignment: MainAxisAlignment.end, children: [ - SizedBox( - width: 200, - child: TextField( - onChanged: (value) { - context.read().setTerm(value); + } + } else if (state is RohdServiceLoading) { + hierarchyCubit.setLoading(); + } else if (state is RohdServiceError) { + hierarchyCubit.setError(state.error); + } else if (state is RohdServiceInitial) { + // VM disconnected — tear down waveform data source so we + // don't hold stale references. + unawaited(_waveformStructureSub?.cancel()); + _waveformStructureSub = null; + if (_vmTransport != null) { + unawaited(_vmTransport!.dispose()); + _vmTransport = null; + } + _waveformApi = null; + // Tear down source navigation services. + if (_dtdConnectionListener != null) { + devToolsDtdConnection.removeListener(_dtdConnectionListener!); + _dtdConnectionListener = null; + } + _sourceNavService?.clearDtd(); + _sourceNavService?.clearFlcService(); + _sourceNavService = null; + _extensionClient?.dispose(); + _extensionClient = null; + _lastQueriedModulePath = null; + _shellDtdService.clearDesign(); + widget._onConnectionStateChanged?.call(connected: false); + setState(() {}); + } + }, + child: BlocListener( + listenWhen: (previous, current) { + final previousSelection = previous is HierarchyLoaded + ? previous.selectedModule?.path() + : null; + final currentSelection = current is HierarchyLoaded + ? current.selectedModule?.path() + : null; + return previousSelection != currentSelection; + }, + listener: (context, state) { + final selectedModule = + state is HierarchyLoaded ? state.selectedModule : null; + _queryModuleInfoForSelection(selectedModule); + }, + child: DevToolsSplitLayout( + moduleTreeConfig: ModuleTreePanelConfig( + icon: platformIcon(Icons.account_tree, '🌳'), + refreshIcon: platformIcon(Icons.refresh, '🔃', size: 24), + onRefresh: () => + context.read().evalModuleTree(), + treeContent: _buildTreeContent(context), + verticalController: _vertical, + horizontalController: _horizontal, + ), + detailsConfig: DetailsPanelConfig( + content: SourceFramePointerTracker( + child: DetailsPanelContent( + waveformConfig: WaveformTabConfig( + waveformViewer: WaveformViewerWrapper( + signalWaveformApi: _waveformApi, + crossProbeService: _waveformXp, + onGoToSource: _sourceNavService != null + ? (format, paths) => _goToSource(paths, format) + : null, + extensionClient: _extensionClient, + ), + ), + schematicConfig: SchematicTabConfig( + assetPath: 'rohd_schematic.json', + customWidgetBuilder: ({required isVisible}) => + _buildExtensionSchematicViewer( + context, + isVisible: isVisible, + ), + ), + noModuleSelectedText: 'No module selected', + onSendSignals: (paths) { + _crossProbeChannel.broadcast(paths, 'details'); }, - decoration: const InputDecoration(labelText: 'Search Tree'))), - IconButton( - icon: const Icon(Icons.refresh), - onPressed: () => - context.read().evalModuleTree()) - ])) - ])); - - Widget _buildTreeStateBody(RohdServiceState state) { - if (state is RohdServiceLoading) { - return const Center(child: CircularProgressIndicator()); - } - - if (state is RohdServiceLoaded) { - final futureModuleTree = state.treeModel; - if (futureModuleTree == null) { - return Container( - padding: const EdgeInsets.all(20), - child: const Text( - 'Friendly Notice: Please make sure that you use build() ' - 'method to build your module and put the breakpoint at ' - 'the simulation time.', - style: TextStyle(fontSize: 20), - textAlign: TextAlign.center)); - } + onGoToSource: _sourceNavService != null + ? (format, paths) => _goToSource(paths, format) + : null, + availableSourceFormats: () => resolveNavigableFormats( + _extensionClient?.currentModuleInfo.value, + ), + ), + ), + ), + ), + ), + ); - return ModuleTreeCard(futureModuleTree: futureModuleTree); + void _queryModuleInfoForSelection(HierarchyOccurrence? module) { + final client = _extensionClient; + if (client == null || module == null) { + return; } - if (state is RohdServiceError) { - return Center(child: Text('Error: ${state.error}')); + final modulePath = module.path(); + if (_lastQueriedModulePath == modulePath) { + return; } + _lastQueriedModulePath = modulePath; - return const Center(child: Text('Unknown state')); + final queryName = module.definition ?? modulePath; + unawaited( + client.queryModule(queryName, instancePath: modulePath.split('/')), + ); } - Widget _buildDetailsPane(BuildContext context) => SizedBox( - width: screenSize.width / 2, - child: Card( - clipBehavior: Clip.antiAlias, - child: - Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - const ModuleTreeDetailsNavbar(), - Expanded( - child: BlocBuilder( - builder: (context, selectedTab) => - IndexedStack(index: selectedTab.index, children: [ - Padding( - padding: - const EdgeInsets.only(left: 20, right: 20), - child: BlocBuilder( - builder: (context, state) => - BlocBuilder( - builder: (context, snapshotState) { - if (state is SelectedModuleLoaded) { - return SignalDetailsCard( - module: state.module, - snapshot: snapshotState - is SnapshotLoaded - ? snapshotState - : null); - } - - return const Center( - child: Text('No module selected')); - }))), - _buildFeaturePlaceholderPane(context, - icon: platformIcon(Icons.waves, '🌊', - size: 36, - color: Theme.of(context).colorScheme.primary, - hasColorEmoji: kIsWeb), - title: 'Waveform', - message: 'Waveform content will be available ' - 'in a future release.'), - _buildFeaturePlaceholderPane(context, - icon: const SchematicIcon(size: 36), - title: 'Schematic', - message: 'Schematic content will be available ' - 'in a future release.') - ]))) - ]))); - - Widget _buildFeaturePlaceholderPane(BuildContext context, - {required Widget icon, required String title, required String message}) { - final colorScheme = Theme.of(context).colorScheme; - - return Center( - child: Padding( - padding: const EdgeInsets.all(24), - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 360), - child: Column(mainAxisSize: MainAxisSize.min, children: [ - icon, - const SizedBox(height: 12), - Text(title, style: Theme.of(context).textTheme.titleMedium), - const SizedBox(height: 8), - Text(message, + Widget _buildTreeContent(BuildContext context) => + BlocBuilder( + builder: (context, state) { + if (state is RohdServiceLoading) { + return const Center(child: CircularProgressIndicator()); + } else if (state is RohdServiceLoaded) { + final futureModuleTree = state.treeModel; + if (futureModuleTree == null) { + return ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 320), + child: Padding( + padding: const EdgeInsets.all(20), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Text( + 'Friendly Notice: Please make sure that you use the ' + 'Module.build() method to fill in this Module Tree, ' + 'and also remember to put your first breakpoint past ' + 'the start of simulation.', + style: TextStyle(fontSize: 16), + textAlign: TextAlign.center, + softWrap: true, + ), + const SizedBox(height: 20), + ElevatedButton.icon( + onPressed: () => + context.read().evalModuleTree(), + icon: const Icon(Icons.refresh), + label: const Text('Refresh'), + ), + ], + ), + ), + ); + } else { + return ModuleTreeCard(futureModuleTree: futureModuleTree); + } + } else if (state is RohdServiceError) { + return Center(child: Text('Error: ${state.error}')); + } else { + // RohdServiceInitial – no app connected yet. + return ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 380), + child: Padding( + padding: const EdgeInsets.all(20), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox( + width: 32, + height: 32, + child: CircularProgressIndicator(strokeWidth: 3), + ), + const SizedBox(height: 20), + const Text( + 'Waiting for ROHD application...\n\n' + 'Start or restart a debug session with a ROHD ' + 'design. The extension will connect automatically.\n\n' + 'You can also use the Tools menu in the toolbar to ' + 'open the standalone Wave Viewer or Schematic Viewer.', + style: TextStyle(fontSize: 16), textAlign: TextAlign.center, - style: TextStyle( - color: colorScheme.onSurface.withValues(alpha: 0.72))) - ])))); + softWrap: true, + ), + const SizedBox(height: 20), + ElevatedButton.icon( + onPressed: () => + context.read().evalModuleTree(), + icon: const Icon(Icons.refresh), + label: const Text('Retry Connection'), + ), + ], + ), + ), + ); + } + }, + ); + + /// Resolve signal paths to enriched frames for the requested [format], then + /// navigate to the first matching frame via the ROHD VS Code extension. + Future _goToSource( + List signalPaths, + RohdSourceFormat format, + ) async { + final nav = _sourceNavService; + if (nav == null) { + return; + } + + final enriched = await nav.resolveSourceFrames(signalPaths, format: format); + if (enriched.isEmpty) { + debugPrint( + '[GoToSource] No ${format.name} frames found for signal — ' + '${format.name} source not available', + ); + return; + } + + debugPrint( + '[GoToSource] format=${format.name}, ' + 'enriched=${enriched.length} frames, ' + 'types=${enriched.map((e) => e.frame.type).toList()}', + ); + + // Filter to the requested format only. When the user explicitly requests a + // format, never fall back to unrelated source types. + final filtered = + enriched.where((e) => e.frame.type == format.name).toList(); + debugPrint('[GoToSource] filtered=${filtered.length} frames'); + if (filtered.isEmpty) { + debugPrint( + '[GoToSource] No ${format.name} frames found for signal — ' + '${format.name} source not available', + ); + return; + } + + if (!mounted) { + return; + } + final selectedIndex = await showSourceFramePicker(context, filtered); + if (selectedIndex == null) { + return; + } + await nav.navigateToFormat(filtered, selectedIndex, format); + } + + /// Builds the schematic viewer for extension mode, using schematic JSON + /// from [RohdServiceCubit]. + Widget _buildExtensionSchematicViewer( + BuildContext context, { + required bool isVisible, + }) => + BlocBuilder( + builder: (context, hierarchyState) { + final hierarchyService = hierarchyState is HierarchyLoaded + ? hierarchyState.hierarchyService + : null; + final selectedModule = hierarchyState is HierarchyLoaded + ? hierarchyState.selectedModule + : null; + + // Get schematic JSON from the service cubit + final serviceState = context.watch().state; + final serviceCubit = context.read(); + final schematicJson = serviceState is RohdServiceLoaded + ? serviceCubit.treeService?.getSchematicJson() + : null; + + return BlocBuilder( + builder: (context, themeMode) { + final schematicThemeMode = themeMode == DevToolsThemeMode.dark + ? SchematicThemeMode.dark + : SchematicThemeMode.light; + + return BlocBuilder( + builder: (context, _) { + if (hierarchyService != null) { + return EmbeddedSchematicViewer.fromHierarchy( + themeMode: schematicThemeMode, + externalHierarchy: hierarchyService, + netlistJsonMap: schematicJson, + selectedModule: selectedModule, + isVisible: isVisible, + signalValueLookupFn: _buildSignalValueLookup(context), + fetchModuleNetlist: + serviceCubit.treeService?.fetchModuleSchematic, + crossProbeService: _schematicXp, + onGoToSourceCallback: _sourceNavService != null + ? (format, paths) => _goToSource(paths, format) + : null, + extensionClient: _extensionClient, + ); + } + if (schematicJson != null) { + return EmbeddedSchematicViewer.fromNetlistMap( + netlistJsonMap: schematicJson, + themeMode: schematicThemeMode, + isVisible: isVisible, + crossProbeService: _schematicXp, + extensionClient: _extensionClient, + ); + } + return EmbeddedSchematicViewer.fromAsset( + assetPath: EmbeddedSchematicViewer.defaultAssetPath, + themeMode: schematicThemeMode, + isVisible: isVisible, + crossProbeService: _schematicXp, + extensionClient: _extensionClient, + ); + }, + ); + }, + ); + }, + ); + + /// Build a signal value lookup from the SnapshotCubit, if available. + static ({String value, bool computed, String signalId})? Function( + String wireName, + )? _buildSignalValueLookup(BuildContext context) { + final snapshotState = context.watch().state; + if (snapshotState is! SnapshotLoaded) { + return null; + } + + ({String value, bool computed, String signalId}) hit(SignalSnapshot s) => + (value: s.value, computed: s.computed, signalId: s.signalId); + + return (String wireName) { + final exact = snapshotState.getSignal(wireName); + if (exact != null) { + return hit(exact); + } + + final leafName = wireName.contains('/') + ? wireName.substring(wireName.lastIndexOf('/') + 1) + : wireName; + final byName = snapshotState.getSignalByName(leafName); + if (byName != null) { + return hit(byName); + } + + return null; + }; + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DiagnosticsProperty('screenSize', widget.screenSize)); } } diff --git a/rohd_devtools_extension/linux/flutter/generated_plugin_registrant.cc b/rohd_devtools_extension/linux/flutter/generated_plugin_registrant.cc index f6f23bfe97..9942ed2a79 100644 --- a/rohd_devtools_extension/linux/flutter/generated_plugin_registrant.cc +++ b/rohd_devtools_extension/linux/flutter/generated_plugin_registrant.cc @@ -6,9 +6,17 @@ #include "generated_plugin_registrant.h" +#include +#include #include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_js_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterJsPlugin"); + flutter_js_plugin_register_with_registrar(flutter_js_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); diff --git a/rohd_devtools_extension/linux/flutter/generated_plugins.cmake b/rohd_devtools_extension/linux/flutter/generated_plugins.cmake index f16b4c3421..221c718619 100644 --- a/rohd_devtools_extension/linux/flutter/generated_plugins.cmake +++ b/rohd_devtools_extension/linux/flutter/generated_plugins.cmake @@ -3,10 +3,13 @@ # list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux + flutter_js url_launcher_linux ) list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/rohd_devtools_extension/packages/rohd_devtools_widgets/pubspec.yaml b/rohd_devtools_extension/packages/rohd_devtools_widgets/pubspec.yaml deleted file mode 100644 index a8c31914f9..0000000000 --- a/rohd_devtools_extension/packages/rohd_devtools_widgets/pubspec.yaml +++ /dev/null @@ -1,25 +0,0 @@ -name: rohd_devtools_widgets -description: "Shared widgets for ROHD DevTools sub-packages: help button, PNG export, auto-hiding overlay." -version: 0.1.0 -publish_to: none -environment: - sdk: '>=3.6.0 <4.0.0' - flutter: '>=3.44.0' -dependencies: - flutter: {sdk: flutter} - material_ui: ">=1.1.0 <1.3.0" - rohd: ^0.6.9 - rohd_hierarchy: - path: ../../../packages/rohd_hierarchy - web: ^1.0.0 -dev_dependencies: - flutter_test: {sdk: flutter} - lints: ^5.0.0 - -dependency_overrides: - rohd: - path: ../../.. - -flutter: - assets: - - assets/extension/ diff --git a/rohd_devtools_extension/pubspec.yaml b/rohd_devtools_extension/pubspec.yaml index c5defd26bc..0bc38980d1 100644 --- a/rohd_devtools_extension/pubspec.yaml +++ b/rohd_devtools_extension/pubspec.yaml @@ -5,10 +5,12 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ^3.6.0 + sdk: ^3.6.0 + flutter: '>=3.44.0' dependencies: cupertino_icons: ^1.0.2 + dart_wellen: ^0.1.0 devtools_app_shared: ^0.5.0 devtools_extensions: ^0.5.0 devtools_shared: ^13.0.1 @@ -24,17 +26,20 @@ dependencies: flutter_web_plugins: sdk: flutter logging: ^1.2.0 + # Keep the modern Material compatibility layer below its Dart 3.6-incompatible release. material_ui: ">=1.1.0 <1.3.0" path: ^1.9.0 path_provider: ^2.1.0 - rohd: - path: .. - rohd_devtools_widgets: - path: ../packages/rohd_devtools_widgets - rohd_hierarchy: - path: ../packages/rohd_hierarchy - rohd_source_navigator: - path: ../packages/rohd_source_navigator + rohd: ^0.6.11 + rohd_devtools_widgets: ^0.1.0 + # Version 0.2.0 is available through the development-mode local/git overrides + # but has not yet been published to pub.dev. + rohd_hierarchy: ^0.1.0 + rohd_schematic_viewer: ^0.2.0 + rohd_source_navigator: ^0.1.0 + rohd_wave_viewer: ^0.1.0 + # Shares the viewer's extended monitored-waveform model. + rohd_waveform: ^0.1.0 vm_service: ^14.0.0 web: ^1.0.0 web_socket_channel: ^3.0.0 @@ -55,17 +60,14 @@ dev_dependencies: dependency_overrides: # Keep the transitive Cupertino UI package below the Dart 3.6-incompatible release. cupertino_ui: ">=1.0.0 <1.1.0" - rohd: - path: .. - rohd_devtools_widgets: - path: ../packages/rohd_devtools_widgets - rohd_hierarchy: - path: ../packages/rohd_hierarchy - rohd_source_navigator: - path: ../packages/rohd_source_navigator flutter: uses-material-design: true assets: - assets/help/ - - assets/icons/ + - assets/layout_bridge/ + - assets/third_party/elkjs/ + - assets/third_party/elkjs/LICENSES/elkjs_LICENSES.txt + - assets/rohd_icon.png + - assets/systemverilog_icon.png + - assets/systemc_icon.png diff --git a/rohd_devtools_extension/scripts/README.md b/rohd_devtools_extension/scripts/README.md new file mode 100644 index 0000000000..0b03b64467 --- /dev/null +++ b/rohd_devtools_extension/scripts/README.md @@ -0,0 +1,50 @@ +# Build Scripts + +This directory contains scripts to support building the ROHD DevTools Extension. + +## Scripts + +### stage_assets.sh + +Stages widget-owned assets into the local asset root. + +This script: + +- Resolves widget locations from `.dart_tool/package_config.json`, so it uses + the selected hosted, Git, or local dependency source +- Keeps legacy local asset staging available for widget assets outside Flutter + package asset declarations + +The web app loads the ELK bundle, license notice, and invocation adapter from +the `rohd_schematic_viewer` package asset namespace. Flutter publishes them +under `assets/packages/rohd_schematic_viewer/`, so hosted builds do not require +a sibling viewer checkout. + +**Usage:** + +```bash +./scripts/stage_assets.sh +``` + +Or via Makefile: + +```bash +make stage-js +``` + +## Build Process + +The build process uses the Makefile at the project root. See `../Makefile` for all available targets. + +### Key Steps + +1. **Asset Staging**: Resolve selected widget packages and stage legacy + widget assets when needed +2. **Flutter Build**: Bundle viewer-declared assets through Flutter's package + asset namespace + +### Important Notes + +- Do not modify files in `rohd-schematic-viewer` or `rohd-wave-viewer` without testing those changes in their standalone apps first +- Assets are copied (not symlinked) because Flutter's asset system doesn't follow symlinks +- Run `make stage-js` before any build if legacy widget assets have changed diff --git a/rohd_devtools_extension/scripts/build_linux_native.sh b/rohd_devtools_extension/scripts/build_linux_native.sh new file mode 100755 index 0000000000..07bc0f3c4f --- /dev/null +++ b/rohd_devtools_extension/scripts/build_linux_native.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# Copyright (C) 2026 Intel Corporation +# SPDX-License-Identifier: BSD-3-Clause +# +# build_linux_native.sh +# Prepares native assets for Linux build +# +# 2026 January +# Author: Desmond Kirkpatrick + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +RELEASE_DIR="${RELEASE_DIR:-$HOME/release}" +WAVE_VIEWER_DIR="$RELEASE_DIR/rohd-wave-viewer" + +echo "[build-linux] Preparing native assets for Linux build..." + +# Generate Dart/Rust bridge bindings first (needed before building Rust code) +echo "[build-linux] Generating Dart/Rust bridge bindings..." +cd "$WAVE_VIEWER_DIR" +bash scripts/build_dart_wellen_bridge.sh + +# Build native Rust library for wave viewer +echo "[build-linux] Building Wave Viewer native library..." +cd "$WAVE_VIEWER_DIR" +make rust-native + +# Create native_assets directory structure expected by Flutter +echo "[build-linux] Creating native_assets directory structure..." +mkdir -p "$ROOT_DIR/build/native_assets/linux" + +# Copy the native library to where Flutter expects it +echo "[build-linux] Copying libwellen_bridge.so to native_assets..." +cp "$WAVE_VIEWER_DIR/rust/wellen_bridge/target/release/libwellen_bridge.so" \ + "$ROOT_DIR/build/native_assets/linux/" || \ + (echo "ERROR: Failed to copy libwellen_bridge.so" && exit 1) + +echo "[build-linux] Native assets prepared successfully" +echo "[build-linux] Location: $ROOT_DIR/build/native_assets/linux/libwellen_bridge.so" diff --git a/rohd_devtools_extension/scripts/devtools_dev_mode.sh b/rohd_devtools_extension/scripts/devtools_dev_mode.sh new file mode 100755 index 0000000000..0d7f042ba1 --- /dev/null +++ b/rohd_devtools_extension/scripts/devtools_dev_mode.sh @@ -0,0 +1,570 @@ +#!/usr/bin/env bash + +# Copyright (C) 2026 Intel Corporation +# SPDX-License-Identifier: BSD-3-Clause +# +# devtools_dev_mode.sh +# Configures ROHD DevTools development dependency overrides. +# +# 2026 September +# Author: Desmond Kirkpatrick + +set -euo pipefail + +script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +extension_dir="$(cd -- "$script_dir/.." && pwd)" +cd "$extension_dir" + +mode="${1:-}" +overrides="pubspec_overrides.yaml" +source_state=".devtools_dependency_sources" +marker="# Generated by scripts/devtools_dev_mode.sh. Do not edit by hand." +if [[ -d ../packages/rohd_devtools_widgets ]]; then + widgets_package_path="../packages/rohd_devtools_widgets" +else + widgets_package_path="packages/rohd_devtools_widgets" +fi +widgets_overrides="$widgets_package_path/pubspec_overrides.yaml" + +default_rohd_path="$(cd .. && pwd)" +default_release_dir="$HOME/release" +if [[ -d "$HOME/true-release" ]]; then + default_release_dir="$HOME/true-release" +fi + +rohd_path="${ROHD_LOCAL_PATH:-$default_rohd_path}" +wave_viewer_path="${WAVE_VIEWER_LOCAL_PATH:-${RELEASE_DIR:-$default_release_dir}/rohd-wave-viewer}" +schematic_viewer_path="${SCHEMATIC_VIEWER_LOCAL_PATH:-${RELEASE_DIR:-$default_release_dir}/rohd-schematic-viewer}" + +rohd_git_url="${ROHD_GIT_URL:-https://github.com/intel/rohd.git}" +rohd_git_ref="${ROHD_GIT_REF:-main}" +wave_viewer_git_url="${WAVE_VIEWER_GIT_URL:-https://github.com/intel/rohd-wave-viewer.git}" +wave_viewer_git_ref="${WAVE_VIEWER_GIT_REF:-main}" +schematic_viewer_git_url="${SCHEMATIC_VIEWER_GIT_URL:-https://github.com/intel/rohd-schematic-viewer.git}" +schematic_viewer_git_ref="${SCHEMATIC_VIEWER_GIT_REF:-main}" + +packages=( + rohd + rohd_hierarchy + rohd_waveform + rohd_devtools_widgets + rohd_source_navigator + dart_wellen + rohd_wave_viewer + rohd_schematic_viewer +) + +declare -A sources=( + [rohd]=hosted + [rohd_hierarchy]=hosted + [rohd_waveform]=hosted + [rohd_devtools_widgets]=hosted + [rohd_source_navigator]=hosted + [dart_wellen]=hosted + [rohd_wave_viewer]=hosted + [rohd_schematic_viewer]=hosted +) + +usage() { + cat <<'USAGE' +Usage: scripts/devtools_dev_mode.sh + +Configure individual package sources: + scripts/devtools_dev_mode.sh configure ... + where each source is hosted, git, or local. + +Configure a package bundle: + scripts/devtools_dev_mode.sh configure-group + +Dependency groups: + rohd The fundamental rohd package + rohd-packages rohd_hierarchy, rohd_waveform, + rohd_devtools_widgets, and rohd_source_navigator + wave-viewer rohd_wave_viewer and dart_wellen + schematic-viewer rohd_schematic_viewer + all Every ROHD and viewer dependency + +Other modes: + manifest Use the hosted dependencies from pubspec.yaml + local-all Use local checkouts for every dependency + show Print the saved source selection and generated overrides + +Local checkout defaults: + ROHD_LOCAL_PATH Parent ROHD checkout (default: repository root) + WAVE_VIEWER_LOCAL_PATH Wave Viewer checkout + SCHEMATIC_VIEWER_LOCAL_PATH Schematic Viewer checkout + +If ~/true-release exists, viewer paths default below it; otherwise they default +below ~/release. RELEASE_DIR changes both viewer defaults. + +Git sources use the package's public repository and main branch by default. +Override them with ROHD_GIT_URL / ROHD_GIT_REF, +WAVE_VIEWER_GIT_URL / WAVE_VIEWER_GIT_REF, and +SCHEMATIC_VIEWER_GIT_URL / SCHEMATIC_VIEWER_GIT_REF. +USAGE +} + +validate_source() { + case "$1" in + hosted|git|local) ;; + *) + echo "Invalid dependency source '$1'; expected hosted, git, or local." >&2 + exit 2 + ;; + esac +} + +validate_package() { + case "$1" in + rohd|rohd_hierarchy|rohd_waveform|rohd_devtools_widgets|\ + rohd_source_navigator|dart_wellen|rohd_wave_viewer|\ + rohd_schematic_viewer) ;; + *) + echo "Unsupported package '$1'." >&2 + echo "Supported packages: ${packages[*]}." >&2 + exit 2 + ;; + esac +} + +ensure_managed_or_absent() { + local file="$1" + + if [[ -f "$file" ]] && ! grep -qxF "$marker" "$file"; then + echo "$file exists and was not generated by this script." >&2 + echo "Move or remove it before switching development modes." >&2 + exit 1 + fi +} + +resolve_directory() { + local path="$1" + + case "$path" in + '~') path="$HOME" ;; + \~/*) path="$HOME/${path:2}" ;; + esac + if [[ ! -d "$path" ]]; then + echo "Could not find local checkout: $path" >&2 + exit 1 + fi + (cd -- "$path" && pwd) +} + +resolve_saved_paths() { + rohd_path="$(resolve_directory "$rohd_path")" + wave_viewer_path="$(resolve_directory "$wave_viewer_path")" + schematic_viewer_path="$(resolve_directory "$schematic_viewer_path")" +} + +widgets_local_path() { + local path="$rohd_path/packages/rohd_devtools_widgets" + if [[ ! -f "$path/pubspec.yaml" ]]; then + path="$rohd_path/rohd_devtools_extension/packages/rohd_devtools_widgets" + fi + printf '%s' "$path" +} + +navigator_local_path() { + local path="$rohd_path/packages/rohd_source_navigator" + if [[ ! -f "$path/pubspec.yaml" ]]; then + path="$rohd_path/rohd_extension/dart" + fi + printf '%s' "$path" +} + +local_package_path() { + case "$1" in + rohd) printf '%s' "$rohd_path" ;; + rohd_hierarchy) printf '%s' "$rohd_path/packages/rohd_hierarchy" ;; + rohd_waveform) printf '%s' "$rohd_path/packages/rohd_waveform" ;; + rohd_devtools_widgets) widgets_local_path ;; + rohd_source_navigator) navigator_local_path ;; + dart_wellen) printf '%s' "$wave_viewer_path/packages/dart_wellen" ;; + rohd_wave_viewer) printf '%s' "$wave_viewer_path" ;; + rohd_schematic_viewer) printf '%s' "$schematic_viewer_path" ;; + esac +} + +validate_local_package() { + local package="$1" + local path + + path="$(local_package_path "$package")" + if [[ ! -f "$path/pubspec.yaml" ]]; then + echo "Missing local package $package: $path/pubspec.yaml" >&2 + exit 1 + fi +} + +git_package_url() { + case "$1" in + rohd|rohd_hierarchy|rohd_waveform|rohd_devtools_widgets|\ + rohd_source_navigator) + printf '%s' "$rohd_git_url" + ;; + dart_wellen|rohd_wave_viewer) + printf '%s' "$wave_viewer_git_url" + ;; + rohd_schematic_viewer) + printf '%s' "$schematic_viewer_git_url" + ;; + esac +} + +git_package_ref() { + case "$1" in + rohd|rohd_hierarchy|rohd_waveform|rohd_devtools_widgets|\ + rohd_source_navigator) + printf '%s' "$rohd_git_ref" + ;; + dart_wellen|rohd_wave_viewer) + printf '%s' "$wave_viewer_git_ref" + ;; + rohd_schematic_viewer) + printf '%s' "$schematic_viewer_git_ref" + ;; + esac +} + +git_package_path() { + case "$1" in + rohd|rohd_wave_viewer|rohd_schematic_viewer) printf '%s' "" ;; + rohd_hierarchy) printf '%s' "packages/rohd_hierarchy" ;; + rohd_waveform) printf '%s' "packages/rohd_waveform" ;; + rohd_devtools_widgets) printf '%s' "packages/rohd_devtools_widgets" ;; + rohd_source_navigator) printf '%s' "packages/rohd_source_navigator" ;; + dart_wellen) printf '%s' "packages/dart_wellen" ;; + esac +} + +append_dependency_override() { + local package="$1" + local file="${2:-$overrides}" + local source="${sources[$package]}" + local path + + case "$source" in + hosted) return ;; + local) + path="$(local_package_path "$package")" + printf ' %s:\n path: %s\n' "$package" "$path" >>"$file" + ;; + git) + cat >>"$file" <>"$file" + fi + ;; + esac +} + +package_override_block() { + local package="$1" + + awk -v header=" $package:" ' + $0 == header { + found = 1 + next + } + found && /^ [a-zA-Z0-9_]+:/ { + exit + } + found { + print + } + ' "$overrides" +} + +infer_sources_from_overrides() { + local block + local package + local path + + if [[ ! -f "$overrides" ]] || ! grep -qxF "$marker" "$overrides"; then + return + fi + for package in "${packages[@]}"; do + block="$(package_override_block "$package")" + if grep -q '^ git:' <<<"$block"; then + sources["$package"]=git + elif grep -q '^ path:' <<<"$block"; then + sources["$package"]=local + path="$(awk '$1 == "path:" { print $2; exit }' <<<"$block")" + case "$package" in + rohd) rohd_path="$path" ;; + rohd_wave_viewer) wave_viewer_path="$path" ;; + rohd_schematic_viewer) schematic_viewer_path="$path" ;; + esac + fi + done +} + +load_source_state() { + local key + local value + + if [[ ! -f "$source_state" ]]; then + infer_sources_from_overrides + return + fi + while IFS='=' read -r key value; do + case "$key" in + rohd|rohd_hierarchy|rohd_waveform|rohd_devtools_widgets|\ + rohd_source_navigator|dart_wellen|rohd_wave_viewer|\ + rohd_schematic_viewer) + sources["$key"]="$value" + ;; + rohd_git_ref) rohd_git_ref="$value" ;; + rohd_local_path) rohd_path="$value" ;; + wave_viewer_git_ref) wave_viewer_git_ref="$value" ;; + wave_viewer_local_path) wave_viewer_path="$value" ;; + schematic_viewer_git_ref) schematic_viewer_git_ref="$value" ;; + schematic_viewer_local_path) schematic_viewer_path="$value" ;; + esac + done <"$source_state" +} + +write_source_state() { + local package + + : >"$source_state" + for package in "${packages[@]}"; do + printf '%s=%s\n' "$package" "${sources[$package]}" >>"$source_state" + done + cat >>"$source_state" <"$widgets_overrides" <"$overrides" <&2 + echo "Expected rohd, rohd-packages, wave-viewer, schematic-viewer, or all." >&2 + exit 2 + ;; + esac +} + +apply_environment_for_group() { + local group="$1" + local source="$2" + + case "$group" in + rohd|rohd-packages) + if [[ "$source" == "git" ]]; then + rohd_git_ref="${ROHD_GIT_REF:-$rohd_git_ref}" + elif [[ "$source" == "local" ]]; then + rohd_path="${ROHD_LOCAL_PATH:-$rohd_path}" + fi + ;; + wave-viewer) + if [[ "$source" == "git" ]]; then + wave_viewer_git_ref="${WAVE_VIEWER_GIT_REF:-$wave_viewer_git_ref}" + elif [[ "$source" == "local" ]]; then + wave_viewer_path="${WAVE_VIEWER_LOCAL_PATH:-$wave_viewer_path}" + fi + ;; + schematic-viewer) + if [[ "$source" == "git" ]]; then + schematic_viewer_git_ref="${SCHEMATIC_VIEWER_GIT_REF:-$schematic_viewer_git_ref}" + elif [[ "$source" == "local" ]]; then + schematic_viewer_path="${SCHEMATIC_VIEWER_LOCAL_PATH:-$schematic_viewer_path}" + fi + ;; + all) + if [[ "$source" == "git" ]]; then + rohd_git_ref="${ROHD_GIT_REF:-$rohd_git_ref}" + wave_viewer_git_ref="${WAVE_VIEWER_GIT_REF:-$wave_viewer_git_ref}" + schematic_viewer_git_ref="${SCHEMATIC_VIEWER_GIT_REF:-$schematic_viewer_git_ref}" + elif [[ "$source" == "local" ]]; then + rohd_path="${ROHD_LOCAL_PATH:-$rohd_path}" + wave_viewer_path="${WAVE_VIEWER_LOCAL_PATH:-$wave_viewer_path}" + schematic_viewer_path="${SCHEMATIC_VIEWER_LOCAL_PATH:-$schematic_viewer_path}" + fi + ;; + esac +} + +configure_group() { + local group="${1:-}" + local source="${2:-}" + + if [[ "$#" -ne 2 ]]; then + echo "Usage: $0 configure-group " >&2 + exit 2 + fi + load_source_state + set_group_source "$group" "$source" + apply_environment_for_group "$group" "$source" + write_overrides + write_source_state +} + +configure_packages() { + local package + local source + + if [[ "$#" -eq 0 || "$(( $# % 2 ))" -ne 0 ]]; then + echo "Usage: $0 configure ..." >&2 + exit 2 + fi + load_source_state + while [[ "$#" -gt 0 ]]; do + package="$1" + source="$2" + shift 2 + validate_package "$package" + validate_source "$source" + sources["$package"]="$source" + case "$package" in + rohd) apply_environment_for_group rohd "$source" ;; + rohd_hierarchy|rohd_waveform|rohd_devtools_widgets|rohd_source_navigator) + apply_environment_for_group rohd-packages "$source" + ;; + dart_wellen|rohd_wave_viewer) + apply_environment_for_group wave-viewer "$source" + ;; + rohd_schematic_viewer) + apply_environment_for_group schematic-viewer "$source" + ;; + esac + done + write_overrides + write_source_state +} + +show_configuration() { + if [[ -f "$source_state" ]]; then + echo "Dependency sources:" + cat "$source_state" + else + echo "No saved dependency selection; using pubspec.yaml." + fi + if [[ -f "$overrides" ]]; then + echo + echo "$overrides:" + cat "$overrides" + else + echo "No generated override file is present." + fi +} + +case "$mode" in + configure) + shift + configure_packages "$@" + ;; + configure-group) + configure_group "${2:-}" "${3:-}" + ;; + manifest) + rm -f -- "$source_state" + write_overrides + ;; + local-all) + set_group_source all local + apply_environment_for_group all local + write_overrides + write_source_state + ;; + show) + show_configuration + ;; + -h|--help|help|"") + usage + ;; + *) + usage >&2 + exit 2 + ;; +esac diff --git a/rohd_devtools_extension/scripts/devtools_run.sh b/rohd_devtools_extension/scripts/devtools_run.sh new file mode 100644 index 0000000000..eecfa373b9 --- /dev/null +++ b/rohd_devtools_extension/scripts/devtools_run.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname "$0")/.." + +run_mode="${1:-}" + +usage() { + cat <<'USAGE' +Usage: scripts/devtools_run.sh + +Dependency sources are selected separately with scripts/devtools_dev_mode.sh. +This command runs using the currently generated dependency configuration. + +Run modes: + web-debug + web-release + linux-debug + linux-release +USAGE +} + +if [[ -z "$run_mode" ]]; then + usage >&2 + exit 2 +fi + +flutter pub get + +case "$run_mode" in + web-debug) + make web-run + ;; + web-release) + make web/pkg + bash scripts/free_ports.sh + flutter run --release -d web-server --web-port=9099 --web-hostname=127.0.0.1 lib/main_standalone.dart + ;; + linux-debug) + make widget-prepare assets/.staged + flutter run -d linux lib/main_standalone.dart + ;; + linux-release) + make widget-prepare assets/.staged + flutter run --release -d linux lib/main_standalone.dart + ;; + -h|--help|help) + usage + ;; + *) + usage >&2 + exit 2 + ;; +esac \ No newline at end of file diff --git a/rohd_devtools_extension/scripts/ensure_dart_bindings.sh b/rohd_devtools_extension/scripts/ensure_dart_bindings.sh new file mode 100644 index 0000000000..e024ebbb97 --- /dev/null +++ b/rohd_devtools_extension/scripts/ensure_dart_bindings.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# Copyright (C) 2026 Intel Corporation +# SPDX-License-Identifier: BSD-3-Clause +# +# ensure_dart_bindings.sh +# Generates Dart/Rust bridge bindings if they're missing +# Called before any Flutter build to ensure bindings are available +# +# 2026 February +# Author: Desmond Kirkpatrick + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +PACKAGE_CONFIG="$ROOT_DIR/.dart_tool/package_config.json" + +resolve_package_root() { + dart "$ROOT_DIR/scripts/resolve_package_root.dart" "$PACKAGE_CONFIG" "$1" +} + +DART_WELLEN_DIR="$(resolve_package_root dart_wellen)" +BINDINGS_FILE="$DART_WELLEN_DIR/lib/src/rust/frb_generated.dart" + +# Check if bindings already exist +if [ -f "$BINDINGS_FILE" ]; then + echo "[ensure_dart_bindings] Bindings already exist: $BINDINGS_FILE" + exit 0 +fi + +echo "[ensure_dart_bindings] Bindings missing, generating from Rust sources..." +WAVE_VIEWER_DIR="$(resolve_package_root rohd_wave_viewer)" +BUILD_SCRIPT="$WAVE_VIEWER_DIR/scripts/build_dart_wellen_bridge.sh" +if [ ! -f "$BUILD_SCRIPT" ]; then + echo "[ensure_dart_bindings] ERROR: Cannot generate bindings; the resolved " \ + "Wave Viewer package has no build script: $BUILD_SCRIPT" >&2 + exit 1 +fi + +cd "$WAVE_VIEWER_DIR" +bash "$BUILD_SCRIPT" + +if [ -f "$BINDINGS_FILE" ]; then + echo "[ensure_dart_bindings] ✓ Bindings generated successfully" +else + echo "[ensure_dart_bindings] ✗ ERROR: Failed to generate bindings" + exit 1 +fi diff --git a/rohd_devtools_extension/scripts/fix_control_body_newline.py b/rohd_devtools_extension/scripts/fix_control_body_newline.py new file mode 100644 index 0000000000..32ee6e1ae7 --- /dev/null +++ b/rohd_devtools_extension/scripts/fix_control_body_newline.py @@ -0,0 +1,231 @@ +#!/usr/bin/env python3 +"""Auto-fix common Dart lint violations. + +Parses `dart analyze --format machine` output and applies mechanical +fixes for the following lint rules: + + * ALWAYS_PUT_CONTROL_BODY_ON_NEW_LINE — move body to next line + * CURLY_BRACES_IN_FLOW_CONTROL_STRUCTURES — wrap body in { } + * NOOP_PRIMITIVE_OPERATIONS — remove redundant .toString() + * AVOID_TYPES_ON_CLOSURE_PARAMETERS — strip type annotations + +Usage: + python3 scripts/fix_control_body_newline.py [--dry-run] [file ...] + +When file paths are given on the command line, only violations inside +those files are fixed. Otherwise the entire package is scanned. +""" + +import re +import subprocess +import sys +from collections import defaultdict + +SUPPORTED_LINTS = { + "ALWAYS_PUT_CONTROL_BODY_ON_NEW_LINE", + "CURLY_BRACES_IN_FLOW_CONTROL_STRUCTURES", + "NOOP_PRIMITIVE_OPERATIONS", + "AVOID_TYPES_ON_CLOSURE_PARAMETERS", +} + +DRY_RUN = "--dry-run" in sys.argv + + +def run_dart_analyze(target_files=None): + """Run `dart analyze` and collect violations for supported lint rules.""" + cmd = ["dart", "analyze", "--format", "machine"] + if target_files: + cmd.extend(target_files) + result = subprocess.run(cmd, capture_output=True, text=True) + # machine format: SEVERITY|TYPE|LINT_CODE|FILE|LINE|COL|LEN|MESSAGE + violations = defaultdict(list) + for line in result.stderr.splitlines() + result.stdout.splitlines(): + parts = line.split("|") + if len(parts) >= 8 and parts[2] in SUPPORTED_LINTS: + filepath = parts[3] + lineno = int(parts[4]) + col = int(parts[5]) + length = int(parts[6]) + code = parts[2] + violations[filepath].append((lineno, col, length, code)) + return violations + + +# ── Per-rule fixers ────────────────────────────────────────────────── + +def _fix_control_body_newline(lines, idx, col, _length): + """Move inline control body to the next line.""" + rstripped = lines[idx].rstrip("\n").rstrip("\r") + body_start = col - 1 + if body_start <= 0 or body_start >= len(rstripped): + return False + control_part = rstripped[:body_start].rstrip() + body_part = rstripped[body_start:].strip() + if not body_part: + return False + indent = len(rstripped) - len(rstripped.lstrip()) + new_indent = " " * (indent + 2) + lines[idx] = control_part + "\n" + new_indent + body_part + "\n" + return True + + +def _fix_curly_braces(lines, idx, _col, _length): + """Wrap a bare control-flow body in curly braces. + + The analyzer flags the *body* line (not the keyword line). We look + at the previous line for the control keyword, or at the current line + for an inline form like ``if (cond) return foo;``. + """ + _KW = r'if\s*\(.*\)|else\s+if\s*\(.*\)|else|for\s*\(.*\)|while\s*\(.*\)' + + rstripped = lines[idx].rstrip("\n").rstrip("\r") + stripped = rstripped.lstrip() + + # ── Case 1: the flagged line IS the body; keyword is on prev line ── + if idx > 0: + prev = lines[idx - 1].rstrip("\n").rstrip("\r") + m = re.match(rf'^(\s*)({_KW})\s*$', prev) + if m and not stripped.startswith("{"): + indent = m.group(1) + keyword = m.group(2) + body_stripped = stripped + body_indent = " " * (len(indent) + 2) + lines[idx - 1] = f"{indent}{keyword} {{\n" + lines[idx] = f"{body_indent}{body_stripped}\n{indent}}}\n" + return True + + # ── Case 2: inline form on one line ``if (cond) return foo;`` ── + m2 = re.match(rf'^(\s*)({_KW})\s+(.+)$', rstripped) + if m2: + indent = m2.group(1) + keyword = m2.group(2) + body = m2.group(3).strip() + if body.startswith("{"): + return False + body_indent = " " * (len(indent) + 2) + lines[idx] = ( + f"{indent}{keyword} {{\n" + f"{body_indent}{body}\n" + f"{indent}}}\n" + ) + return True + + return False + + +def _fix_noop_primitive(lines, idx, col, length): + """Remove redundant `.toString()` calls flagged by the analyzer.""" + line = lines[idx] + # The analyzer points at the `.toString` portion (col is 1-based). + start = col - 1 + end = start + length + # Match `.toString()` right at the flagged position. + snippet = line[start:] + if snippet.startswith("toString"): + # Walk backwards to find the dot. + dot_pos = start - 1 + if dot_pos >= 0 and line[dot_pos] == ".": + # Find the closing paren. + paren_end = start + len("toString") + rest = line[paren_end:] + if rest.startswith("()"): + # Remove `.toString()` + before = line[:dot_pos] + after = line[paren_end + 2 :] + lines[idx] = before + after + return True + return False + + +def _fix_avoid_types_on_closure(lines, idx, col, length): + """Remove type annotations from closure parameters. + + The analyzer flags the type keyword at (line, col, length). + We remove the type and the trailing space(s). + """ + line = lines[idx] + start = col - 1 + end = start + length + # Remove the type annotation and any trailing whitespace. + before = line[:start] + after = line[end:].lstrip(" ") + lines[idx] = before + after + return True + + +FIXERS = { + "ALWAYS_PUT_CONTROL_BODY_ON_NEW_LINE": _fix_control_body_newline, + "CURLY_BRACES_IN_FLOW_CONTROL_STRUCTURES": _fix_curly_braces, + "NOOP_PRIMITIVE_OPERATIONS": _fix_noop_primitive, + "AVOID_TYPES_ON_CLOSURE_PARAMETERS": _fix_avoid_types_on_closure, +} + + +# ── Main logic ─────────────────────────────────────────────────────── + +def fix_file(filepath, line_infos): + """Fix all violations in a single file. + + Works bottom-up (highest line numbers first) so earlier edits + don't shift line numbers for later edits. + """ + with open(filepath, "r") as f: + lines = f.readlines() + + # Sort by line number descending so inserts don't shift indices. + line_infos.sort(key=lambda x: x[0], reverse=True) + + fixed = 0 + for lineno, col, length, code in line_infos: + idx = lineno - 1 # 0-based + if idx < 0 or idx >= len(lines): + continue + fixer = FIXERS.get(code) + if fixer and fixer(lines, idx, col, length): + fixed += 1 + + if fixed > 0: + if DRY_RUN: + print(f" [dry-run] Would fix {fixed} violation(s) in {filepath}") + else: + with open(filepath, "w") as f: + f.writelines(lines) + print(f" Fixed {fixed} violation(s) in {filepath}") + return fixed + + +def main(): + if DRY_RUN: + print("=== DRY RUN (no files will be modified) ===\n") + + # Collect explicit file paths (skip flags). + target_files = [a for a in sys.argv[1:] if not a.startswith("--")] + + print("Running dart analyze...") + violations = run_dart_analyze(target_files or None) + + if not violations: + print("No supported lint violations found.") + return + + total_violations = sum(len(v) for v in violations.values()) + print(f"Found {total_violations} violation(s) in {len(violations)} file(s).\n") + + total_fixed = 0 + for filepath, line_infos in sorted(violations.items()): + total_fixed += fix_file(filepath, line_infos) + + print(f"\n{'Would fix' if DRY_RUN else 'Fixed'} {total_fixed} total violation(s).") + + if not DRY_RUN and total_fixed > 0: + print("\nRe-running dart analyze to verify...") + violations2 = run_dart_analyze(target_files or None) + remaining = sum(len(v) for v in violations2.values()) + if remaining == 0: + print("All supported lint violations resolved!") + else: + print(f"{remaining} violation(s) remain — may need manual review.") + + +if __name__ == "__main__": + main() diff --git a/rohd_devtools_extension/scripts/fix_directives.py b/rohd_devtools_extension/scripts/fix_directives.py new file mode 100644 index 0000000000..766b1b7b8b --- /dev/null +++ b/rohd_devtools_extension/scripts/fix_directives.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +"""Fix directive ordering in Dart files.""" + +import re +import subprocess +import sys +from collections import defaultdict +from pathlib import Path + +def get_dart_files(): + """Get all Dart files in the lib and test dirs.""" + result = subprocess.run( + ["find", ".", "-name", "*.dart", "-type", "f"], + capture_output=True, text=True, cwd="." + ) + return [f for f in result.stdout.strip().split('\n') if f and not 'build' in f] + +def parse_directives(content): + """Parse import/export directives and return (directives, rest_of_code).""" + lines = content.split('\n') + directives = [] + other_lines = [] + in_directives = True + + for line in lines: + if in_directives: + # Check if line is a directive + if re.match(r'^\s*(import|export|library|part)\s', line): + directives.append(line) + elif line.strip() == '' or line.strip().startswith('//'): + # Skip empty lines and comments at the top + if other_lines or not directives: + other_lines.append(line) + else: + in_directives = False + other_lines.append(line) + else: + other_lines.append(line) + + return directives, other_lines + +def sort_directives(directives): + """Sort directives: dart: first, then package:, then relative.""" + dart_imports = [] + package_imports = [] + relative_imports = [] + + for d in directives: + if "import 'dart:" in d or 'import "dart:' in d: + dart_imports.append(d) + elif "import 'package:" in d or 'import "package:' in d: + package_imports.append(d) + elif "export 'dart:" in d or 'export "dart:' in d: + dart_imports.append(d) + elif "export 'package:" in d or 'export "package:' in d: + package_imports.append(d) + else: + relative_imports.append(d) + + # Sort each section alphabetically + dart_imports.sort() + package_imports.sort() + relative_imports.sort() + + return dart_imports + package_imports + relative_imports + +def fix_file(filepath): + """Fix directive ordering in a single file.""" + try: + with open(filepath, 'r') as f: + content = f.read() + except: + return False + + directives, other_lines = parse_directives(content) + if not directives: + return False + + sorted_dirs = sort_directives(directives) + if sorted_dirs == directives: + return False + + new_content = '\n'.join(sorted_dirs) + '\n' + '\n'.join(other_lines) + + with open(filepath, 'w') as f: + f.write(new_content) + + return True + +def main(): + files = get_dart_files() + fixed_count = 0 + + for filepath in files: + if fix_file(filepath): + fixed_count += 1 + print(f" Fixed {filepath}") + + print(f"\nFixed {fixed_count} file(s)") + +if __name__ == '__main__': + main() diff --git a/rohd_devtools_extension/scripts/fix_types.py b/rohd_devtools_extension/scripts/fix_types.py new file mode 100644 index 0000000000..d9dd130d4f --- /dev/null +++ b/rohd_devtools_extension/scripts/fix_types.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +"""Remove obvious local variable type annotations in Dart files.""" + +import re +import subprocess +from pathlib import Path + +def get_dart_files(): + """Get all Dart files.""" + result = subprocess.run( + ["find", "lib", "test", "-name", "*.dart", "-type", "f"], + capture_output=True, text=True, cwd="." + ) + return [f for f in result.stdout.strip().split('\n') if f] + +def remove_obvious_types(content): + """Remove type annotations from local variables where type is obvious from RHS.""" + # Pattern: final Type varName = ...; or var Type varName = ...; + # Common obvious patterns: + # - final String x = "..."; → final x = "..."; + # - final int x = 123; → final x = 123; + # - final bool x = true; → final x = true; + # - final List x = [...]; → final x = [...]; + # - final Map x = {...}; → final x = {...}; + # - final SomeClass x = SomeClass(...); → final x = SomeClass(...); + + # Patterns to match obvious assignments + patterns = [ + # String literal + (r'\bfinal\s+String\s+(\w+)\s*=\s*["\']', r'final \1 = "'), + # Boolean + (r'\bfinal\s+bool\s+(\w+)\s*=\s*(true|false)', r'final \1 = \2'), + # Integer + (r'\bfinal\s+int\s+(\w+)\s*=\s*(-?\d+)', r'final \1 = \2'), + # Double + (r'\bfinal\s+double\s+(\w+)\s*=\s*(-?\d+\.\d+)', r'final \1 = \2'), + # List literal + (r'\bfinal\s+List<[^>]+>\s+(\w+)\s*=\s*\[', r'final \1 = ['), + # Map literal + (r'\bfinal\s+Map<[^>]+>\s+(\w+)\s*=\s*\{', r'final \1 = {'), + # Method call on obvious type + (r'\bvar\s+(\w+)\s*=\s*(\w+)\.(\w+)\(', r'var \1 = \2.\3('), + ] + + modified = content + for pattern, replacement in patterns: + modified = re.sub(pattern, replacement, modified) + + return modified + +def fix_file(filepath): + """Fix obvious type annotations in a single file.""" + try: + with open(filepath, 'r') as f: + content = f.read() + except: + return False + + new_content = remove_obvious_types(content) + if new_content == content: + return False + + with open(filepath, 'w') as f: + f.write(new_content) + return True + +def main(): + files = get_dart_files() + fixed_count = 0 + + for filepath in files: + if fix_file(filepath): + fixed_count += 1 + print(f" {filepath}") + + print(f"\nFixed {fixed_count} file(s)") + +if __name__ == '__main__': + main() diff --git a/rohd_devtools_extension/scripts/free_ports.sh b/rohd_devtools_extension/scripts/free_ports.sh new file mode 100755 index 0000000000..00d67ade99 --- /dev/null +++ b/rohd_devtools_extension/scripts/free_ports.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# Free the three dev-server ports used by this workspace. +# 9099 — DevTools (standalone web) +# 9199 — Schematic viewer +# 9299 — Wave viewer +# +# Handles both LISTEN and TIME_WAIT states, plus stale flutter processes. + +set -euo pipefail + +PORTS=(9099 9199 9299) +LABELS=("DevTools" "Schematics" "Waves") + +# Kill any stale flutter/dart processes +echo "Cleaning up stale Flutter/Dart processes..." +pkill -f "flutter run" 2>/dev/null || true +pkill -f "dart.*--web-port" 2>/dev/null || true +sleep 0.5 + +for i in "${!PORTS[@]}"; do + port="${PORTS[$i]}" + label="${LABELS[$i]}" + + # Try to kill any active process on the port + if fuser "${port}/tcp" >/dev/null 2>&1; then + fuser -k "${port}/tcp" >/dev/null 2>&1 + echo "Killed process on port ${port} (${label})" + sleep 0.5 + fi + + # Check for TIME_WAIT sockets and try to force close + if ss -tlnp 2>/dev/null | grep -q ":${port}"; then + echo "Port ${port} (${label}) still in use, forcing timeout..." + # This requires root, so we suppress errors + sleep 1 + else + echo "Port ${port} (${label}) is free" + fi +done diff --git a/rohd_devtools_extension/scripts/prepare_web_assets.sh b/rohd_devtools_extension/scripts/prepare_web_assets.sh new file mode 100755 index 0000000000..dcda1e24c4 --- /dev/null +++ b/rohd_devtools_extension/scripts/prepare_web_assets.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# Prepare the standalone web asset fallback from the canonical staged assets. +# ELK is always copied with its notice and complete EPL-2.0 license text. + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +SOURCE_ASSETS="$PROJECT_ROOT/assets" +WEB_ASSETS="$PROJECT_ROOT/web/assets" + +"$PROJECT_ROOT/scripts/stage_assets.sh" + +# Remove obsolete locations that could contain a second ELK copy. +rm -rf "$WEB_ASSETS/js" +rm -f "$WEB_ASSETS/elk_layout_only.js" + +mkdir -p "$WEB_ASSETS/third_party" + +echo "Copying the ELK distribution with notice and EPL-2.0 text..." +rm -rf "$WEB_ASSETS/third_party/elkjs" "$WEB_ASSETS/layout_bridge" +cp -a "$SOURCE_ASSETS/third_party/elkjs" "$WEB_ASSETS/third_party/" +cp -a "$SOURCE_ASSETS/layout_bridge" "$WEB_ASSETS/" + +echo "Web ELK assets prepared successfully" diff --git a/rohd_devtools_extension/scripts/resolve_package_root.dart b/rohd_devtools_extension/scripts/resolve_package_root.dart new file mode 100644 index 0000000000..bfdfe5c210 --- /dev/null +++ b/rohd_devtools_extension/scripts/resolve_package_root.dart @@ -0,0 +1,67 @@ +import 'dart:convert'; +import 'dart:io'; + +Never fail(String message) { + stderr.writeln('error: $message'); + exit(2); +} + +void main(List arguments) { + if (arguments.length != 2) { + fail( + 'Usage: dart scripts/resolve_package_root.dart ' + ' ', + ); + } + + final packageConfig = File(arguments[0]); + if (!packageConfig.existsSync()) { + fail( + 'Package configuration does not exist: ${packageConfig.path}. ' + 'Run flutter pub get first.', + ); + } + + final dynamic decodedConfig; + try { + decodedConfig = jsonDecode(packageConfig.readAsStringSync()); + } on FormatException catch (error) { + fail('Invalid package configuration ${packageConfig.path}: $error'); + } + + if (decodedConfig is! Map) { + fail('Invalid package configuration ${packageConfig.path}.'); + } + + final packages = decodedConfig['packages']; + if (packages is! List) { + fail('Package configuration ${packageConfig.path} has no package list.'); + } + + final packageName = arguments[1]; + for (final package in packages) { + if (package is! Map || package['name'] != packageName) { + continue; + } + + final rootUriText = package['rootUri']; + if (rootUriText is! String) { + fail('Package $packageName has no root URI.'); + } + + final rootUri = packageConfig.parent.uri.resolve(rootUriText); + if (rootUri.scheme != 'file') { + fail('Package $packageName has a non-file root URI: $rootUri.'); + } + + final packageRoot = Directory.fromUri(rootUri); + if (!packageRoot.existsSync()) { + fail('Package $packageName does not exist at ${packageRoot.path}.'); + } + + stdout.writeln(packageRoot.path); + return; + } + + fail('Package $packageName is not in ${packageConfig.path}.'); +} diff --git a/rohd_devtools_extension/scripts/stage_assets.sh b/rohd_devtools_extension/scripts/stage_assets.sh new file mode 100755 index 0000000000..243169a6a9 --- /dev/null +++ b/rohd_devtools_extension/scripts/stage_assets.sh @@ -0,0 +1,104 @@ +#!/usr/bin/env bash +# Generic widget asset aggregator for ROHD Debugger +# Each widget can stage its own assets to build/assets/, this script aggregates them. +# This keeps the top-level Makefile completely generic and widget-agnostic. +# +# Backward compatibility: also checks widget source directories if build/assets/ not found. + +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +PACKAGE_CONFIG="$ROOT/.dart_tool/package_config.json" +ASSETS_DEST="${ROOT}/assets" + +resolve_package_root() { + dart "$ROOT/scripts/resolve_package_root.dart" "$PACKAGE_CONFIG" "$1" +} + +SCHEMATIC_VIEWER="$(resolve_package_root rohd_schematic_viewer)" +WAVE_VIEWER="$(resolve_package_root rohd_wave_viewer)" + +echo "Aggregating staged assets from all widgets..." +mkdir -p "$ASSETS_DEST" + +# The schematic viewer owns the ELK distribution. Stage its bundle, license +# notice, and browser invocation adapter together for embedded DevTools builds. +if [ -f "$SCHEMATIC_VIEWER/assets/js/elk.bundled.js" ] && \ + [ -f "$SCHEMATIC_VIEWER/assets/licenses/elkjs_LICENSES.txt" ] && \ + [ -f "$SCHEMATIC_VIEWER/js_bridge/elk_layout_only.js" ]; then + echo " Staging self-contained ELK distribution from rohd-schematic-viewer..." + rm -rf "$ASSETS_DEST/third_party/elkjs" "$ASSETS_DEST/layout_bridge" + mkdir -p "$ASSETS_DEST/third_party/elkjs/LICENSES" "$ASSETS_DEST/layout_bridge" + cp "$SCHEMATIC_VIEWER/assets/js/elk.bundled.js" \ + "$ASSETS_DEST/third_party/elkjs/" + cp "$SCHEMATIC_VIEWER/assets/licenses/elkjs_LICENSES.txt" \ + "$ASSETS_DEST/third_party/elkjs/LICENSES/" + cp "$SCHEMATIC_VIEWER/js_bridge/elk_layout_only.js" \ + "$ASSETS_DEST/layout_bridge/" + rm -rf "$ASSETS_DEST/js" + rm -f "$ASSETS_DEST/elk_layout_only.js" +elif [ -d "$SCHEMATIC_VIEWER" ]; then + echo " Warning: rohd-schematic-viewer ELK distribution is incomplete; skipping ELK staging." +fi + +# Iterate through all resolved widget packages and collect their staged assets. +for widget in rohd_schematic_viewer rohd_wave_viewer; do + case "$widget" in + rohd_schematic_viewer) widget_dir="$SCHEMATIC_VIEWER" ;; + rohd_wave_viewer) widget_dir="$WAVE_VIEWER" ;; + esac + + widget_built_assets="$widget_dir/build/assets" + + # Check for properly-staged widget assets first + if [ -d "$widget_built_assets" ]; then + echo " Collecting assets from $widget/build/assets/..." + cp -r "$widget_built_assets"/* "$ASSETS_DEST/" 2>/dev/null || true + else + # Backward compatibility: check for common widget asset source locations + echo " Checking $widget for source assets..." + + # Check for js_bridge directory (e.g., rohd-schematic-viewer/js_bridge/) + if [ "$widget" != "rohd_schematic_viewer" ] && [ -d "$widget_dir/js_bridge" ]; then + echo " Found js_bridge, copying..." + mkdir -p "$ASSETS_DEST/js" + cp -r "$widget_dir/js_bridge/"* "$ASSETS_DEST/js/" 2>/dev/null || true + # Also copy root-level js bridge files + cp -r "$widget_dir/js_bridge/"*.js "$ASSETS_DEST/" 2>/dev/null || true + fi + + # Check for assets directory + if [ -d "$widget_dir/assets" ]; then + echo " Found assets, copying..." + if [ "$widget" != "rohd_schematic_viewer" ]; then + mkdir -p "$ASSETS_DEST/js" + [ -d "$widget_dir/assets/js" ] && cp -r "$widget_dir/assets/js/"* "$ASSETS_DEST/js/" 2>/dev/null || true + fi + # Copy root-level asset files + find "$widget_dir/assets" -maxdepth 1 -type f -exec cp {} "$ASSETS_DEST/" \; 2>/dev/null || true + fi + fi +done + +echo "Assets aggregated to: $ASSETS_DEST/" +echo "Flutter will bundle from assets/ into:" +echo " - build/web/assets/ (for web builds)" +echo " - build/linux/assets/ (for Linux native builds)" + +# Ensure WASM pkg files exist in web/ for dev server (flutter run -d web-server). +# The wellen_bridge WASM is built in rohd-wave-viewer/web/pkg/ and needs to be +# copied into the host app's web/ directory for the + + + + + - \ No newline at end of file + diff --git a/test/waveform_service_test.dart b/test/waveform_service_test.dart index 90b46420c8..d5bc090fe2 100644 --- a/test/waveform_service_test.dart +++ b/test/waveform_service_test.dart @@ -129,7 +129,6 @@ void createTemporaryDump(Module module, String name) { module, outputDirectory: tempDumpDir, outputBaseName: 'temp_dump_$name', - writeToFile: true, ); } @@ -146,26 +145,6 @@ void main() { WaveformDataService.instance.clear(); }); - test('file-backed debugging capture can retain history', () async { - final mod = _SimpleWaveModule(Logic()); - await mod.build(); - - final service = WaveformService( - mod, - outputDirectory: tempDumpDir, - outputBaseName: 'temp_dump_debugDump', - writeToFile: true, - retainInMemory: true, - ); - - expect(service.retainInMemory, isTrue); - expect(service.canSendWaveforms(), isTrue); - expect(service.inMemoryOutput, isNotNull); - - await Simulator.run(); - deleteTemporaryDump('debugDump'); - }); - test('registers with ModuleServices by default', () async { final a = Logic(name: 'a'); final mod = _SimpleWaveModule(a); @@ -184,49 +163,13 @@ void main() { File(dumpPath).deleteSync(); }); - test('window-entry snapshot reaches waveform hooks', () async { - final mod = _WindowWaveModule(); + test('does not enable DevTools streaming by default', () async { + final mod = _SimpleWaveModule(Logic(name: 'a')); await mod.build(); - mod.a.put(0); - final service = - _HistoryWaveformService(mod, startTime: 10, register: false); - - Simulator.registerAction(5, () => mod.a.put(1)); - Simulator.registerAction(15, () {}); - Simulator.registerAction(20, () {}); - await Simulator.run(); + final service = WaveformService(mod, register: false); - final vcdContents = utf8.decode( - await service.artifacts.single - .openRead() - .expand((bytes) => bytes) - .toList(), - ); - expect( - VcdParser.confirmValue(vcdContents, 'a', 10, LogicValue.one), - isTrue, - ); - expect(service.history[mod.a], equals([(0, '0'), (10, '1')])); - expect(service.capturedTimestamps, contains(10)); - }); - - test('window entry and boundary change are separate hook batches', () async { - final mod = _WindowWaveModule(); - await mod.build(); - mod.a.put(0); - final service = - _HistoryWaveformService(mod, startTime: 10, register: false); - - Simulator.registerAction(5, () => mod.a.put(1)); - Simulator.registerAction(10, () => mod.a.put(0)); - await Simulator.run(); - - expect( - service.history[mod.a], - equals([(0, '0'), (10, '1'), (10, '0')]), - ); - expect(service.capturedTimestamps, equals([10, 10])); + expect(service.enableDevToolsStreaming, isFalse); }); test('window-entry FST values agree live, finalized, and in fst2vcd', @@ -301,13 +244,12 @@ void main() { Directory(_tempDumpDir).createSync(recursive: true); final dumpPath = _temporaryVcdPath('serviceCapture'); - final service = WaveformService.fromOutputPath( + WaveformService.fromOutputPath( mod, outputPath: dumpPath, register: false, enableDevToolsStreaming: true, ); - expect(service.outputFilePath, dumpPath); a.inject(1); Simulator.registerAction(10, () => a.put(0)); @@ -315,11 +257,13 @@ void main() { final vcdContents = File(dumpPath).readAsStringSync(); expect( - VcdParser.confirmValue(vcdContents, 'a', 0, LogicValue.ofString('1')), - equals(true)); + VcdParser.confirmValue(vcdContents, 'a', 0, LogicValue.ofString('1')), + equals(true), + ); expect( - VcdParser.confirmValue(vcdContents, 'a', 10, LogicValue.ofString('0')), - equals(true)); + VcdParser.confirmValue(vcdContents, 'a', 10, LogicValue.ofString('0')), + equals(true), + ); File(dumpPath).deleteSync(); }); @@ -607,6 +551,7 @@ void main() { expect(dataService.isFstBacked, isTrue); expect(signalData['signalId'], equals(signalId)); expect(signalData['data'], isNotEmpty); + File(dumpPath).deleteSync(); }); @@ -621,8 +566,11 @@ void main() { ModuleServices.instance.reset(); await _dumpParityWaveform(fstPath, WaveOutputFormat.fst); - final fstEvents = _readFstEvents(fstPath, - signalNames: const ['a', 'b'], signalWidths: const [4, 4]); + final fstEvents = _readFstEvents( + fstPath, + signalNames: const ['a', 'b'], + signalWidths: const [4, 4], + ); expect(fstEvents, equals(vcdEvents)); @@ -654,7 +602,9 @@ Future _captureWaveformWithTimescale( } Future _dumpParityWaveform( - String outputPath, WaveOutputFormat format) async { + String outputPath, + WaveOutputFormat format, +) async { Directory(_tempDumpDir).createSync(recursive: true); final a = Logic(name: 'a', width: 4); @@ -662,8 +612,12 @@ Future _dumpParityWaveform( await mod.build(); a.put(0x1); - WaveformService.fromOutputPath(mod, - outputPath: outputPath, format: format, register: false); + WaveformService.fromOutputPath( + mod, + outputPath: outputPath, + format: format, + register: false, + ); Simulator.registerAction(10, () => a.put(0x2)); Simulator.registerAction(20, () => a.put(0xf)); @@ -671,16 +625,19 @@ Future _dumpParityWaveform( } Map> _readVcdEvents( - String path, Set signalNames) { + String path, + Set signalNames, +) { final lines = File(path).readAsLinesSync(); final markerToSignal = {}; final markerToWidth = {}; final events = >{ - for (final name in signalNames) name: {} + for (final name in signalNames) name: {}, }; final sigNameRegexp = RegExp( - r'\s*\$var\s(wire|reg)\s(\d+)\s(\S*)\s(\S*)\s+(\[\d+\:\d+\])?\s*\$end'); + r'\s*\$var\s(wire|reg)\s(\d+)\s(\S*)\s(\S*)\s+(\[\d+\:\d+\])?\s*\$end', + ); var currentTime = 0; var inValues = false; @@ -727,7 +684,9 @@ Map> _readVcdEvents( } ({String marker, String value})? _parseVcdValueUpdate( - String line, Map markerToWidth) { + String line, + Map markerToWidth, +) { if (line.startsWith('b')) { final parts = line.split(' '); if (parts.length != 2 || !markerToWidth.containsKey(parts[1])) { @@ -744,11 +703,14 @@ Map> _readVcdEvents( return null; } -Map> _readFstEvents(String path, - {required List signalNames, required List signalWidths}) { +Map> _readFstEvents( + String path, { + required List signalNames, + required List signalWidths, +}) { final data = File(path).readAsBytesSync(); final events = >{ - for (final name in signalNames) name: {} + for (final name in signalNames) name: {}, }; var blockOffset = 0; @@ -758,8 +720,14 @@ Map> _readFstEvents(String path, final blockEnd = blockOffset + 1 + sectionLength; if (blockType == 8) { - _readFstVcDataBlock(data, blockOffset, blockEnd, - signalNames: signalNames, signalWidths: signalWidths, events: events); + _readFstVcDataBlock( + data, + blockOffset, + blockEnd, + signalNames: signalNames, + signalWidths: signalWidths, + events: events, + ); } blockOffset = blockEnd; @@ -768,10 +736,14 @@ Map> _readFstEvents(String path, return events; } -void _readFstVcDataBlock(Uint8List data, int blockOffset, int blockEnd, - {required List signalNames, - required List signalWidths, - required Map> events}) { +void _readFstVcDataBlock( + Uint8List data, + int blockOffset, + int blockEnd, { + required List signalNames, + required List signalWidths, + required Map> events, +}) { final startTime = _readU64(data, blockOffset + 9); var offset = blockOffset + 33; @@ -783,15 +755,17 @@ void _readFstVcDataBlock(Uint8List data, int blockOffset, int blockEnd, offset = maxHandle.next; final frameBytes = _inflateIfNeeded( - data.sublist(offset, offset + frameCompressed.value), - frameUncompressed.value); + data.sublist(offset, offset + frameCompressed.value), + frameUncompressed.value, + ); offset += frameCompressed.value; var frameOffset = 0; for (var i = 0; i < signalNames.length; i++) { final width = signalWidths[i]; final value = String.fromCharCodes( - frameBytes.sublist(frameOffset, frameOffset + width)); + frameBytes.sublist(frameOffset, frameOffset + width), + ); frameOffset += width; events[signalNames[i]]![startTime] = value; } @@ -806,14 +780,17 @@ void _readFstVcDataBlock(Uint8List data, int blockOffset, int blockEnd, final timeUncompressedLength = _readU64(data, blockEnd - 24); final timeDataStart = blockEnd - 24 - timeCompressedLength; final timeBytes = _inflateIfNeeded( - data.sublist(timeDataStart, timeDataStart + timeCompressedLength), - timeUncompressedLength); + data.sublist(timeDataStart, timeDataStart + timeCompressedLength), + timeUncompressedLength, + ); final timeTable = _decodeTimeTable(timeBytes, timeCount); final chainLength = _readU64(data, timeDataStart - 8); final chainStart = timeDataStart - 8 - chainLength; final signalOffsets = _decodeFstOffsetChain( - data.sublist(chainStart, timeDataStart - 8), valueMaxHandle.value); + data.sublist(chainStart, timeDataStart - 8), + valueMaxHandle.value, + ); for (var signalIndex = 0; signalIndex < signalNames.length; signalIndex++) { final signalOffset = signalOffsets[signalIndex]; @@ -829,11 +806,13 @@ void _readFstVcDataBlock(Uint8List data, int blockOffset, int blockEnd, final signalDataStart = valueSectionStart + signalOffset; final signalDataEnd = nextOffset == null ? chainStart : valueSectionStart + nextOffset; - _decodeFstSignalData(data.sublist(signalDataStart, signalDataEnd), - width: signalWidths[signalIndex], - signalName: signalNames[signalIndex], - timeTable: timeTable, - events: events); + _decodeFstSignalData( + data.sublist(signalDataStart, signalDataEnd), + width: signalWidths[signalIndex], + signalName: signalNames[signalIndex], + timeTable: timeTable, + events: events, + ); } } @@ -871,16 +850,21 @@ List _decodeFstOffsetChain(Uint8List bytes, int maxHandle) { return offsets; } -void _decodeFstSignalData(Uint8List bytes, - {required int width, - required String signalName, - required List timeTable, - required Map> events}) { +void _decodeFstSignalData( + Uint8List bytes, { + required int width, + required String signalName, + required List timeTable, + required Map> events, +}) { var offset = 0; final compression = _readVarint(bytes, offset); offset = compression.next; - expect(compression.value, equals(0), - reason: 'Only uncompressed signal chains are expected'); + expect( + compression.value, + equals(0), + reason: 'Only uncompressed signal chains are expected', + ); var timeIndex = 0; while (offset < bytes.length) { From c8a37da969526eaa997557e2f2556316c58ed937 Mon Sep 17 00:00:00 2001 From: "Desmond A. Kirkpatrick" Date: Mon, 12 Oct 2026 21:35:43 -0700 Subject: [PATCH 02/26] rebased --- .gitignore | 1 + CHANGELOG.md | 7 +++++++ lib/src/utilities/config.dart | 2 +- packages/rohd_devtools_widgets/CHANGELOG.md | 12 ++++++++++++ packages/rohd_devtools_widgets/README.md | 2 +- packages/rohd_devtools_widgets/pubspec.yaml | 4 ++-- packages/rohd_hierarchy/CHANGELOG.md | 2 ++ packages/rohd_waveform/CHANGELOG.md | 5 +++++ packages/rohd_waveform/pubspec.yaml | 2 +- pubspec.yaml | 2 +- rohd_devtools_extension/.gitignore | 6 ++++++ rohd_devtools_extension/CHANGELOG.md | 8 ++++++++ rohd_extension/README.md | 18 +++++++++--------- rohd_extension/package.json | 2 +- 14 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 rohd_devtools_extension/CHANGELOG.md diff --git a/.gitignore b/.gitignore index ec2bdb4bd4..89e0790b15 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ coverage/ *_fsm.md .vscode/* ./devtools_options.yaml +/packages/rohd_devtools_widgets/pubspec_overrides.yaml # Exceptions !.vscode/extensions.json diff --git a/CHANGELOG.md b/CHANGELOG.md index b8b646b5a9..7cbdbd6854 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,13 @@ - Released `rohd_hierarchy` 0.2.0 with the hierarchy query and netlist adapter APIs. +- Added FST waveform writing, block reading, and query APIs. + +- Added SystemC generation, runtime, and module-service support. + +- Added source tracing, FLC output, hierarchy navigation, and the ROHD design + shell integration. + ## 0.6.11 - Added `NetlistSynthesizer` for generating JSON netlists, with configurable synthesis passes, validation, and hierarchy support (). diff --git a/lib/src/utilities/config.dart b/lib/src/utilities/config.dart index a3b930b389..b81da28fa1 100644 --- a/lib/src/utilities/config.dart +++ b/lib/src/utilities/config.dart @@ -10,5 +10,5 @@ /// A utility for ROHD configuration file. class Config { /// The version of the ROHD framework. - static const String version = '0.6.11'; + static const String version = '0.6.12'; } diff --git a/packages/rohd_devtools_widgets/CHANGELOG.md b/packages/rohd_devtools_widgets/CHANGELOG.md index bd08414264..94b3422fe3 100644 --- a/packages/rohd_devtools_widgets/CHANGELOG.md +++ b/packages/rohd_devtools_widgets/CHANGELOG.md @@ -1,3 +1,15 @@ +## 0.2.0 + +- Add shared signal display-format menus and regex utilities, and update + shared controls for hierarchy-driven signal formatting. + +## 0.1.1 + +- Fix the ROHD dependency lower bound: require `^0.6.10` instead of `^0.6.9`, + since signal formatting uses `toRadixString`'s `includeWidth` and `sepChar` + parameters introduced in ROHD 0.6.10 + (). + ## 0.1.0 - Initial release of shared ROHD DevTools widgets. diff --git a/packages/rohd_devtools_widgets/README.md b/packages/rohd_devtools_widgets/README.md index 12266400e1..f44e1006d8 100644 --- a/packages/rohd_devtools_widgets/README.md +++ b/packages/rohd_devtools_widgets/README.md @@ -73,7 +73,7 @@ across DevTools packages. Add the package to your Flutter application: ```shell -flutter pub add rohd_devtools_widgets:^0.1.0 +flutter pub add rohd_devtools_widgets:^0.2.0 ``` Import the shared widgets you need: diff --git a/packages/rohd_devtools_widgets/pubspec.yaml b/packages/rohd_devtools_widgets/pubspec.yaml index c5216f8c42..67534e883e 100644 --- a/packages/rohd_devtools_widgets/pubspec.yaml +++ b/packages/rohd_devtools_widgets/pubspec.yaml @@ -1,6 +1,6 @@ name: rohd_devtools_widgets description: "Shared Flutter widgets and utilities for ROHD debug tools, including cross-probing, signal formatting, help, and PNG export." -version: 0.1.0 +version: 0.2.0 homepage: https://intel.github.io/rohd-website/ repository: https://github.com/intel/rohd/tree/main/packages/rohd_devtools_widgets issue_tracker: https://github.com/intel/rohd/issues @@ -11,7 +11,7 @@ dependencies: flutter: {sdk: flutter} # Keep the modern Material compatibility layer below its Dart 3.6-incompatible release. material_ui: ">=1.1.0 <1.3.0" - rohd: ^0.6.9 + rohd: ^0.6.10 rohd_hierarchy: ^0.2.0 web: ^1.0.0 dev_dependencies: diff --git a/packages/rohd_hierarchy/CHANGELOG.md b/packages/rohd_hierarchy/CHANGELOG.md index f9f4dcac9f..b29274fbcf 100644 --- a/packages/rohd_hierarchy/CHANGELOG.md +++ b/packages/rohd_hierarchy/CHANGELOG.md @@ -2,6 +2,8 @@ - Add source-agnostic hierarchy models, addressing, adapters, and search utilities. +- Add legacy DevTools JSON adapters and case-insensitive port-direction + accessors for hierarchy occurrences. ## 0.1.0 diff --git a/packages/rohd_waveform/CHANGELOG.md b/packages/rohd_waveform/CHANGELOG.md index af2a17b8f3..533d2d6c32 100644 --- a/packages/rohd_waveform/CHANGELOG.md +++ b/packages/rohd_waveform/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.2.0 + +- Add monitored waveform-row metadata, display-format preferences, occurrence + matching, and value/edge search APIs. + ## 0.1.0 - Initial release of waveform data models, service APIs, repositories, and signal data helpers. diff --git a/packages/rohd_waveform/pubspec.yaml b/packages/rohd_waveform/pubspec.yaml index 75a1e6beba..00c4ba9c0a 100644 --- a/packages/rohd_waveform/pubspec.yaml +++ b/packages/rohd_waveform/pubspec.yaml @@ -3,7 +3,7 @@ description: "Waveform data models and APIs for wave viewers - ModuleStructure, publish_to: none homepage: https://intel.github.io/rohd-website/ repository: https://github.com/intel/rohd/tree/main/packages/rohd_waveform -version: 0.1.0 +version: 0.2.0 issue_tracker: https://github.com/intel/rohd/issues environment: diff --git a/pubspec.yaml b/pubspec.yaml index 163e3f94d7..018ec38246 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: rohd -version: 0.6.11 +version: 0.6.12 description: The Rapid Open Hardware Development (ROHD) framework, a framework for describing and verifying hardware. homepage: https://intel.github.io/rohd-website repository: https://github.com/intel/rohd diff --git a/rohd_devtools_extension/.gitignore b/rohd_devtools_extension/.gitignore index 5d633917d6..48a2757500 100644 --- a/rohd_devtools_extension/.gitignore +++ b/rohd_devtools_extension/.gitignore @@ -31,6 +31,12 @@ migrate_working_dir/ .pub/ /build/ .devtools_dependency_sources +pubspec_overrides.yaml + +# Generated gate catalog +/assets/gate_catalog.rohd.json +/assets/rohd_schematic.json +/assets/.staged # Symbolication related app.*.symbols diff --git a/rohd_devtools_extension/CHANGELOG.md b/rohd_devtools_extension/CHANGELOG.md new file mode 100644 index 0000000000..bc17777405 --- /dev/null +++ b/rohd_devtools_extension/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + +All notable changes to ROHD Debugger will be documented in this file. + +## 1.0.0+1 + +- Initial development release of the ROHD DevTools extension, providing + debugging support for ROHD hardware designs. diff --git a/rohd_extension/README.md b/rohd_extension/README.md index 37be37362b..cecb10662f 100644 --- a/rohd_extension/README.md +++ b/rohd_extension/README.md @@ -26,7 +26,7 @@ On activation the extension prints: ```text ════════════════════════════════════════════════════════════ -ROHD 0.1.0: Extension loaded for FLC crossprobing. +ROHD 0.2.0: Extension loaded for FLC crossprobing. DTD: URI: ws://127.0.0.1:44123/token @@ -258,12 +258,12 @@ cd rohd_extension npm run package ``` -This produces `rohd-0.1.0.vsix`. +This produces `rohd-0.2.0.vsix`. ### Install ```bash -code --install-extension rohd-0.1.0.vsix --force +code --install-extension rohd-0.2.0.vsix --force ``` Then reload the VS Code window (**Developer: Reload Window**). @@ -274,7 +274,7 @@ Then reload the VS Code window (**Developer: Reload Window**). cd rohd_extension \ && npm ci \ && npm run package \ - && code --install-extension rohd-0.1.0.vsix --force \ + && code --install-extension rohd-0.2.0.vsix --force \ && echo "Done — reload the VS Code window to activate." ``` @@ -290,7 +290,7 @@ Place the extension source in your repo and build it on container creation: ```jsonc // .devcontainer/devcontainer.json { - "postCreateCommand": "cd rohd_extension && npm ci && npm run package && code --install-extension rohd-0.1.0.vsix --force" + "postCreateCommand": "cd rohd_extension && npm ci && npm run package && code --install-extension rohd-0.2.0.vsix --force" } ``` @@ -300,14 +300,14 @@ Build the `.vsix` on your host or in CI, then install at container start: ```jsonc { - "postStartCommand": "code --install-extension rohd_extension/rohd-0.1.0.vsix --force" + "postStartCommand": "code --install-extension rohd_extension/rohd-0.2.0.vsix --force" } ``` ### Option 3: Install via CLI while connected ```bash -code --install-extension rohd-0.1.0.vsix --force +code --install-extension rohd-0.2.0.vsix --force ``` The `code` CLI inside a remote session targets the VS Code Server @@ -325,9 +325,9 @@ automatically. If the `code` CLI is not available (e.g. in a Dockerfile `RUN` step): ```bash -mkdir -p ~/.vscode-server/extensions/rohd.rohd-0.1.0 +mkdir -p ~/.vscode-server/extensions/rohd.rohd-0.2.0 cp -r rohd_extension/{package.json,out,snippets,resources} \ - ~/.vscode-server/extensions/rohd.rohd-0.1.0/ + ~/.vscode-server/extensions/rohd.rohd-0.2.0/ ``` The directory name must follow the pattern `.-`. diff --git a/rohd_extension/package.json b/rohd_extension/package.json index a7d1d9f3dc..19ac733282 100644 --- a/rohd_extension/package.json +++ b/rohd_extension/package.json @@ -2,7 +2,7 @@ "name": "rohd", "displayName": "ROHD", "description": "ROHD extension for VS Code — snippets, cross-probe source navigation, and language support for the ROHD hardware design framework.", - "version": "0.1.0", + "version": "0.2.0", "publisher": "rohd", "license": "BSD-3-Clause", "repository": { From 1942fcf35ef16fbb2c98df71d07d53dcc2ccdc9b Mon Sep 17 00:00:00 2001 From: "Desmond A. Kirkpatrick" Date: Tue, 13 Oct 2026 05:14:33 -0700 Subject: [PATCH 03/26] local package overrides to deal with updates --- doc/tutorials/chapter_9/rohd_vf_example/pubspec.yaml | 2 ++ packages/rohd_devtools_widgets/pubspec.yaml | 5 +++++ pubspec.yaml | 4 ++++ rohd_devtools_extension/assets/help/rohd_shell_help.md | 2 +- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/tutorials/chapter_9/rohd_vf_example/pubspec.yaml b/doc/tutorials/chapter_9/rohd_vf_example/pubspec.yaml index 27d99489a3..b734d9d38a 100644 --- a/doc/tutorials/chapter_9/rohd_vf_example/pubspec.yaml +++ b/doc/tutorials/chapter_9/rohd_vf_example/pubspec.yaml @@ -15,6 +15,8 @@ dependencies: dependency_overrides: rohd: path: ../../../../ + rohd_hierarchy: + path: ../../../../packages/rohd_hierarchy dev_dependencies: lints: ^2.0.0 diff --git a/packages/rohd_devtools_widgets/pubspec.yaml b/packages/rohd_devtools_widgets/pubspec.yaml index 67534e883e..ce960dd61f 100644 --- a/packages/rohd_devtools_widgets/pubspec.yaml +++ b/packages/rohd_devtools_widgets/pubspec.yaml @@ -14,6 +14,11 @@ dependencies: rohd: ^0.6.10 rohd_hierarchy: ^0.2.0 web: ^1.0.0 + +dependency_overrides: + rohd_hierarchy: + path: ../rohd_hierarchy + dev_dependencies: flutter_test: {sdk: flutter} lints: ^5.0.0 diff --git a/pubspec.yaml b/pubspec.yaml index 018ec38246..d10ccc4bb3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,6 +18,10 @@ dependencies: test: ^1.17.3 yaml: ^3.1.1 +dependency_overrides: + rohd_hierarchy: + path: packages/rohd_hierarchy + dev_dependencies: benchmark_harness: ^2.2.0 coverage: ^1.10.0 diff --git a/rohd_devtools_extension/assets/help/rohd_shell_help.md b/rohd_devtools_extension/assets/help/rohd_shell_help.md index e42f173ae2..7c52d47ba7 100644 --- a/rohd_devtools_extension/assets/help/rohd_shell_help.md +++ b/rohd_devtools_extension/assets/help/rohd_shell_help.md @@ -67,4 +67,4 @@ The shell displays successful commands in green and failures in red. Pretty output shows occurrence addresses, list sizes, and signal values without printing the full protocol JSON. Transported occurrence handles contain only their addresses, even in `--json` mode. Run `name $occurrence` to expand one -handle with its path and metadata. \ No newline at end of file +handle with its path and metadata. From 3beb43dde346bdfb20225a888ff30abc7f0712d6 Mon Sep 17 00:00:00 2001 From: "Desmond A. Kirkpatrick" Date: Tue, 13 Oct 2026 06:27:07 -0700 Subject: [PATCH 04/26] added client side to rohd_waveform, fix issues in CI --- .../analysis_options.yaml | 4 - packages/rohd_waveform/CHANGELOG.md | 6 +- packages/rohd_waveform/README.md | 12 +- packages/rohd_waveform/lib/rohd_waveform.dart | 2 + .../lib/src/models/signal_data_service.dart | 2 +- .../lib/src/models/signal_waveform.dart | 93 +--- .../lib/src/module_structure_hierarchy.dart | 69 +++ .../rohd_waveform/lib/src/waveform_api.dart | 6 +- .../lib/src/waveform_repository.dart | 248 ++++++---- packages/rohd_waveform/pubspec.yaml | 6 +- packages/rohd_waveform/pubspec_overrides.yaml | 3 + .../client_repository_migration_test.dart | 428 ++++++++++++++++++ .../test/module_structure_hierarchy_test.dart | 73 +++ .../test/signal_waveform_test.dart | 122 ++--- .../test/waveform_repository_test.dart | 35 +- rohd_devtools_extension/README.md | 9 +- .../tool/test_devtools_install.dart | 23 + test/waveform_service_test.dart | 1 + tool/test/devtools_install_test.sh | 7 +- 19 files changed, 860 insertions(+), 289 deletions(-) create mode 100644 packages/rohd_waveform/lib/src/module_structure_hierarchy.dart create mode 100644 packages/rohd_waveform/pubspec_overrides.yaml create mode 100644 packages/rohd_waveform/test/client_repository_migration_test.dart create mode 100644 packages/rohd_waveform/test/module_structure_hierarchy_test.dart diff --git a/packages/rohd_devtools_widgets/analysis_options.yaml b/packages/rohd_devtools_widgets/analysis_options.yaml index 0b2cfe659e..c3810a1c81 100644 --- a/packages/rohd_devtools_widgets/analysis_options.yaml +++ b/packages/rohd_devtools_widgets/analysis_options.yaml @@ -8,7 +8,3 @@ analyzer: - macos/** - linux/** include: package:lints/recommended.yaml - -linter: - rules: - - migrate_design_widgets diff --git a/packages/rohd_waveform/CHANGELOG.md b/packages/rohd_waveform/CHANGELOG.md index 533d2d6c32..e028b0bee6 100644 --- a/packages/rohd_waveform/CHANGELOG.md +++ b/packages/rohd_waveform/CHANGELOG.md @@ -1,7 +1,9 @@ ## 0.2.0 -- Add monitored waveform-row metadata, display-format preferences, occurrence - matching, and value/edge search APIs. +- Adds the reusable waveform client repository, cache, signal-data adapter, + hierarchy normalization, canonical signal matching, transition search, and + nested four-state sub-field handling. +- Allows Equatable 2 or 3 while preserving support for Dart 3.0 and newer. ## 0.1.0 diff --git a/packages/rohd_waveform/README.md b/packages/rohd_waveform/README.md index ef72ba319f..f9c372dfff 100644 --- a/packages/rohd_waveform/README.md +++ b/packages/rohd_waveform/README.md @@ -21,11 +21,13 @@ streaming waveform values: retrieving value snapshots. - `SignalWaveformRepository` wraps a `SignalWaveformApi`, waits for asynchronous sources to become ready, caches signal metadata and waveform values, and can - synthesize computed sub-field waveforms from parent signal data. + synthesize nested, four-state sub-field waveforms from parent signal data. - `SignalDataService` exposes a signal-centric interface for clients that work with `SignalOccurrence` objects from `rohd_hierarchy`. - `RepositorySignalDataService` adapts the repository cache into `WaveData` objects for wave viewers and other clients. +- `resolveModuleStructure` normalizes one or more waveform hierarchy roots into + a structure paired with its owning `HierarchyService`. The package does not include a waveform backend. Applications provide a concrete `SignalWaveformApi` implementation for their data source, while this @@ -42,8 +44,9 @@ boundary: computed, but it does not provide hierarchy metadata or lookup behavior. - `SignalWaveform` — repository/client-side waveform state for one signal. It can be built from `WaveformData`, appended to over time, queried by time or - range, and linked back to `SignalOccurrence` metadata through a lookup - function. + transition criterion, linked back to `SignalOccurrence` metadata through a + lookup function, and matched canonically when a backend uses a different + textual signal ID. - `WaveformUpdateEvent` — event payload for waveform update notifications. - `WaveData` — combined `SignalOccurrence` metadata and waveform data returned by `SignalDataService`. @@ -53,6 +56,9 @@ In short, use `WaveformData` at the service/API boundary and `SignalWaveform` inside clients or repositories that need cached state, incremental appends, metadata access, or waveform queries. +Monitor-list identity, grouping, undo/redo, and display-format preferences are +viewer policy and are intentionally not part of this package. + For hierarchy types such as `HierarchyOccurrence` and `SignalOccurrence`, import `package:rohd_hierarchy/rohd_hierarchy.dart` directly. diff --git a/packages/rohd_waveform/lib/rohd_waveform.dart b/packages/rohd_waveform/lib/rohd_waveform.dart index e20d7ce3b4..e2ccd9f789 100644 --- a/packages/rohd_waveform/lib/rohd_waveform.dart +++ b/packages/rohd_waveform/lib/rohd_waveform.dart @@ -19,5 +19,7 @@ library; export 'src/models/models.dart'; +export 'src/module_structure_hierarchy.dart'; +export 'src/signal_data_service_impl.dart'; export 'src/waveform_api.dart'; export 'src/waveform_repository.dart'; diff --git a/packages/rohd_waveform/lib/src/models/signal_data_service.dart b/packages/rohd_waveform/lib/src/models/signal_data_service.dart index 898d52b2b2..bca7bd83bb 100644 --- a/packages/rohd_waveform/lib/src/models/signal_data_service.dart +++ b/packages/rohd_waveform/lib/src/models/signal_data_service.dart @@ -71,7 +71,7 @@ class WaveData { /// This SignalOccurrence is never modified by the service. final SignalOccurrence port; - /// The waveform data points [time, value] pairs. + /// The waveform data point `(time, value)` pairs. /// Data type and structure depends on the source (VCD, debugger, etc.). final List data; diff --git a/packages/rohd_waveform/lib/src/models/signal_waveform.dart b/packages/rohd_waveform/lib/src/models/signal_waveform.dart index c076468b61..113a185663 100644 --- a/packages/rohd_waveform/lib/src/models/signal_waveform.dart +++ b/packages/rohd_waveform/lib/src/models/signal_waveform.dart @@ -18,40 +18,16 @@ typedef SignalLookup = SignalOccurrence? Function(String signalId); /// Criterion used when searching waveform transitions. enum WaveformSearchCriterion { - /// Match samples with an exact value. + /// Match a specific waveform value. value, - /// Match low-to-high transitions. + /// Match a low-to-high transition. risingEdge, - /// Match high-to-low transitions. + /// Match a high-to-low transition. fallingEdge, } -/// Display representation selected for a monitored waveform row. -enum MonitorValueFormat { - /// Render the signal using its waveform shape and labels. - waveform, - - /// Display numeric values as binary. - binary, - - /// Display numeric values as hexadecimal. - hexadecimal, - - /// Display numeric values as unsigned decimal. - unsignedDecimal, - - /// Display numeric values as signed decimal. - signedDecimal, - - /// Display numeric values as octal. - octal, - - /// Display numeric values as ASCII characters. - ascii, -} - /// Waveform data for a signal. /// /// This class holds the time-series waveform data for a signal and provides @@ -73,27 +49,10 @@ enum MonitorValueFormat { /// print(waveform.name); // Uses lookup to get SignalOccurrence.name /// ``` class SignalWaveform { - static int _nextMonitorRow = 0; - /// The ID of the signal this waveform data belongs to. /// Use this to look up SignalOccurrence metadata from the hierarchy. final String signalId; - /// Identity for this monitor-list row. - /// - /// The first occurrence keeps [signalId] for compatibility. Copies used for - /// duplicate monitor rows receive a distinct ID unless one is provided. - final String monitorId; - - /// Parent monitor-row identity for generated fields and bit slices. - String? monitorParentId; - - /// Optional named group applied to this monitored row. - String? monitorGroup; - - /// Display representation selected for this monitored row. - MonitorValueFormat valueFormat; - /// The waveform data points (time, value pairs). final List data; @@ -110,7 +69,8 @@ class SignalWaveform { /// rather than directly fetched from the VM service. bool _isComputed; - /// Whether this waveform was computed rather than directly sampled. + /// Whether this waveform was computed/synthesized (e.g. gate evaluation) + /// rather than directly fetched from the VM service. bool get isComputed => _isComputed; /// Explicit width for a computed signal not present in the hierarchy. @@ -122,16 +82,11 @@ class SignalWaveform { /// Creates a new SignalWaveform. SignalWaveform({ required this.signalId, - String? monitorId, List? data, bool isComputed = false, this.overrideWidth, this.overrideName, - this.monitorParentId, - this.monitorGroup, - this.valueFormat = MonitorValueFormat.waveform, - }) : monitorId = monitorId ?? signalId, - _isComputed = isComputed, + }) : _isComputed = isComputed, data = data ?? []; /// Creates an empty SignalWaveform for a signal. @@ -141,7 +96,7 @@ class SignalWaveform { /// Creates a SignalWaveform from WaveformData. /// /// [signalId] may provide the canonical hierarchy path when the waveform - /// source uses a different identifier format. + /// source uses a different textual identifier. factory SignalWaveform.fromWaveformData( WaveformData waveformData, { String? signalId, @@ -160,19 +115,14 @@ class SignalWaveform { /// state between rows in the waveform panel. factory SignalWaveform.copyFrom( SignalWaveform other, { - String? monitorId, bool? isComputed, }) => SignalWaveform( signalId: other.signalId, - monitorId: monitorId ?? '${other.signalId}#${_nextMonitorRow++}', data: List.from(other.data), isComputed: isComputed ?? other.isComputed, overrideWidth: other.overrideWidth, overrideName: other.overrideName, - monitorParentId: other.monitorParentId, - monitorGroup: other.monitorGroup, - valueFormat: other.valueFormat, ); // ───────────────────────────────────────────────────────────────────────── @@ -201,7 +151,7 @@ class SignalWaveform { String get type => 'wire'; /// The signal width from metadata, an explicit override, or derived metadata. - int get width => signal?.width ?? overrideWidth ?? _derivedSubFieldWidth ?? 1; + int get width => overrideWidth ?? signal?.width ?? _derivedSubFieldWidth ?? 1; /// The signal direction (from metadata). Returns null for internal signals. String? get direction => signal?.direction; @@ -212,7 +162,7 @@ class SignalWaveform { /// Whether this waveform represents [occurrence]. /// /// Waveform sources can use different textual IDs for the same hierarchy - /// signal, so compare resolved occurrence addresses when metadata is present. + /// signal, so resolved occurrence addresses take precedence when available. bool matchesOccurrence(SignalOccurrence occurrence) => signalId == occurrence.path() || (signal?.address != null && signal?.address == occurrence.address); @@ -515,28 +465,3 @@ class SignalWaveform { [], ); } - -/// A monitored waveform row with a user-defined display name. -class MonitoredSignal extends SignalWaveform { - /// Display name used in the monitored-signal list. - final String displayName; - - /// Creates a named copy of an existing waveform. - MonitoredSignal.fromWaveform( - SignalWaveform waveform, { - required this.displayName, - }) : super( - signalId: waveform.signalId, - monitorId: waveform.monitorId, - data: List.from(waveform.data), - isComputed: waveform.isComputed, - overrideWidth: waveform.overrideWidth, - overrideName: displayName, - monitorParentId: waveform.monitorParentId, - monitorGroup: waveform.monitorGroup, - valueFormat: waveform.valueFormat, - ); - - @override - String get name => displayName; -} diff --git a/packages/rohd_waveform/lib/src/module_structure_hierarchy.dart b/packages/rohd_waveform/lib/src/module_structure_hierarchy.dart new file mode 100644 index 0000000000..95747d60f0 --- /dev/null +++ b/packages/rohd_waveform/lib/src/module_structure_hierarchy.dart @@ -0,0 +1,69 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// module_structure_hierarchy.dart +// Normalizes waveform module structures to a single hierarchy root. +// +// 2026 October +// Author: Desmond Kirkpatrick + +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; +import 'package:rohd_waveform/rohd_waveform.dart'; + +/// A module structure paired with the hierarchy service that owns its root. +class ResolvedModuleStructure { + /// Creates a resolved module structure. + const ResolvedModuleStructure({ + required this.structure, + required this.hierarchyService, + }); + + /// The normalized structure containing exactly one hierarchy root. + final ModuleStructure structure; + + /// The hierarchy service for [structure]. + final HierarchyService hierarchyService; + + /// The root shared by [structure] and [hierarchyService]. + HierarchyOccurrence get root => hierarchyService.root; +} + +/// Resolves every top-level module under one hierarchy service. +/// +/// A single top-level module remains unchanged. Multiple top-level scopes are +/// placed under a synthetic `root` occurrence because [HierarchyService] +/// exposes one root. +ResolvedModuleStructure resolveModuleStructure(ModuleStructure structure) { + if (structure.modules.isEmpty) { + throw StateError('The waveform does not contain any module scopes.'); + } + + if (structure.modules.length == 1) { + final root = structure.modules.single; + final hierarchyService = + structure.hierarchyService ?? BaseHierarchyAdapter.fromTree(root); + return ResolvedModuleStructure( + structure: ModuleStructure( + metadata: structure.metadata, + modules: [hierarchyService.root], + hierarchyService: hierarchyService, + ), + hierarchyService: hierarchyService, + ); + } + + final root = HierarchyOccurrence( + name: 'root', + definition: 'waveform', + children: structure.modules, + ); + final hierarchyService = BaseHierarchyAdapter.fromTree(root); + return ResolvedModuleStructure( + structure: ModuleStructure( + metadata: structure.metadata, + modules: [root], + hierarchyService: hierarchyService, + ), + hierarchyService: hierarchyService, + ); +} diff --git a/packages/rohd_waveform/lib/src/waveform_api.dart b/packages/rohd_waveform/lib/src/waveform_api.dart index 7786561bf7..cbf939ce5b 100644 --- a/packages/rohd_waveform/lib/src/waveform_api.dart +++ b/packages/rohd_waveform/lib/src/waveform_api.dart @@ -26,7 +26,8 @@ abstract class SignalWaveformApi { /// Retrieves waveform data for specific signals. /// /// [signalIds] is a list of signal IDs for which to retrieve data. - /// [startTime] and [endTime] optionally specify a time range for the data. + /// [startTime] and [endTime] optionally specify an inclusive time range in + /// the same units as [Data.time]. /// /// Returns a [Future] that completes with a list of [WaveformData] objects. Future> getWaveformData({ @@ -41,7 +42,8 @@ abstract class SignalWaveformApi { /// Streams waveform data incrementally for specific signals. /// /// [signalIds] is a list of signal IDs for which to stream data. - /// [startTime] optionally specifies the starting time for the data stream. + /// [startTime] optionally specifies the inclusive starting time in the same + /// units as [Data.time]. /// /// Returns a [Stream] of [WaveformData] objects that can be used to /// incrementally update the waveform display. diff --git a/packages/rohd_waveform/lib/src/waveform_repository.dart b/packages/rohd_waveform/lib/src/waveform_repository.dart index 485fb0301b..a439f1a7e1 100644 --- a/packages/rohd_waveform/lib/src/waveform_repository.dart +++ b/packages/rohd_waveform/lib/src/waveform_repository.dart @@ -5,7 +5,8 @@ // Domain layer that manages the retrieval of signal waveforms. // // 2024 January 29 -// Author: Desmond Kirkpatrick +// Author(s): Desmond Kirkpatrick +// Yao Jing Quek import 'dart:async'; @@ -138,30 +139,37 @@ class SignalWaveformRepository { /// Call this after receiving the hierarchy from the external /// tree-data-source path, via `setExternalHierarchy` in the bloc. void buildSignalCacheFromHierarchy(List modules) { + final roots = modules.length <= 1 + ? modules + : [ + HierarchyOccurrence( + name: 'root', + definition: 'waveform', + children: modules, + ), + ]; // Ensure every node and signal has an address. - for (final m in modules) { + for (final m in roots) { if (m.address == null) { m.buildAddresses(); } } // Auto-create a HierarchyService if the caller hasn't set one. - if (hierarchyService == null && modules.isNotEmpty) { - hierarchyService = BaseHierarchyAdapter.fromTree(modules.first); + if (hierarchyService == null && roots.isNotEmpty) { + hierarchyService = BaseHierarchyAdapter.fromTree(roots.first); } - _buildSignalCache(modules); + _buildSignalCache(roots); } /// Get the current simulation time from the waveform API. - Future getCurrentTime() async { - await _ensureReady(); - final currentTime = await _signalWaveformApi.getCurrentTime(); - return currentTime; - } + Future getCurrentTime() => + _ensureReady().then((_) => _signalWaveformApi.getCurrentTime()); /// Retrieves waveform data for specific signals. /// /// [signalIds] is a list of signal IDs for which to retrieve data. - /// [startTime] and [endTime] optionally specify a time range for the data. + /// [startTime] and [endTime] optionally specify an inclusive time range in + /// the same units as [Data.time]. /// /// Sub-field IDs (containing `#`) are intercepted and synthesized via /// bit-slicing the parent signal's waveform data. This enables sub-field @@ -190,11 +198,13 @@ class SignalWaveformRepository { // Fetch plain signals from the API. final results = []; if (plainIds.isNotEmpty) { - results.addAll(await _signalWaveformApi.getWaveformData( - signalIds: plainIds, - startTime: startTime, - endTime: endTime, - )); + results.addAll( + await _signalWaveformApi.getWaveformData( + signalIds: plainIds, + startTime: startTime, + endTime: endTime, + ), + ); } // Synthesize sub-field bit-slices at the repository level. @@ -247,20 +257,31 @@ class SignalWaveformRepository { // Cache by raw string ID. final id = waveformData.signalId; if (isFullFetch || !_subFieldWaveformCache.containsKey(id)) { - _subFieldWaveformCache[id] = - SignalWaveform.fromWaveformData(waveformData); + _subFieldWaveformCache[id] = SignalWaveform.fromWaveformData( + waveformData, + ); } else { - _subFieldWaveformCache[id]! - .appendWaveformData(waveformData, sortByTime: sortByTime); + _subFieldWaveformCache[id]!.appendWaveformData( + waveformData, + sortByTime: sortByTime, + ); } continue; } + final canonicalSignalId = + hierarchyService!.addressToPathname(addr, asSignal: true) ?? + waveformData.signalId; if (isFullFetch || !_waveformCache.containsKey(addr)) { - _waveformCache[addr] = SignalWaveform.fromWaveformData(waveformData); + _waveformCache[addr] = SignalWaveform.fromWaveformData( + waveformData, + signalId: canonicalSignalId, + ); } else { - _waveformCache[addr]! - .appendWaveformData(waveformData, sortByTime: sortByTime); + _waveformCache[addr]!.appendWaveformData( + waveformData, + sortByTime: sortByTime, + ); } } return waveformDataList; @@ -296,8 +317,12 @@ class SignalWaveformRepository { if (waveform != null) { waveform.appendWaveformData(waveformData); } else { + final canonicalSignalId = + hierarchyService!.addressToPathname(addr, asSignal: true) ?? + waveformData.signalId; _waveformCache[addr] = SignalWaveform.fromWaveformData( waveformData, + signalId: canonicalSignalId, ); } } else { @@ -307,8 +332,9 @@ class SignalWaveformRepository { if (waveform != null) { waveform.appendWaveformData(waveformData); } else { - _subFieldWaveformCache[id] = - SignalWaveform.fromWaveformData(waveformData); + _subFieldWaveformCache[id] = SignalWaveform.fromWaveformData( + waveformData, + ); } } } @@ -435,7 +461,8 @@ class SignalWaveformRepository { /// /// Use [getWaveformsBySelectedModule] to get waveform data. List getSignalsBySelectedModule( - HierarchyOccurrence module) { + HierarchyOccurrence module, + ) { final signals = []; for (final signal in module.signals) { final addr = signal.address; @@ -490,13 +517,13 @@ class SignalWaveformRepository { int? startTime, int? endTime, }) async { - final idx = signalId.indexOf(_subFieldSeparator); - if (idx < 0) { + final pathParts = signalId.split(_subFieldSeparator); + if (pathParts.length < 2 || pathParts.any((part) => part.isEmpty)) { return null; } - final parentPath = signalId.substring(0, idx); - final fieldPath = signalId.substring(idx + 1); + final parentPath = pathParts.first; + final slicePaths = pathParts.skip(1); // Resolve parent signal metadata for logicType and width. final parentSig = _lookupSignalByPath(parentPath); @@ -505,29 +532,36 @@ class SignalWaveformRepository { } final parentWidth = parentSig.width; - // Handle flat bit-slice patterns: b[N] or b[high:low]. - // These don't require logicType — they are pure bitvector access. - final bitSliceMatch = - RegExp(r'^b\[(\d+)(?::(\d+))?\]$').firstMatch(fieldPath); - int? bitSliceLo; - int? bitSliceWidth; - if (bitSliceMatch != null) { - final hi = int.parse(bitSliceMatch.group(1)!); - final lo = bitSliceMatch.group(2) != null - ? int.parse(bitSliceMatch.group(2)!) - : hi; - bitSliceLo = lo < hi ? lo : hi; - bitSliceWidth = (hi - lo).abs() + 1; - } else if (parentSig.logicType == null) { - return null; - } + var lo = 0; + var fieldWidth = parentWidth; + String? fieldPath; + var hasBitSlice = false; + + for (final slicePath in slicePaths) { + final bitSliceMatch = + RegExp(r'^b\[(\d+)(?::(\d+))?\]$').firstMatch(slicePath); + if (bitSliceMatch != null) { + final firstBit = int.parse(bitSliceMatch.group(1)!); + final secondBit = bitSliceMatch.group(2) != null + ? int.parse(bitSliceMatch.group(2)!) + : firstBit; + final relativeLo = firstBit < secondBit ? firstBit : secondBit; + final sliceWidth = (firstBit - secondBit).abs() + 1; + if (hasBitSlice || + relativeLo < 0 || + relativeLo + sliceWidth > fieldWidth) { + return null; + } + lo += relativeLo; + fieldWidth = sliceWidth; + hasBitSlice = true; + continue; + } - int lo; - int fieldWidth; - if (bitSliceLo != null) { - lo = bitSliceLo; - fieldWidth = bitSliceWidth!; - } else { + if (hasBitSlice || parentSig.logicType == null) { + return null; + } + fieldPath = fieldPath == null ? slicePath : '$fieldPath.$slicePath'; final resolved = _resolveFieldBits(parentSig.logicType!, fieldPath); if (resolved == null) { return null; @@ -561,11 +595,7 @@ class SignalWaveformRepository { } } - return WaveformData( - signalId: signalId, - data: outputData, - isComputed: true, - ); + return WaveformData(signalId: signalId, data: outputData, isComputed: true); } /// Recursively resolve a dot-separated field path within a [logicType] map @@ -667,57 +697,97 @@ class SignalWaveformRepository { /// - Raw binary: `10101010` /// - x/z states /// - /// Returns a hex-formatted string for the extracted slice. + /// Returns a sized radix string, using binary when needed to preserve X/Z. static String _extractBits( String value, int parentWidth, int startBit, int width, ) { - final lower = value.toLowerCase().trim(); + final parentBits = _normalizeFourStateBits(value, parentWidth); + final sliceStart = parentWidth - startBit - width; + final sliceEnd = parentWidth - startBit; + final sliced = parentBits.sublist(sliceStart, sliceEnd); - // Handle pure x/z values. - if (lower.replaceAll('x', '').replaceAll('z', '').isEmpty && - lower.isNotEmpty) { - return width == 1 ? 'x' : 'x' * ((width + 3) ~/ 4); + if (width == 1) { + return sliced.single; + } + if (sliced.any((bit) => bit == 'x' || bit == 'z')) { + return "$width'b${sliced.join()}"; } - BigInt? bi; + final numeric = BigInt.parse(sliced.join(), radix: 2); + final hexDigits = (width + 3) ~/ 4; + final hex = numeric.toRadixString(16).padLeft(hexDigits, '0'); + return "$width'h$hex"; + } - // Try ROHD radix format: 'h or 'b + static List _normalizeFourStateBits(String value, int parentWidth) { + final lower = value.toLowerCase().trim(); final rohdMatch = RegExp(r"^(\d+)'([hb])(.+)$").firstMatch(lower); + + List? bits; + int? literalWidth; if (rohdMatch != null) { - final radixChar = rohdMatch.group(2)!; - final digits = rohdMatch.group(3)!; - // Check for x/z in the value portion. - if (digits.contains('x') || digits.contains('z')) { - return width == 1 ? 'x' : 'x' * ((width + 3) ~/ 4); - } - final radix = radixChar == 'h' ? 16 : 2; - bi = BigInt.tryParse(digits, radix: radix); + literalWidth = int.tryParse(rohdMatch.group(1)!); + bits = _decodeFourStateDigits(rohdMatch.group(3)!, rohdMatch.group(2)!); } else if (lower.startsWith('0x')) { - bi = BigInt.tryParse(value.substring(2), radix: 16); - } else if (RegExp(r'^[01]+$').hasMatch(lower)) { - bi = BigInt.tryParse(value, radix: 2); + bits = _decodeFourStateDigits(lower.substring(2), 'h'); + } else if (lower.startsWith('0b')) { + bits = _decodeFourStateDigits(lower.substring(2), 'b'); + } else if (RegExp(r'^[01xz]+$').hasMatch(lower)) { + bits = _decodeFourStateDigits(lower, 'b'); } else { - // Default: try hex parse. - bi = BigInt.tryParse(value, radix: 16); + bits = _decodeFourStateDigits(lower, 'h'); } - if (bi == null) { - return width == 1 ? 'x' : 'x' * ((width + 3) ~/ 4); + if (bits == null || literalWidth == 0) { + return List.filled(parentWidth, 'x'); } - // Extract the bit range. - final mask = (BigInt.one << width) - BigInt.one; - final sliced = (bi >> startBit) & mask; + if (literalWidth != null) { + bits = _resizeFourStateBits(bits, literalWidth, extendUnknown: true); + } + return _resizeFourStateBits( + bits, + parentWidth, + extendUnknown: literalWidth == null, + ); + } - // Format output using ROHD radixString style: width'hHEX - if (width == 1) { - return sliced == BigInt.one ? '1' : '0'; + static List? _decodeFourStateDigits(String digits, String radix) { + if (radix == 'b') { + return RegExp(r'^[01xz]+$').hasMatch(digits) ? digits.split('') : null; } - final hexDigits = (width + 3) ~/ 4; - final hex = sliced.toRadixString(16).padLeft(hexDigits, '0'); - return "$width'h$hex"; + if (!RegExp(r'^[0-9a-fxz]+$').hasMatch(digits)) { + return null; + } + + return [ + for (final digit in digits.split('')) + if (digit == 'x' || digit == 'z') + ...List.filled(4, digit) + else + ...int.parse( + digit, + radix: 16, + ).toRadixString(2).padLeft(4, '0').split(''), + ]; + } + + static List _resizeFourStateBits( + List bits, + int width, { + required bool extendUnknown, + }) { + if (bits.length >= width) { + return bits.sublist(bits.length - width); + } + + final leadingBit = bits.isEmpty ? 'x' : bits.first; + final extension = extendUnknown && (leadingBit == 'x' || leadingBit == 'z') + ? leadingBit + : '0'; + return [...List.filled(width - bits.length, extension), ...bits]; } } diff --git a/packages/rohd_waveform/pubspec.yaml b/packages/rohd_waveform/pubspec.yaml index 00c4ba9c0a..30cc26cb0a 100644 --- a/packages/rohd_waveform/pubspec.yaml +++ b/packages/rohd_waveform/pubspec.yaml @@ -1,6 +1,5 @@ name: rohd_waveform description: "Waveform data models and APIs for wave viewers - ModuleStructure, SignalWaveform, and waveform primitives." -publish_to: none homepage: https://intel.github.io/rohd-website/ repository: https://github.com/intel/rohd/tree/main/packages/rohd_waveform version: 0.2.0 @@ -11,9 +10,8 @@ environment: dependencies: collection: ^1.15.0 - equatable: ^2.0.5 - rohd_hierarchy: - path: ../rohd_hierarchy + equatable: '>=2.0.5 <4.0.0' + rohd_hierarchy: ^0.1.0 dev_dependencies: lints: ^3.0.0 diff --git a/packages/rohd_waveform/pubspec_overrides.yaml b/packages/rohd_waveform/pubspec_overrides.yaml new file mode 100644 index 0000000000..45fa10cedc --- /dev/null +++ b/packages/rohd_waveform/pubspec_overrides.yaml @@ -0,0 +1,3 @@ +dependency_overrides: + rohd_hierarchy: + path: /home/desmond/rohd.worktrees/no-logic-array-07-devtools-debugger/packages/rohd_hierarchy diff --git a/packages/rohd_waveform/test/client_repository_migration_test.dart b/packages/rohd_waveform/test/client_repository_migration_test.dart new file mode 100644 index 0000000000..e3024d50ad --- /dev/null +++ b/packages/rohd_waveform/test/client_repository_migration_test.dart @@ -0,0 +1,428 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// client_repository_migration_test.dart +// Regression tests promoted from the ROHD Wave Viewer client repository. +// +// 2026 January +// Author: Desmond Kirkpatrick + +import 'dart:async'; + +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; +import 'package:rohd_waveform/rohd_waveform.dart'; +import 'package:test/test.dart'; + +class _TestWaveformApi extends SignalWaveformApi { + final String signalId; + + const _TestWaveformApi(this.signalId); + + @override + Future> getWaveformData({ + required List signalIds, + int? startTime, + int? endTime, + }) async => + signalIds.contains(signalId) + ? [ + WaveformData( + signalId: signalId, + data: [ + Data(time: 0, value: "17'h00001"), + Data(time: 10, value: "17'h08000"), + Data(time: 20, value: "17'h10001"), + ], + ), + ] + : const []; +} + +class _RecordingWaveformApi extends SignalWaveformApi { + final Map> waveformData; + final List streamedData; + final int? currentTime; + final List<({List signalIds, int? startTime, int? endTime})> + requests = <({List signalIds, int? startTime, int? endTime})>[]; + bool didExpandSlimModules = false; + bool loaded = true; + + _RecordingWaveformApi({ + required this.waveformData, + this.streamedData = const [], + this.currentTime, + }); + + @override + Future expandAllSlimModules() async { + didExpandSlimModules = true; + } + + @override + bool get isLoaded => loaded; + + @override + Future getCurrentTime() async => currentTime; + + @override + Future> getWaveformData({ + required List signalIds, + int? startTime, + int? endTime, + }) async { + requests.add(( + signalIds: List.of(signalIds), + startTime: startTime, + endTime: endTime, + )); + return [ + for (final signalId in signalIds) + if (waveformData[signalId] case final data?) + WaveformData( + signalId: signalId, + data: [ + for (final point in data) + if ((startTime == null || point.time >= startTime) && + (endTime == null || point.time <= endTime)) + point, + ], + ), + ]; + } + + @override + Stream streamWaveformData({ + required List signalIds, + int? startTime, + }) => + Stream.fromIterable([ + for (final waveform in streamedData) + if (signalIds.contains(waveform.signalId)) + WaveformData( + signalId: waveform.signalId, + data: [ + for (final point in waveform.data) + if (startTime == null || point.time >= startTime) point, + ], + ), + ]); +} + +HierarchyOccurrence _hierarchy() => HierarchyOccurrence( + name: 'top', + signals: [ + SignalOccurrence(name: 'clock', width: 1), + SignalOccurrence(name: 'data', width: 8), + ], + children: [ + HierarchyOccurrence( + name: 'child', + signals: [SignalOccurrence(name: 'valid', width: 1)], + ), + ], + ); + +void main() { + group('SignalWaveformRepository', () { + test('builds recursive signal caches and manages selected waveforms', () { + final root = _hierarchy()..buildAddresses(); + final clock = root.signals.first; + final childValid = root.children.single.signals.single; + final repository = SignalWaveformRepository( + signalWaveformApi: _RecordingWaveformApi(waveformData: {}), + )..buildSignalCacheFromHierarchy([root]); + + expect( + repository.cachedSignalIds, + containsAll([clock.path(), childValid.path()]), + ); + expect(repository.getSignal(clock.address!), same(clock)); + expect(repository.getSignalById(childValid.path()), same(childValid)); + + final waveforms = repository.getWaveformsBySelectedModule(root); + expect(waveforms.map((waveform) => waveform.signalId), [ + clock.path(), + root.signals[1].path(), + ]); + expect(repository.clearWaveformData(clock.address!), isTrue); + expect(repository.clearWaveformData(childValid.address!), isTrue); + + repository.clearAllWaveformData(); + expect(repository.getWaveform(clock.address!), isNull); + expect(repository.getSignal(clock.address!), same(clock)); + repository.clearSignalCache(); + expect(repository.cachedSignalAddresses, isEmpty); + }); + + test( + 'replaces complete fetches and appends sorted ranged fetches', + () async { + final root = _hierarchy()..buildAddresses(); + final signal = root.signals[1]; + final api = _RecordingWaveformApi( + waveformData: { + signal.path(): [ + Data(time: 20, value: '14'), + Data(time: 0, value: '0'), + Data(time: 10, value: 'a'), + ], + }, + ); + final repository = SignalWaveformRepository(signalWaveformApi: api) + ..buildSignalCacheFromHierarchy([root]); + + await repository.loadAndAppendWaveformData(signalIds: [signal.path()]); + api.waveformData[signal.path()]!.add(Data(time: 30, value: '1e')); + await repository.loadAndAppendWaveformData( + signalIds: [signal.path()], + startTime: 25, + endTime: 30, + ); + + expect( + repository + .getWaveformById(signal.path())! + .data + .map((point) => point.time), + [0, 10, 20, 30], + ); + expect(api.requests.last.signalIds, [signal.path()]); + expect(api.requests.last.startTime, 25); + expect(api.requests.last.endTime, 30); + + await repository.loadAndAppendWaveformData(signalIds: [signal.path()]); + expect( + repository + .getWaveformById(signal.path())! + .data + .map((point) => point.time), + [20, 0, 10, 30], + ); + }, + ); + + test('streams into signal and computed waveform caches', () async { + final root = _hierarchy()..buildAddresses(); + final signal = root.signals[1]; + final computedId = '${signal.path()}#display'; + final repository = SignalWaveformRepository( + signalWaveformApi: _RecordingWaveformApi( + waveformData: {}, + streamedData: [ + WaveformData( + signalId: signal.path(), + data: [Data(time: 0, value: '0')], + ), + WaveformData( + signalId: computedId, + data: [Data(time: 5, value: 'shown')], + ), + ], + ), + )..buildSignalCacheFromHierarchy([root]); + + final streamed = await repository + .streamWaveformData(signalIds: [signal.path(), computedId]).toList(); + + expect(streamed, hasLength(2)); + expect(repository.getWaveformById(signal.path())!.data.single.value, '0'); + expect( + repository.getWaveformById(computedId)!.data.single.value, + 'shown', + ); + + final noAppendRepository = SignalWaveformRepository( + signalWaveformApi: _RecordingWaveformApi( + waveformData: {}, + streamedData: [ + WaveformData( + signalId: signal.path(), + data: [Data(time: 10, value: '1')], + ), + ], + ), + )..buildSignalCacheFromHierarchy([root]); + await noAppendRepository.streamWaveformData( + signalIds: [signal.path()], + appendToSignals: false, + ).drain(); + expect(noAppendRepository.getWaveformById(signal.path())!.data, isEmpty); + }); + + test('waits for a loading API before retrieving data', () async { + final api = _RecordingWaveformApi(waveformData: {}, currentTime: 7) + ..loaded = false; + final repository = SignalWaveformRepository( + signalWaveformApi: api, + apiReady: Completer().future, + ); + + Future.delayed( + const Duration(milliseconds: 1), + () => api.loaded = true, + ); + + expect(await repository.getCurrentTime(), 7); + }); + + test( + 'resolves array fields and propagates API lifecycle operations', + () async { + final arraySignal = SignalOccurrence( + name: 'lanes', + width: 8, + logicType: { + 'arrayDims': [2], + 'elementWidth': 4, + }, + ); + final root = HierarchyOccurrence(name: 'top', signals: [arraySignal]) + ..buildAddresses(); + final firstApi = _RecordingWaveformApi( + waveformData: { + arraySignal.path(): [Data(time: 0, value: "8'hb0")], + }, + currentTime: 42, + ); + final repository = SignalWaveformRepository(signalWaveformApi: firstApi) + ..buildSignalCacheFromHierarchy([root]); + final sliceId = '${arraySignal.path()}#[1]#b[2:1]'; + + final waveformData = await repository.getWaveformData( + signalIds: [sliceId, '${arraySignal.path()}#b[8]'], + ); + expect(waveformData.single.data.single.value, "2'h1"); + expect(await repository.getCurrentTime(), 42); + await repository.expandAllSlimModules(); + expect(firstApi.didExpandSlimModules, isTrue); + + repository.appendDataToSignal(sliceId, [Data(time: 1, value: "2'h3")]); + expect(repository.getWaveformById(sliceId), isNotNull); + repository.setSignalWaveformApi( + _RecordingWaveformApi(waveformData: {}), + ); + expect(repository.cachedSignalAddresses, isEmpty); + expect(repository.getWaveformById(sliceId), isNull); + }, + ); + + test('ignores invalid sub-fields and caches empty valid slices', () async { + final signal = SignalOccurrence(name: 'data', width: 4); + final root = HierarchyOccurrence(name: 'top', signals: [signal]) + ..buildAddresses(); + final repository = SignalWaveformRepository( + signalWaveformApi: _RecordingWaveformApi( + waveformData: {signal.path(): const []}, + ), + )..buildSignalCacheFromHierarchy([root]); + + final result = await repository.getWaveformData( + signalIds: [ + '${signal.path()}#field', + '${signal.path()}#b[4]', + '${signal.path()}#b[0]', + '#b[0]', + ], + ); + + expect(result, hasLength(1)); + expect(result.single.signalId, '${signal.path()}#b[0]'); + expect(result.single.data, isEmpty); + }); + + test( + 'preserves positioned X/Z bits without contaminating known slices', + () async { + final signal = SignalOccurrence(name: 'state', width: 8); + final root = HierarchyOccurrence(name: 'top', signals: [signal]) + ..buildAddresses(); + final repository = SignalWaveformRepository( + signalWaveformApi: _RecordingWaveformApi( + waveformData: { + signal.path(): [ + Data(time: 0, value: "8'b10xz0110"), + Data(time: 10, value: "8'hf"), + ], + }, + ), + )..buildSignalCacheFromHierarchy([root]); + final upperKnownId = '${signal.path()}#b[7:6]'; + final lowerKnownId = '${signal.path()}#b[3:0]'; + final mixedId = '${signal.path()}#b[5:2]'; + final zBitId = '${signal.path()}#b[4]'; + + final waveforms = await repository.getWaveformData( + signalIds: [upperKnownId, lowerKnownId, mixedId, zBitId], + ); + final valuesById = { + for (final waveform in waveforms) + waveform.signalId: + waveform.data.map((point) => point.value).toList(), + }; + + expect(valuesById[upperKnownId], ["2'h2", "2'h0"]); + expect(valuesById[lowerKnownId], ["4'h6", "4'hf"]); + expect(valuesById[mixedId], ["4'bxz01", "4'h3"]); + expect(valuesById[zBitId], ['z', '0']); + }, + ); + + test( + 'synthesizes bits from an already-synthesized structure field', + () async { + final sample = SignalOccurrence( + name: 'sample', + width: 17, + logicType: { + 'typeName': 'FilterSample', + 'fields': [ + { + 'name': 'data', + 'width': 16, + 'bits': List.generate(16, (index) => index), + }, + { + 'name': 'valid', + 'width': 1, + 'bits': [16], + }, + ], + }, + ); + final root = HierarchyOccurrence(name: 'FilterBank', signals: [sample]) + ..buildAddresses(); + + final repository = SignalWaveformRepository( + signalWaveformApi: _TestWaveformApi(sample.path()), + )..buildSignalCacheFromHierarchy([root]); + final fieldId = '${sample.path()}#data'; + final bitZeroId = '$fieldId#b[0]'; + final bitFifteenId = '$fieldId#b[15]'; + + await repository.loadAndAppendWaveformData(signalIds: [fieldId]); + await repository.loadAndAppendWaveformData( + signalIds: [bitZeroId, bitFifteenId], + ); + + expect( + repository.getWaveformById(fieldId)!.data.map((point) => point.value), + ["16'h0001", "16'h8000", "16'h0001"], + ); + expect( + repository + .getWaveformById(bitZeroId)! + .data + .map((point) => point.value), + ['1', '0', '1'], + ); + expect( + repository + .getWaveformById(bitFifteenId)! + .data + .map((point) => point.value), + ['0', '1', '0'], + ); + }, + ); + }); +} diff --git a/packages/rohd_waveform/test/module_structure_hierarchy_test.dart b/packages/rohd_waveform/test/module_structure_hierarchy_test.dart new file mode 100644 index 0000000000..041efe5861 --- /dev/null +++ b/packages/rohd_waveform/test/module_structure_hierarchy_test.dart @@ -0,0 +1,73 @@ +// Copyright (C) 2026 Intel Corporation +// SPDX-License-Identifier: BSD-3-Clause +// +// module_structure_hierarchy_test.dart +// Tests waveform module structure root normalization. +// +// 2026 October +// Author: Desmond Kirkpatrick + +import 'package:rohd_hierarchy/rohd_hierarchy.dart'; +import 'package:rohd_waveform/rohd_waveform.dart'; +import 'package:test/test.dart'; + +void main() { + group('resolveModuleStructure', () { + test('preserves a single top-level module', () { + final top = HierarchyOccurrence( + name: 'top', + signals: [SignalOccurrence(name: 'clock', width: 1)], + ); + + final resolved = resolveModuleStructure( + ModuleStructure(metadata: MetaData.empty(), modules: [top]), + ); + + expect(resolved.root, same(top)); + expect(resolved.structure.modules, [same(top)]); + expect(top.signals.single.address, isNotNull); + }); + + test('places sibling top-level modules under one addressed root', () { + final alpha = HierarchyOccurrence( + name: 'alpha', + signals: [SignalOccurrence(name: 'a', width: 1)], + ); + final beta = HierarchyOccurrence( + name: 'beta', + signals: [SignalOccurrence(name: 'b', width: 1)], + ); + + final resolved = resolveModuleStructure( + ModuleStructure(metadata: MetaData.empty(), modules: [alpha, beta]), + ); + + expect(resolved.root.name, 'root'); + expect(resolved.root.children, [same(alpha), same(beta)]); + expect(alpha.address, isNot(equals(beta.address))); + expect( + alpha.signals.single.address, + isNot(equals(beta.signals.single.address)), + ); + expect( + resolved.hierarchyService.pathnameToAddress( + alpha.signals.single.path(), + ), + alpha.signals.single.address, + ); + expect( + resolved.hierarchyService.pathnameToAddress(beta.signals.single.path()), + beta.signals.single.address, + ); + }); + + test('rejects a waveform without module scopes', () { + expect( + () => resolveModuleStructure( + ModuleStructure(metadata: MetaData.empty(), modules: const []), + ), + throwsStateError, + ); + }); + }); +} diff --git a/packages/rohd_waveform/test/signal_waveform_test.dart b/packages/rohd_waveform/test/signal_waveform_test.dart index b52b788995..358e4210e3 100644 --- a/packages/rohd_waveform/test/signal_waveform_test.dart +++ b/packages/rohd_waveform/test/signal_waveform_test.dart @@ -45,7 +45,7 @@ void main() { { 'name': 'exponent', 'width': 5, - 'bits': [8, 9, 10, 11, 12], + 'bits': [8, 9, 10, 11, 12] }, ], }, @@ -70,16 +70,6 @@ void main() { wf.clearData(); expect(wf.isEmpty, isTrue); }); - - test('computed state is set when constructing or copying a waveform', () { - final computed = SignalWaveform.empty('s', isComputed: true); - final preserved = SignalWaveform.copyFrom(computed); - final overridden = SignalWaveform.copyFrom(computed, isComputed: false); - - expect(computed.isComputed, isTrue); - expect(preserved.isComputed, isTrue); - expect(overridden.isComputed, isFalse); - }); }); group('SignalWaveform.appendData', () { @@ -99,14 +89,11 @@ void main() { }); group('SignalWaveform.getValueByTime (binary search)', () { - final wf = SignalWaveform( - signalId: 's', - data: [ - Data(time: 0, value: '0'), - Data(time: 10, value: '1'), - Data(time: 20, value: '0'), - ], - ); + final wf = SignalWaveform(signalId: 's', data: [ + Data(time: 0, value: '0'), + Data(time: 10, value: '1'), + Data(time: 20, value: '0'), + ]); test('returns the value at or before a time', () { expect(wf.getValueByTime(0), '0'); @@ -126,15 +113,12 @@ void main() { }); group('SignalWaveform navigation indices', () { - final wf = SignalWaveform( - signalId: 's', - data: [ - Data(time: 0, value: '0'), - Data(time: 10, value: '1'), - Data(time: 10, value: '1'), - Data(time: 20, value: '0'), - ], - ); + final wf = SignalWaveform(signalId: 's', data: [ + Data(time: 0, value: '0'), + Data(time: 10, value: '1'), + Data(time: 10, value: '1'), + Data(time: 20, value: '0'), + ]); test('getNextDataPointIndex skips duplicates at current time', () { expect(wf.getNextDataPointIndex(0), 1); @@ -147,23 +131,11 @@ void main() { expect(wf.getPreviousDataPointIndex(10), 0); expect(wf.getPreviousDataPointIndex(0), -1); }); - }); - group('SignalWaveform matching navigation', () { - final wf = SignalWaveform( - signalId: 's', - data: [ - Data(time: 0, value: '0'), - Data(time: 10, value: '1'), - Data(time: 20, value: '0'), - Data(time: 30, value: "1'b1"), - ], - ); - - test('finds values and edges in both directions', () { + test('finds matching values and edges', () { expect( wf.getNextMatchingDataPointIndex( - 0, + -1, criterion: WaveformSearchCriterion.risingEdge, ), 1, @@ -173,13 +145,13 @@ void main() { 10, criterion: WaveformSearchCriterion.fallingEdge, ), - 2, + 3, ); expect( wf.getPreviousMatchingDataPointIndex( - 31, + 20, criterion: WaveformSearchCriterion.value, - value: '0', + value: '1', ), 2, ); @@ -191,46 +163,41 @@ void main() { final original = SignalWaveform( signalId: 's', data: [Data(time: 0, value: '0')], - monitorGroup: 'inputs', - valueFormat: MonitorValueFormat.hexadecimal, + overrideName: 'signal', + overrideWidth: 4, ); final copy = SignalWaveform.copyFrom(original); expect(copy.signalId, 's'); - expect(copy.monitorId, isNot(original.monitorId)); - expect(copy.monitorGroup, 'inputs'); - expect(copy.valueFormat, MonitorValueFormat.hexadecimal); + expect(copy.overrideName, 'signal'); + expect(copy.overrideWidth, 4); copy.appendData([Data(time: 5, value: '1')]); expect(original.length, 1, reason: 'copy must not mutate the original'); expect(copy.length, 2); }); - test('supports explicit monitor identity and display name', () { - final original = SignalWaveform(signalId: 's'); - final copy = SignalWaveform.copyFrom(original, monitorId: 's-copy'); - final monitored = MonitoredSignal.fromWaveform( - copy, - displayName: 'Status', - ); - - expect(copy.monitorId, 's-copy'); - expect(monitored.monitorId, 's-copy'); - expect(monitored.name, 'Status'); - }); - test('round-trips through JSON', () { - final wf = SignalWaveform( - signalId: 'sig', - data: [ - Data(time: 0, value: '0'), - Data(time: 4, value: '1'), - ], - ); + final wf = SignalWaveform(signalId: 'sig', data: [ + Data(time: 0, value: '0'), + Data(time: 4, value: '1'), + ]); final restored = SignalWaveform.fromJson(wf.toJson()); expect(restored.signalId, 'sig'); expect(restored.length, 2); expect(restored.getValueByTime(4), '1'); }); + + test('fromWaveformData accepts a canonical hierarchy path', () { + final waveform = SignalWaveform.fromWaveformData( + WaveformData( + signalId: 'backend.signal', + data: [Data(time: 0, value: '1')], + ), + signalId: 'top/signal', + ); + + expect(waveform.signalId, 'top/signal'); + }); }); group('WaveformData', () { @@ -243,13 +210,10 @@ void main() { }); test('reports start/end times from its samples', () { - final wd = WaveformData( - signalId: 's', - data: [ - Data(time: 3, value: '0'), - Data(time: 9, value: '1'), - ], - ); + final wd = WaveformData(signalId: 's', data: [ + Data(time: 3, value: '0'), + Data(time: 9, value: '1'), + ]); expect(wd.startTime, 3); expect(wd.endTime, 9); expect(wd.isNotEmpty, isTrue); @@ -272,8 +236,8 @@ void main() { data: [Data(time: 0, value: '0')], isComputed: true, ); - final wf = SignalWaveform.fromWaveformData(wd, signalId: 'top/s'); - expect(wf.signalId, 'top/s'); + final wf = SignalWaveform.fromWaveformData(wd); + expect(wf.signalId, 's'); expect(wf.length, 1); expect(wf.isComputed, isTrue); }); diff --git a/packages/rohd_waveform/test/waveform_repository_test.dart b/packages/rohd_waveform/test/waveform_repository_test.dart index fe21f7e67a..4201a6bbca 100644 --- a/packages/rohd_waveform/test/waveform_repository_test.dart +++ b/packages/rohd_waveform/test/waveform_repository_test.dart @@ -312,21 +312,26 @@ void main() { expect(synthesized.single.data, isEmpty); }); - test('synthesizes bit slices from hexadecimal, binary, and unknown values', - () async { - api.responses['top/bus'] = [ - Data(time: 0, value: '0x9'), - Data(time: 1, value: '1010'), - Data(time: 2, value: 'zzzz'), - Data(time: 3, value: 'not-a-value'), - ]; - - final synthesized = await repository.getWaveformData( - signalIds: ['top/bus#b[0]'], - ); - - expect(synthesized.single.data.map((d) => d.value), ['1', '0', 'x']); - }); + test( + 'synthesizes bit slices from hexadecimal, binary, and unknown values', + () async { + api.responses['top/bus'] = [ + Data(time: 0, value: '0x9'), + Data(time: 1, value: '1010'), + Data(time: 2, value: 'zzzz'), + Data(time: 3, value: 'not-a-value'), + ]; + + final synthesized = await repository.getWaveformData( + signalIds: ['top/bus#b[0]'], + ); + + expect( + synthesized.single.data.map((d) => d.value), + ['1', '0', 'z', 'x'], + ); + }, + ); test('synthesizes nested struct field waveform data', () async { bus.logicType = { diff --git a/rohd_devtools_extension/README.md b/rohd_devtools_extension/README.md index 3543624293..6db62d3189 100644 --- a/rohd_devtools_extension/README.md +++ b/rohd_devtools_extension/README.md @@ -93,11 +93,10 @@ CLI architecture is a generic command host whose connectivity, waveform, and future providers register their capabilities rather than expose separate tool-specific executables. -The older `rohd-wave` implementation in [`bin/rohd_wave.dart`](bin/rohd_wave.dart) -is a waveform-specific prototype, not the DevTools CLI and not a supported -packaged executable. Its waveform commands have not yet moved into the generic -command host. Do not use `make cli-build` or publish -`build/cli/rohd-wave` as the DevTools command-line interface. +The older `rohd-wave` implementation was a waveform-specific prototype, not +the DevTools CLI and not a supported packaged executable. Its waveform commands +have not yet moved into the generic command host. Do not use `make cli-build` +or publish `build/cli/rohd-wave` as the DevTools command-line interface. ### Handle Queries diff --git a/rohd_devtools_extension/tool/test_devtools_install.dart b/rohd_devtools_extension/tool/test_devtools_install.dart index c1a1d1189d..26734b99c0 100644 --- a/rohd_devtools_extension/tool/test_devtools_install.dart +++ b/rohd_devtools_extension/tool/test_devtools_install.dart @@ -9,6 +9,7 @@ // Author: Desmond Kirkpatrick import 'dart:io'; +import 'dart:convert'; import 'package:devtools_shared/devtools_extensions_io.dart'; import 'package:path/path.dart' as p; @@ -206,6 +207,28 @@ Future _writeProjectRootPointingTo(Directory packageRoot) async { final projectRoot = await Directory.systemTemp.createTemp( 'rohd_devtools_extension_discovery_', ); + final pubspec = File(p.join(projectRoot.path, 'pubspec.yaml')); + await pubspec.writeAsString(''' +name: rohd_devtools_extension_discovery +environment: + sdk: ^3.6.0 +dependencies: + rohd: + path: ${jsonEncode(packageRoot.path)} +'''); + + final result = await Process.run( + Platform.resolvedExecutable, + ['pub', 'get'], + workingDirectory: projectRoot.path, + ); + if (result.exitCode != 0) { + _fail( + 'Failed to resolve the temporary DevTools discovery project.\n' + '${result.stderr}', + ); + } + return projectRoot; } diff --git a/test/waveform_service_test.dart b/test/waveform_service_test.dart index d5bc090fe2..2263fc164e 100644 --- a/test/waveform_service_test.dart +++ b/test/waveform_service_test.dart @@ -129,6 +129,7 @@ void createTemporaryDump(Module module, String name) { module, outputDirectory: tempDumpDir, outputBaseName: 'temp_dump_$name', + writeToFile: true, ); } diff --git a/tool/test/devtools_install_test.sh b/tool/test/devtools_install_test.sh index 855353136d..f33af7b2e9 100644 --- a/tool/test/devtools_install_test.sh +++ b/tool/test/devtools_install_test.sh @@ -24,9 +24,14 @@ readonly EXTENSION_DIR="$PACKAGE_ROOT/extension/devtools" trap 'rm -rf "$FIXTURE"' EXIT mkdir -p "$EXTENSION_DIR/build/assets" "$EXTENSION_DIR/build/canvaskit" +cat > "$PACKAGE_ROOT/pubspec.yaml" <<'EOF' +name: rohd +environment: + sdk: ^3.6.0 +EOF cp "$REPO_ROOT/extension/devtools/config.yaml" "$EXTENSION_DIR/config.yaml" for asset in index.html flutter_bootstrap.js flutter.js main.dart.js version.json \ - assets/AssetManifest.bin.json assets/FontManifest.json canvaskit/canvaskit.js canvaskit/canvaskit.wasm; do + assets/AssetManifest.bin assets/FontManifest.json canvaskit/canvaskit.js canvaskit/canvaskit.wasm; do touch "$EXTENSION_DIR/build/$asset" done From 0e9251755079e72c1be32b8e3c777ae85ee5e927 Mon Sep 17 00:00:00 2001 From: "Desmond A. Kirkpatrick" Date: Tue, 13 Oct 2026 06:51:28 -0700 Subject: [PATCH 05/26] make CI use local overrides instead of testing against hosted --- .github/workflows/general.yml | 6 +++ .gitignore | 2 +- .../chapter_9/rohd_vf_example/pubspec.yaml | 6 --- packages/rohd_devtools_widgets/pubspec.yaml | 4 -- pubspec.yaml | 4 -- tool/gh_actions/install_dependencies.sh | 1 + tool/gh_actions/pana_source.sh | 10 +++-- .../write_local_package_overrides.sh | 40 +++++++++++++++++++ tool/test/pana_source_test.sh | 13 ++++-- 9 files changed, 64 insertions(+), 22 deletions(-) create mode 100644 tool/gh_actions/write_local_package_overrides.sh diff --git a/.github/workflows/general.yml b/.github/workflows/general.yml index 0c33314d7b..690f2698f9 100644 --- a/.github/workflows/general.yml +++ b/.github/workflows/general.yml @@ -167,6 +167,9 @@ jobs: channel: stable version: 3.44.0 + - name: Configure local package overrides + run: bash tool/gh_actions/write_local_package_overrides.sh + - name: Install root Dart dependencies run: dart pub get @@ -224,6 +227,9 @@ jobs: channel: stable version: 3.44.0 + - name: Configure local package overrides + run: bash ../../tool/gh_actions/write_local_package_overrides.sh + - name: Install package dependencies run: ${{ matrix.sdk }} pub get diff --git a/.gitignore b/.gitignore index 89e0790b15..c125e64fbe 100644 --- a/.gitignore +++ b/.gitignore @@ -20,7 +20,7 @@ coverage/ *_fsm.md .vscode/* ./devtools_options.yaml -/packages/rohd_devtools_widgets/pubspec_overrides.yaml +pubspec_overrides.yaml # Exceptions !.vscode/extensions.json diff --git a/doc/tutorials/chapter_9/rohd_vf_example/pubspec.yaml b/doc/tutorials/chapter_9/rohd_vf_example/pubspec.yaml index b734d9d38a..8142036d70 100644 --- a/doc/tutorials/chapter_9/rohd_vf_example/pubspec.yaml +++ b/doc/tutorials/chapter_9/rohd_vf_example/pubspec.yaml @@ -12,12 +12,6 @@ dependencies: rohd_vf: ^0.6.0 logging: ^1.0.1 -dependency_overrides: - rohd: - path: ../../../../ - rohd_hierarchy: - path: ../../../../packages/rohd_hierarchy - dev_dependencies: lints: ^2.0.0 test: ^1.21.0 diff --git a/packages/rohd_devtools_widgets/pubspec.yaml b/packages/rohd_devtools_widgets/pubspec.yaml index ce960dd61f..1132b7e0f5 100644 --- a/packages/rohd_devtools_widgets/pubspec.yaml +++ b/packages/rohd_devtools_widgets/pubspec.yaml @@ -15,10 +15,6 @@ dependencies: rohd_hierarchy: ^0.2.0 web: ^1.0.0 -dependency_overrides: - rohd_hierarchy: - path: ../rohd_hierarchy - dev_dependencies: flutter_test: {sdk: flutter} lints: ^5.0.0 diff --git a/pubspec.yaml b/pubspec.yaml index d10ccc4bb3..018ec38246 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,10 +18,6 @@ dependencies: test: ^1.17.3 yaml: ^3.1.1 -dependency_overrides: - rohd_hierarchy: - path: packages/rohd_hierarchy - dev_dependencies: benchmark_harness: ^2.2.0 coverage: ^1.10.0 diff --git a/tool/gh_actions/install_dependencies.sh b/tool/gh_actions/install_dependencies.sh index f26bb8fc91..a73536b19e 100755 --- a/tool/gh_actions/install_dependencies.sh +++ b/tool/gh_actions/install_dependencies.sh @@ -11,5 +11,6 @@ set -euo pipefail +bash tool/gh_actions/write_local_package_overrides.sh dart pub get dart pub get --directory=doc/tutorials/chapter_9/rohd_vf_example diff --git a/tool/gh_actions/pana_source.sh b/tool/gh_actions/pana_source.sh index 989a27ab01..27612c77ac 100755 --- a/tool/gh_actions/pana_source.sh +++ b/tool/gh_actions/pana_source.sh @@ -74,11 +74,15 @@ copy_package() { } copy_package "$package_dir" "$temp_dir/package" -if grep -A 1 -E '^[[:space:]]*rohd_hierarchy:[[:space:]]*$' \ - "$package_dir/pubspec.yaml" | - grep -Eq '^[[:space:]]*path:[[:space:]]*\.\./rohd_hierarchy[[:space:]]*$'; then +if grep -Eq '^[[:space:]]*rohd_hierarchy:' "$package_dir/pubspec.yaml" && + [[ -f "$package_dir/../rohd_hierarchy/pubspec.yaml" ]]; then hierarchy_dir="$(cd "$package_dir/../rohd_hierarchy" && pwd)" copy_package "$hierarchy_dir" "$temp_dir/rohd_hierarchy" + cat > "$temp_dir/package/pubspec_overrides.yaml" <<'EOF' +dependency_overrides: + rohd_hierarchy: + path: ../rohd_hierarchy +EOF uses_local_hierarchy=true fi cd "$temp_dir/package" diff --git a/tool/gh_actions/write_local_package_overrides.sh b/tool/gh_actions/write_local_package_overrides.sh new file mode 100644 index 0000000000..1996ae56cd --- /dev/null +++ b/tool/gh_actions/write_local_package_overrides.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# Copyright (C) 2026 Intel Corporation +# SPDX-License-Identifier: BSD-3-Clause +# +# write_local_package_overrides.sh +# Creates ignored local overrides for unpublished monorepo package versions. + +set -euo pipefail + +readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +readonly REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" + +write_override() { + local file="$1" + local contents="$2" + if [[ -e "$file" ]]; then + return + fi + printf '%s\n' "$contents" > "$file" +} + +write_override "$REPO_ROOT/pubspec_overrides.yaml" \ +'dependency_overrides: + rohd_hierarchy: + path: packages/rohd_hierarchy' + +write_override \ + "$REPO_ROOT/doc/tutorials/chapter_9/rohd_vf_example/pubspec_overrides.yaml" \ +'dependency_overrides: + rohd: + path: ../../../../ + rohd_hierarchy: + path: ../../../../packages/rohd_hierarchy' + +write_override \ + "$REPO_ROOT/packages/rohd_devtools_widgets/pubspec_overrides.yaml" \ +'dependency_overrides: + rohd_hierarchy: + path: ../rohd_hierarchy' diff --git a/tool/test/pana_source_test.sh b/tool/test/pana_source_test.sh index f685963ff1..91a358f877 100644 --- a/tool/test/pana_source_test.sh +++ b/tool/test/pana_source_test.sh @@ -20,7 +20,7 @@ export FLUTTER_ROOT="$FIXTURE/flutter sdk" PANA_ANALYSIS_INCLUDES=1 mkdir -p "$SOURCE/lib" "$SOURCE/.dart_tool" "$SOURCE/example" \ "$FIXTURE/bin" "$PUB_CACHE/bin" "$TMPDIR" "$FLUTTER_ROOT/bin" -for executable in bash cmp dirname grep mkdir mktemp readlink rm tar; do +for executable in bash cat cmp dirname grep mkdir mktemp readlink rm tar; do ln -s "$(command -v "$executable")" "$FIXTURE/bin/$executable" done printf 'name: fixture\n' > "$SOURCE/pubspec.yaml" @@ -44,13 +44,18 @@ set -euo pipefail printf '%s|%s\n' "${0##*/}" "$*" >> "$SDK_LOG" case "$*" in 'pub get') - for file in pubspec.lock pubspec_overrides.yaml analysis_options.yaml \ - .dart_tool example/pubspec.lock example/pubspec_overrides.yaml; do + for file in pubspec.lock analysis_options.yaml .dart_tool \ + example/pubspec.lock example/pubspec_overrides.yaml; do [[ ! -e "$file" ]] done + if grep -q 'rohd_hierarchy:' pubspec.yaml; then + [[ "$(cat pubspec_overrides.yaml)" == $'dependency_overrides:\n rohd_hierarchy:\n path: ../rohd_hierarchy' ]] + else + [[ ! -e pubspec_overrides.yaml ]] + fi cmp pubspec.yaml "$SOURCE/pubspec.yaml" cmp lib/fixture.dart "$SOURCE/lib/fixture.dart" - if grep -q 'path: ../rohd_hierarchy' pubspec.yaml; then + if grep -q 'rohd_hierarchy:' pubspec.yaml; then [[ -f ../rohd_hierarchy/pubspec.yaml ]] fi printf 'hosted resolution\n' > pubspec.lock ;; From eb8b08bccadebab8f56dfa80ae1d0d361620fc33 Mon Sep 17 00:00:00 2001 From: "Desmond A. Kirkpatrick" Date: Tue, 13 Oct 2026 07:22:31 -0700 Subject: [PATCH 06/26] CI challenges with local package updates --- packages/rohd_waveform/pubspec_overrides.yaml | 2 +- tool/gh_actions/write_local_package_overrides.sh | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/rohd_waveform/pubspec_overrides.yaml b/packages/rohd_waveform/pubspec_overrides.yaml index 45fa10cedc..dc8478f13b 100644 --- a/packages/rohd_waveform/pubspec_overrides.yaml +++ b/packages/rohd_waveform/pubspec_overrides.yaml @@ -1,3 +1,3 @@ dependency_overrides: rohd_hierarchy: - path: /home/desmond/rohd.worktrees/no-logic-array-07-devtools-debugger/packages/rohd_hierarchy + path: ../rohd_hierarchy diff --git a/tool/gh_actions/write_local_package_overrides.sh b/tool/gh_actions/write_local_package_overrides.sh index 1996ae56cd..7717488eed 100644 --- a/tool/gh_actions/write_local_package_overrides.sh +++ b/tool/gh_actions/write_local_package_overrides.sh @@ -38,3 +38,9 @@ write_override \ 'dependency_overrides: rohd_hierarchy: path: ../rohd_hierarchy' + +write_override \ + "$REPO_ROOT/packages/rohd_waveform/pubspec_overrides.yaml" \ +'dependency_overrides: + rohd_hierarchy: + path: ../rohd_hierarchy' From f5e952cf0deb4313260c96405ebbad92c0315b26 Mon Sep 17 00:00:00 2001 From: "Desmond A. Kirkpatrick" Date: Tue, 13 Oct 2026 07:24:07 -0700 Subject: [PATCH 07/26] remove an override file --- packages/rohd_waveform/pubspec_overrides.yaml | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 packages/rohd_waveform/pubspec_overrides.yaml diff --git a/packages/rohd_waveform/pubspec_overrides.yaml b/packages/rohd_waveform/pubspec_overrides.yaml deleted file mode 100644 index dc8478f13b..0000000000 --- a/packages/rohd_waveform/pubspec_overrides.yaml +++ /dev/null @@ -1,3 +0,0 @@ -dependency_overrides: - rohd_hierarchy: - path: ../rohd_hierarchy From 0b8a1328f74f0e48b673894ebe5ddd2864952a4c Mon Sep 17 00:00:00 2001 From: "Desmond A. Kirkpatrick" Date: Tue, 13 Oct 2026 08:03:41 -0700 Subject: [PATCH 08/26] working more on CI with local paths, this time with devtools itself --- .../test/netlist_const_extractor_test.dart | 6 ++++-- .../tool/gh_actions/build_app.sh | 2 ++ tool/gh_actions/devtool/install_devtools.sh | 2 ++ tool/gh_actions/devtool/run_devtool_test.sh | 1 + tool/gh_actions/write_local_package_overrides.sh | 15 +++++++++++++++ 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/rohd_devtools_extension/test/netlist_const_extractor_test.dart b/rohd_devtools_extension/test/netlist_const_extractor_test.dart index 9a9a719670..9eb1b66f91 100644 --- a/rohd_devtools_extension/test/netlist_const_extractor_test.dart +++ b/rohd_devtools_extension/test/netlist_const_extractor_test.dart @@ -7,14 +7,16 @@ // 2026 April // Author: Desmond Kirkpatrick +@TestOn('vm') +library; + import 'dart:convert'; import 'package:flutter_test/flutter_test.dart'; +import 'package:rohd/examples.dart'; import 'package:rohd/rohd.dart'; import 'package:rohd_devtools_extension/rohd_devtools/services/netlist_const_extractor.dart'; -import '../../example/filter_bank/filter_bank_modules.dart'; - void main() { tearDown(() async { await Simulator.reset(); diff --git a/rohd_devtools_extension/tool/gh_actions/build_app.sh b/rohd_devtools_extension/tool/gh_actions/build_app.sh index d9037df068..59d459fbf7 100755 --- a/rohd_devtools_extension/tool/gh_actions/build_app.sh +++ b/rohd_devtools_extension/tool/gh_actions/build_app.sh @@ -34,6 +34,8 @@ fi cd "$repo_root" +bash ../tool/gh_actions/write_local_package_overrides.sh + make web-release \ FLUTTER_WEB_BUILD_ARGS="--pwa-strategy=none --base-href=$base_href" diff --git a/tool/gh_actions/devtool/install_devtools.sh b/tool/gh_actions/devtool/install_devtools.sh index 6174a7c53a..254201c453 100755 --- a/tool/gh_actions/devtool/install_devtools.sh +++ b/tool/gh_actions/devtool/install_devtools.sh @@ -17,6 +17,8 @@ set -euo pipefail DEST="../extension/devtools" +bash tool/gh_actions/write_local_package_overrides.sh + # ═══════════════════════════════════════════════════════════════════════ # Build starts here # ═══════════════════════════════════════════════════════════════════════ diff --git a/tool/gh_actions/devtool/run_devtool_test.sh b/tool/gh_actions/devtool/run_devtool_test.sh index bb41e5477f..e9076f627a 100755 --- a/tool/gh_actions/devtool/run_devtool_test.sh +++ b/tool/gh_actions/devtool/run_devtool_test.sh @@ -11,6 +11,7 @@ set -euo pipefail +bash tool/gh_actions/write_local_package_overrides.sh cd rohd_devtools_extension flutter pub get diff --git a/tool/gh_actions/write_local_package_overrides.sh b/tool/gh_actions/write_local_package_overrides.sh index 7717488eed..863c7fa270 100644 --- a/tool/gh_actions/write_local_package_overrides.sh +++ b/tool/gh_actions/write_local_package_overrides.sh @@ -33,6 +33,21 @@ write_override \ rohd_hierarchy: path: ../../../../packages/rohd_hierarchy' +write_override \ + "$REPO_ROOT/rohd_devtools_extension/pubspec_overrides.yaml" \ +'dependency_overrides: + cupertino_ui: ">=1.0.0 <1.1.0" + rohd: + path: .. + rohd_hierarchy: + path: ../packages/rohd_hierarchy + rohd_waveform: + path: ../packages/rohd_waveform + rohd_devtools_widgets: + path: ../packages/rohd_devtools_widgets + rohd_source_navigator: + path: ../packages/rohd_source_navigator' + write_override \ "$REPO_ROOT/packages/rohd_devtools_widgets/pubspec_overrides.yaml" \ 'dependency_overrides: From 5f8fb1d8c7b83e35ad03997b71b512bca2fafd3d Mon Sep 17 00:00:00 2001 From: "Desmond A. Kirkpatrick" Date: Tue, 13 Oct 2026 12:44:48 -0700 Subject: [PATCH 09/26] fix CI failures --- rohd_devtools_extension/test/const_eval_test.dart | 3 +++ rohd_devtools_extension/test/enable_diag_test.dart | 3 +++ rohd_devtools_extension/test/loopback_miter_test.dart | 3 +++ rohd_devtools_extension/test/miter_test.dart | 3 +++ .../test/modules/tree_structure/tree_structure_page_test.dart | 3 +++ rohd_devtools_extension/test/ui/devtool_appbar_test.dart | 3 +++ rohd_devtools_extension/test/view/rohd_devtools_page_test.dart | 3 +++ tool/gh_actions/devtool/run_devtool_test.sh | 2 +- 8 files changed, 22 insertions(+), 1 deletion(-) diff --git a/rohd_devtools_extension/test/const_eval_test.dart b/rohd_devtools_extension/test/const_eval_test.dart index f0841e0ed9..95dc253a38 100755 --- a/rohd_devtools_extension/test/const_eval_test.dart +++ b/rohd_devtools_extension/test/const_eval_test.dart @@ -8,6 +8,9 @@ // 2026 April // Author: Desmond Kirkpatrick +@TestOn('vm') +library; + import 'dart:convert'; import 'dart:io'; diff --git a/rohd_devtools_extension/test/enable_diag_test.dart b/rohd_devtools_extension/test/enable_diag_test.dart index fdbf101432..c6c41d507e 100755 --- a/rohd_devtools_extension/test/enable_diag_test.dart +++ b/rohd_devtools_extension/test/enable_diag_test.dart @@ -7,6 +7,9 @@ // 2026 April // Author: Desmond Kirkpatrick +@TestOn('vm') +library; + import 'package:flutter_test/flutter_test.dart'; import 'package:rohd/rohd.dart' show WaveformDataService; import 'package:rohd_devtools_extension/rohd_devtools/examples/rohd_examples.dart'; diff --git a/rohd_devtools_extension/test/loopback_miter_test.dart b/rohd_devtools_extension/test/loopback_miter_test.dart index 6ebc0dd652..60d33cdfe8 100755 --- a/rohd_devtools_extension/test/loopback_miter_test.dart +++ b/rohd_devtools_extension/test/loopback_miter_test.dart @@ -13,6 +13,9 @@ // 2026 April // Author: Desmond Kirkpatrick +@TestOn('vm') +library; + import 'dart:convert'; import 'package:flutter_test/flutter_test.dart'; diff --git a/rohd_devtools_extension/test/miter_test.dart b/rohd_devtools_extension/test/miter_test.dart index 49b7d92f4d..ddaa43b835 100755 --- a/rohd_devtools_extension/test/miter_test.dart +++ b/rohd_devtools_extension/test/miter_test.dart @@ -22,6 +22,9 @@ // // Run with: flutter test test/miter_test.dart +@TestOn('vm') +library; + import 'dart:convert'; import 'dart:io'; diff --git a/rohd_devtools_extension/test/modules/tree_structure/tree_structure_page_test.dart b/rohd_devtools_extension/test/modules/tree_structure/tree_structure_page_test.dart index f9865c86be..bba12ea9a7 100644 --- a/rohd_devtools_extension/test/modules/tree_structure/tree_structure_page_test.dart +++ b/rohd_devtools_extension/test/modules/tree_structure/tree_structure_page_test.dart @@ -7,6 +7,9 @@ // 2024 January 9 // Author: Yao Jing Quek +@TestOn('vm') +library; + import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/rohd_devtools_extension/test/ui/devtool_appbar_test.dart b/rohd_devtools_extension/test/ui/devtool_appbar_test.dart index 46ca3b8244..1b0f13717b 100644 --- a/rohd_devtools_extension/test/ui/devtool_appbar_test.dart +++ b/rohd_devtools_extension/test/ui/devtool_appbar_test.dart @@ -7,6 +7,9 @@ // 2026 July // Author: Desmond Kirkpatrick +@TestOn('vm') +library; + import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:material_ui/material_ui.dart'; diff --git a/rohd_devtools_extension/test/view/rohd_devtools_page_test.dart b/rohd_devtools_extension/test/view/rohd_devtools_page_test.dart index 8c7d2e3db4..68aa1bd8f7 100644 --- a/rohd_devtools_extension/test/view/rohd_devtools_page_test.dart +++ b/rohd_devtools_extension/test/view/rohd_devtools_page_test.dart @@ -7,6 +7,9 @@ // 2026 July // Author: Desmond Kirkpatrick +@TestOn('vm') +library; + import 'package:flutter_test/flutter_test.dart'; import 'package:material_ui/material_ui.dart'; import 'package:rohd_devtools_extension/rohd_devtools/rohd_devtools.dart'; diff --git a/tool/gh_actions/devtool/run_devtool_test.sh b/tool/gh_actions/devtool/run_devtool_test.sh index e9076f627a..32d14b890b 100755 --- a/tool/gh_actions/devtool/run_devtool_test.sh +++ b/tool/gh_actions/devtool/run_devtool_test.sh @@ -20,4 +20,4 @@ mapfile -t browser_tests < <( find test -type f -name '*_test.dart' ! -path 'test/debugger/*' | sort ) flutter test --platform chrome "${browser_tests[@]}" -flutter test test/debugger \ No newline at end of file +flutter test test/debugger From 1a4d4cbe0ea549a8e0818d6fb1eb49802d9ab2ae Mon Sep 17 00:00:00 2001 From: "Desmond A. Kirkpatrick" Date: Tue, 13 Oct 2026 13:23:11 -0700 Subject: [PATCH 10/26] need a vcd stored for miter test --- .gitignore | 1 + .pubignore | 1 + .../test/fixtures/filter_bank.vcd | 6925 +++++++++++++++++ tool/gh_actions/pana_source.sh | 10 +- tool/test/pana_source_test.sh | 21 +- 5 files changed, 6954 insertions(+), 4 deletions(-) create mode 100644 rohd_devtools_extension/test/fixtures/filter_bank.vcd diff --git a/.gitignore b/.gitignore index c125e64fbe..564d7633c6 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ pubspec_overrides.yaml # Exceptions !.vscode/extensions.json +!rohd_devtools_extension/test/fixtures/filter_bank.vcd !test/example_icarus_waves.vcd !test/example_verilator_waves.vcd !test/sv_param_passthrough.sv \ No newline at end of file diff --git a/.pubignore b/.pubignore index b1f87101b8..b038705954 100644 --- a/.pubignore +++ b/.pubignore @@ -24,6 +24,7 @@ coverage/ # Exceptions !.vscode/extensions.json +!rohd_devtools_extension/test/fixtures/filter_bank.vcd !test/example_icarus_waves.vcd !test/example_verilator_waves.vcd !test/sv_param_passthrough.sv diff --git a/rohd_devtools_extension/test/fixtures/filter_bank.vcd b/rohd_devtools_extension/test/fixtures/filter_bank.vcd new file mode 100644 index 0000000000..d251879568 --- /dev/null +++ b/rohd_devtools_extension/test/fixtures/filter_bank.vcd @@ -0,0 +1,6925 @@ +$date + 2026-03-29 20:11:20.797 -07:00 +$end +$version + ROHD v0.6.6 +$end +$comment + Generated by ROHD - www.github.com/intel/rohd +$end +$timescale 1ps $end +$scope module FilterBank $end + $var wire 1 s0 clk $end + $var wire 1 s1 reset $end + $var wire 1 s2 start $end + $var wire 16 s3 sampleIn0 $end + $var wire 16 s4 sampleIn1 $end + $var wire 1 s5 validIn $end + $var wire 1 s6 inputDone $end + $var wire 16 s7 out0 $end + $var wire 16 s8 out1 $end + $var wire 1 s9 validOut $end + $var wire 1 s10 done $end + $var wire 3 s11 state $end + $var wire 16 s12 out0_0 $end + $var wire 16 s13 sample0_data $end + $var wire 16 s14 sample0_data_0 $end + $var wire 18 s15 sample0 $end + $var wire 1 s16 sample0_valid $end + $var wire 1 s17 sample0_valid_0 $end + $var wire 1 s18 sample0_channel $end + $var wire 16 s19 out1_0 $end + $var wire 1 s20 validOut_0 $end + $var wire 16 s21 sample1_data $end + $var wire 16 s22 sample1_data_0 $end + $var wire 18 s23 sample1 $end + $var wire 1 s24 sample1_valid $end + $var wire 1 s25 sample1_valid_0 $end + $var wire 1 s26 sample1_channel $end + $var wire 16 s27 coefficients1[0] $end + $var wire 48 s28 coefficients1 $end + $var wire 16 s29 coefficients1[1] $end + $var wire 16 s30 coefficients1[2] $end + $var wire 16 s31 coefficients0[0] $end + $var wire 48 s32 coefficients0 $end + $var wire 16 s33 coefficients0[1] $end + $var wire 16 s34 coefficients0[2] $end + $var wire 1 s35 validOut_1 $end + $scope module ch0 $end + $var wire 16 s36 sampleIn $end + $var wire 1 s37 validIn $end + $var wire 1 s38 clk $end + $var wire 1 s39 reset $end + $var wire 1 s40 enable $end + $var wire 48 s41 coefficients $end + $var wire 16 s42 dataOut $end + $var wire 1 s43 validOut $end + $var wire 16 s44 dataOut_0 $end + $var wire 1 s45 validPipe $end + $var wire 1 s46 validMuxed $end + $var wire 1 s47 validStage1 $end + $var wire 1 s48 validIn_0 $end + $var wire 1 s49 shiftEn $end + $var wire 16 s50 nextTap0 $end + $var wire 16 s51 delayTap0 $end + $var wire 16 s52 nextTap1 $end + $var wire 16 s53 delayTap1 $end + $var wire 16 s54 nextTap2 $end + $var wire 16 s55 delayTap2 $end + $var wire 16 s56 sampleIn_0 $end + $var wire 1 s57 validOut_0 $end + $var wire 2 s58 tapIndex $end + $scope module flipflop $end + $var wire 1 s102 _clk $end + $var wire 1 s103 _d $end + $var wire 1 s104 _reset $end + $var wire 1 s105 _q $end + $scope module sequential $end + $var wire 1 s510 _in0__reset $end + $var wire 1 s511 _in1_const_1_h0 $end + $var wire 1 s512 _in2_const_1 $end + $var wire 1 s513 _in3__d $end + $var wire 1 s514 _trigger0__clk $end + $var wire 1 s515 _out4__q $end + $upscope $end + $upscope $end + $scope module flipflop_0 $end + $var wire 1 s106 _clk $end + $var wire 1 s107 _d $end + $var wire 1 s108 _reset $end + $var wire 1 s109 _q $end + $scope module sequential $end + $var wire 1 s516 _in0__reset $end + $var wire 1 s517 _in1_const_1_h0 $end + $var wire 1 s518 _in2_const_1 $end + $var wire 1 s519 _in3__d $end + $var wire 1 s520 _trigger0__clk $end + $var wire 1 s521 _out4__q $end + $upscope $end + $upscope $end + $scope module flipflop_1 $end + $var wire 1 s110 _clk $end + $var wire 16 s111 _d $end + $var wire 1 s112 _reset $end + $var wire 16 s113 _q $end + $scope module sequential $end + $var wire 1 s522 _in0__reset $end + $var wire 16 s523 _in1_const_16_h0 $end + $var wire 1 s524 _in2_const_1 $end + $var wire 16 s525 _in3__d $end + $var wire 1 s526 _trigger0__clk $end + $var wire 16 s527 _out4__q $end + $upscope $end + $upscope $end + $scope module flipflop_2 $end + $var wire 1 s114 _clk $end + $var wire 16 s115 _d $end + $var wire 1 s116 _reset $end + $var wire 16 s117 _q $end + $scope module sequential $end + $var wire 1 s528 _in0__reset $end + $var wire 16 s529 _in1_const_16_h0 $end + $var wire 1 s530 _in2_const_1 $end + $var wire 16 s531 _in3__d $end + $var wire 1 s532 _trigger0__clk $end + $var wire 16 s533 _out4__q $end + $upscope $end + $upscope $end + $scope module flipflop_3 $end + $var wire 1 s118 _clk $end + $var wire 16 s119 _d $end + $var wire 1 s120 _reset $end + $var wire 16 s121 _q $end + $scope module sequential $end + $var wire 1 s534 _in0__reset $end + $var wire 16 s535 _in1_const_16_h0 $end + $var wire 1 s536 _in2_const_1 $end + $var wire 16 s537 _in3__d $end + $var wire 1 s538 _trigger0__clk $end + $var wire 16 s539 _out4__q $end + $upscope $end + $upscope $end + $scope module macTap2 $end + $var wire 16 s122 sampleIn $end + $var wire 16 s123 coeffIn $end + $var wire 16 s124 accumIn $end + $var wire 1 s125 clk $end + $var wire 1 s126 reset $end + $var wire 1 s127 enable $end + $var wire 16 s128 result $end + $var wire 16 s129 sampleIn_stage2 $end + $var wire 16 s130 sampleIn_stage2_o $end + $var wire 16 s131 sampleIn_stage2_0 $end + $var wire 16 s132 sampleIn_stage2_i $end + $var wire 16 s133 sampleIn_stage0_o $end + $var wire 16 s134 sampleIn_stage0 $end + $var wire 16 s135 sampleIn_stage0_0 $end + $var wire 16 s136 sampleIn_stage0_i $end + $var wire 16 s137 coeffIn_stage0_i $end + $var wire 16 s138 accumIn_stage0_i $end + $var wire 16 s139 sampleIn_stage0_1 $end + $var wire 16 s140 sampleIn_stage0_2 $end + $var wire 16 s141 coeffIn_stage0 $end + $var wire 16 s142 coeffIn_stage0_0 $end + $var wire 16 s143 coeffIn_stage0_1 $end + $var wire 16 s144 coeffIn_stage0_o $end + $var wire 16 s145 coeffIn_stage1_i $end + $var wire 16 s146 sampleIn_stage1 $end + $var wire 16 s147 sampleIn_stage1_0 $end + $var wire 16 s148 accumIn_stage1 $end + $var wire 16 s149 accumIn_stage1_0 $end + $var wire 16 s150 accumIn_stage1_1 $end + $var wire 16 s151 accumIn_stage1_o $end + $var wire 16 s152 accumIn_stage1_i $end + $var wire 16 s153 accumIn_stage2_i $end + $var wire 16 s154 accumIn_stage0_o $end + $var wire 16 s155 accumIn_stage0 $end + $var wire 16 s156 accumIn_stage0_0 $end + $var wire 16 s157 coeffIn_stage1 $end + $var wire 16 s158 coeffIn_stage1_0 $end + $var wire 16 s159 coeffIn_stage1_o $end + $var wire 16 s160 sampleIn_stage1_1 $end + $var wire 16 s161 sampleIn_stage1_2 $end + $var wire 16 s162 sampleIn_stage1_o $end + $var wire 16 s163 sampleIn_stage1_i $end + $var wire 16 s164 coeffIn_stage2_i $end + $var wire 16 s165 coeffIn_stage2 $end + $var wire 16 s166 coeffIn_stage2_0 $end + $var wire 16 s167 coeffIn_stage2_o $end + $var wire 16 s168 accumIn_stage2 $end + $var wire 16 s169 accumIn_stage2_0 $end + $var wire 16 s170 accumIn_stage2_o $end + $scope module comb_stage2 $end + $var wire 16 s540 _in0_sampleIn_stage2_i $end + $var wire 16 s541 _in2_coeffIn_stage2_i $end + $var wire 16 s542 _in4_accumIn_stage2_i $end + $var wire 16 s543 _out1_sampleIn_stage2 $end + $var wire 16 s544 _out3_coeffIn_stage2 $end + $var wire 16 s545 _out5_accumIn_stage2 $end + $upscope $end + $scope module ff_sampleIn $end + $var wire 1 s546 _in0_reset $end + $var wire 16 s547 _in1_const_0 $end + $var wire 16 s548 _in2_const_0 $end + $var wire 1 s549 _in3_const_1 $end + $var wire 16 s550 _in4_sampleIn_stage0_o $end + $var wire 16 s551 _in5_sampleIn_stage1_o $end + $var wire 1 s552 _trigger0_clk $end + $var wire 16 s553 _out6_sampleIn_stage1_i $end + $var wire 16 s554 _out7_sampleIn_stage2_i $end + $upscope $end + $scope module comb_stage0 $end + $var wire 16 s555 _in0_sampleIn_stage0_i $end + $var wire 16 s556 _in2_coeffIn_stage0_i $end + $var wire 16 s557 _in4_accumIn_stage0_i $end + $var wire 16 s558 _in6__sampleIn_stage0_multiply_coeffIn_stage0 $end + $var wire 16 s559 _out1_sampleIn_stage0 $end + $var wire 16 s560 _out3_coeffIn_stage0 $end + $var wire 16 s561 _out5_accumIn_stage0 $end + $var wire 16 s562 _out7_sampleIn_stage0 $end + $upscope $end + $scope module ff_coeffIn $end + $var wire 1 s563 _in0_reset $end + $var wire 16 s564 _in1_const_0 $end + $var wire 16 s565 _in2_const_0 $end + $var wire 1 s566 _in3_const_1 $end + $var wire 16 s567 _in4_coeffIn_stage0_o $end + $var wire 16 s568 _in5_coeffIn_stage1_o $end + $var wire 1 s569 _trigger0_clk $end + $var wire 16 s570 _out6_coeffIn_stage1_i $end + $var wire 16 s571 _out7_coeffIn_stage2_i $end + $upscope $end + $scope module comb_stage1 $end + $var wire 16 s572 _in0_sampleIn_stage1_i $end + $var wire 16 s573 _in2_coeffIn_stage1_i $end + $var wire 16 s574 _in4_accumIn_stage1_i $end + $var wire 16 s575 _in6__sampleIn_stage1_add_accumIn_stage1 $end + $var wire 16 s576 _out1_sampleIn_stage1 $end + $var wire 16 s577 _out3_coeffIn_stage1 $end + $var wire 16 s578 _out5_accumIn_stage1 $end + $var wire 16 s579 _out7_sampleIn_stage1 $end + $upscope $end + $scope module add $end + $var wire 16 s580 _in0_sampleIn_stage1 $end + $var wire 16 s581 _in1_accumIn_stage1 $end + $var wire 16 s582 _sampleIn_stage1_add_accumIn_stage1 $end + $var wire 1 s583 _sampleIn_stage1_add_accumIn_stage1_carry $end + $upscope $end + $scope module ff_accumIn $end + $var wire 1 s584 _in0_reset $end + $var wire 16 s585 _in1_const_0 $end + $var wire 16 s586 _in2_const_0 $end + $var wire 1 s587 _in3_const_1 $end + $var wire 16 s588 _in4_accumIn_stage0_o $end + $var wire 16 s589 _in5_accumIn_stage1_o $end + $var wire 1 s590 _trigger0_clk $end + $var wire 16 s591 _out6_accumIn_stage1_i $end + $var wire 16 s592 _out7_accumIn_stage2_i $end + $upscope $end + $upscope $end + $scope module macTap1 $end + $var wire 16 s171 sampleIn $end + $var wire 16 s172 coeffIn $end + $var wire 16 s173 accumIn $end + $var wire 1 s174 clk $end + $var wire 1 s175 reset $end + $var wire 1 s176 enable $end + $var wire 16 s177 result $end + $var wire 16 s178 sampleIn_stage2 $end + $var wire 16 s179 sampleIn_stage2_o $end + $var wire 16 s180 sampleIn_stage2_0 $end + $var wire 16 s181 sampleIn_stage2_i $end + $var wire 16 s182 sampleIn_stage0_o $end + $var wire 16 s183 sampleIn_stage0 $end + $var wire 16 s184 sampleIn_stage0_0 $end + $var wire 16 s185 sampleIn_stage0_i $end + $var wire 16 s186 coeffIn_stage0_i $end + $var wire 16 s187 accumIn_stage0_i $end + $var wire 16 s188 sampleIn_stage0_1 $end + $var wire 16 s189 sampleIn_stage0_2 $end + $var wire 16 s190 coeffIn_stage0 $end + $var wire 16 s191 coeffIn_stage0_0 $end + $var wire 16 s192 coeffIn_stage0_1 $end + $var wire 16 s193 coeffIn_stage0_o $end + $var wire 16 s194 coeffIn_stage1_i $end + $var wire 16 s195 sampleIn_stage1 $end + $var wire 16 s196 sampleIn_stage1_0 $end + $var wire 16 s197 accumIn_stage1 $end + $var wire 16 s198 accumIn_stage1_0 $end + $var wire 16 s199 accumIn_stage1_1 $end + $var wire 16 s200 accumIn_stage1_o $end + $var wire 16 s201 accumIn_stage1_i $end + $var wire 16 s202 accumIn_stage2_i $end + $var wire 16 s203 accumIn_stage0_o $end + $var wire 16 s204 accumIn_stage0 $end + $var wire 16 s205 accumIn_stage0_0 $end + $var wire 16 s206 coeffIn_stage1 $end + $var wire 16 s207 coeffIn_stage1_0 $end + $var wire 16 s208 coeffIn_stage1_o $end + $var wire 16 s209 sampleIn_stage1_1 $end + $var wire 16 s210 sampleIn_stage1_2 $end + $var wire 16 s211 sampleIn_stage1_o $end + $var wire 16 s212 sampleIn_stage1_i $end + $var wire 16 s213 coeffIn_stage2_i $end + $var wire 16 s214 coeffIn_stage2 $end + $var wire 16 s215 coeffIn_stage2_0 $end + $var wire 16 s216 coeffIn_stage2_o $end + $var wire 16 s217 accumIn_stage2 $end + $var wire 16 s218 accumIn_stage2_0 $end + $var wire 16 s219 accumIn_stage2_o $end + $scope module comb_stage2 $end + $var wire 16 s593 _in0_sampleIn_stage2_i $end + $var wire 16 s594 _in2_coeffIn_stage2_i $end + $var wire 16 s595 _in4_accumIn_stage2_i $end + $var wire 16 s596 _out1_sampleIn_stage2 $end + $var wire 16 s597 _out3_coeffIn_stage2 $end + $var wire 16 s598 _out5_accumIn_stage2 $end + $upscope $end + $scope module ff_sampleIn $end + $var wire 1 s599 _in0_reset $end + $var wire 16 s600 _in1_const_0 $end + $var wire 16 s601 _in2_const_0 $end + $var wire 1 s602 _in3_const_1 $end + $var wire 16 s603 _in4_sampleIn_stage0_o $end + $var wire 16 s604 _in5_sampleIn_stage1_o $end + $var wire 1 s605 _trigger0_clk $end + $var wire 16 s606 _out6_sampleIn_stage1_i $end + $var wire 16 s607 _out7_sampleIn_stage2_i $end + $upscope $end + $scope module comb_stage0 $end + $var wire 16 s608 _in0_sampleIn_stage0_i $end + $var wire 16 s609 _in2_coeffIn_stage0_i $end + $var wire 16 s610 _in4_accumIn_stage0_i $end + $var wire 16 s611 _in6__sampleIn_stage0_multiply_coeffIn_stage0 $end + $var wire 16 s612 _out1_sampleIn_stage0 $end + $var wire 16 s613 _out3_coeffIn_stage0 $end + $var wire 16 s614 _out5_accumIn_stage0 $end + $var wire 16 s615 _out7_sampleIn_stage0 $end + $upscope $end + $scope module ff_coeffIn $end + $var wire 1 s616 _in0_reset $end + $var wire 16 s617 _in1_const_0 $end + $var wire 16 s618 _in2_const_0 $end + $var wire 1 s619 _in3_const_1 $end + $var wire 16 s620 _in4_coeffIn_stage0_o $end + $var wire 16 s621 _in5_coeffIn_stage1_o $end + $var wire 1 s622 _trigger0_clk $end + $var wire 16 s623 _out6_coeffIn_stage1_i $end + $var wire 16 s624 _out7_coeffIn_stage2_i $end + $upscope $end + $scope module comb_stage1 $end + $var wire 16 s625 _in0_sampleIn_stage1_i $end + $var wire 16 s626 _in2_coeffIn_stage1_i $end + $var wire 16 s627 _in4_accumIn_stage1_i $end + $var wire 16 s628 _in6__sampleIn_stage1_add_accumIn_stage1 $end + $var wire 16 s629 _out1_sampleIn_stage1 $end + $var wire 16 s630 _out3_coeffIn_stage1 $end + $var wire 16 s631 _out5_accumIn_stage1 $end + $var wire 16 s632 _out7_sampleIn_stage1 $end + $upscope $end + $scope module add $end + $var wire 16 s633 _in0_sampleIn_stage1 $end + $var wire 16 s634 _in1_accumIn_stage1 $end + $var wire 16 s635 _sampleIn_stage1_add_accumIn_stage1 $end + $var wire 1 s636 _sampleIn_stage1_add_accumIn_stage1_carry $end + $upscope $end + $scope module ff_accumIn $end + $var wire 1 s637 _in0_reset $end + $var wire 16 s638 _in1_const_0 $end + $var wire 16 s639 _in2_const_0 $end + $var wire 1 s640 _in3_const_1 $end + $var wire 16 s641 _in4_accumIn_stage0_o $end + $var wire 16 s642 _in5_accumIn_stage1_o $end + $var wire 1 s643 _trigger0_clk $end + $var wire 16 s644 _out6_accumIn_stage1_i $end + $var wire 16 s645 _out7_accumIn_stage2_i $end + $upscope $end + $upscope $end + $scope module macTap0 $end + $var wire 16 s220 sampleIn $end + $var wire 16 s221 coeffIn $end + $var wire 16 s222 accumIn $end + $var wire 1 s223 clk $end + $var wire 1 s224 reset $end + $var wire 1 s225 enable $end + $var wire 16 s226 result $end + $var wire 16 s227 sampleIn_stage2 $end + $var wire 16 s228 sampleIn_stage2_o $end + $var wire 16 s229 sampleIn_stage2_0 $end + $var wire 16 s230 sampleIn_stage2_i $end + $var wire 16 s231 sampleIn_stage0_o $end + $var wire 16 s232 sampleIn_stage0 $end + $var wire 16 s233 sampleIn_stage0_0 $end + $var wire 16 s234 sampleIn_stage0_i $end + $var wire 16 s235 coeffIn_stage0_i $end + $var wire 16 s236 accumIn_stage0_i $end + $var wire 16 s237 sampleIn_stage0_1 $end + $var wire 16 s238 sampleIn_stage0_2 $end + $var wire 16 s239 coeffIn_stage0 $end + $var wire 16 s240 coeffIn_stage0_0 $end + $var wire 16 s241 coeffIn_stage0_1 $end + $var wire 16 s242 coeffIn_stage0_o $end + $var wire 16 s243 coeffIn_stage1_i $end + $var wire 16 s244 sampleIn_stage1 $end + $var wire 16 s245 sampleIn_stage1_0 $end + $var wire 16 s246 accumIn_stage1 $end + $var wire 16 s247 accumIn_stage1_0 $end + $var wire 16 s248 accumIn_stage1_1 $end + $var wire 16 s249 accumIn_stage1_o $end + $var wire 16 s250 accumIn_stage1_i $end + $var wire 16 s251 accumIn_stage2_i $end + $var wire 16 s252 accumIn_stage0_o $end + $var wire 16 s253 accumIn_stage0 $end + $var wire 16 s254 accumIn_stage0_0 $end + $var wire 16 s255 coeffIn_stage1 $end + $var wire 16 s256 coeffIn_stage1_0 $end + $var wire 16 s257 coeffIn_stage1_o $end + $var wire 16 s258 sampleIn_stage1_1 $end + $var wire 16 s259 sampleIn_stage1_2 $end + $var wire 16 s260 sampleIn_stage1_o $end + $var wire 16 s261 sampleIn_stage1_i $end + $var wire 16 s262 coeffIn_stage2_i $end + $var wire 16 s263 coeffIn_stage2 $end + $var wire 16 s264 coeffIn_stage2_0 $end + $var wire 16 s265 coeffIn_stage2_o $end + $var wire 16 s266 accumIn_stage2 $end + $var wire 16 s267 accumIn_stage2_0 $end + $var wire 16 s268 accumIn_stage2_o $end + $scope module comb_stage2 $end + $var wire 16 s646 _in0_sampleIn_stage2_i $end + $var wire 16 s647 _in2_coeffIn_stage2_i $end + $var wire 16 s648 _in4_accumIn_stage2_i $end + $var wire 16 s649 _out1_sampleIn_stage2 $end + $var wire 16 s650 _out3_coeffIn_stage2 $end + $var wire 16 s651 _out5_accumIn_stage2 $end + $upscope $end + $scope module ff_sampleIn $end + $var wire 1 s652 _in0_reset $end + $var wire 16 s653 _in1_const_0 $end + $var wire 16 s654 _in2_const_0 $end + $var wire 1 s655 _in3_const_1 $end + $var wire 16 s656 _in4_sampleIn_stage0_o $end + $var wire 16 s657 _in5_sampleIn_stage1_o $end + $var wire 1 s658 _trigger0_clk $end + $var wire 16 s659 _out6_sampleIn_stage1_i $end + $var wire 16 s660 _out7_sampleIn_stage2_i $end + $upscope $end + $scope module comb_stage0 $end + $var wire 16 s661 _in0_sampleIn_stage0_i $end + $var wire 16 s662 _in2_coeffIn_stage0_i $end + $var wire 16 s663 _in4_accumIn_stage0_i $end + $var wire 16 s664 _in6__sampleIn_stage0_multiply_coeffIn_stage0 $end + $var wire 16 s665 _out1_sampleIn_stage0 $end + $var wire 16 s666 _out3_coeffIn_stage0 $end + $var wire 16 s667 _out5_accumIn_stage0 $end + $var wire 16 s668 _out7_sampleIn_stage0 $end + $upscope $end + $scope module ff_coeffIn $end + $var wire 1 s669 _in0_reset $end + $var wire 16 s670 _in1_const_0 $end + $var wire 16 s671 _in2_const_0 $end + $var wire 1 s672 _in3_const_1 $end + $var wire 16 s673 _in4_coeffIn_stage0_o $end + $var wire 16 s674 _in5_coeffIn_stage1_o $end + $var wire 1 s675 _trigger0_clk $end + $var wire 16 s676 _out6_coeffIn_stage1_i $end + $var wire 16 s677 _out7_coeffIn_stage2_i $end + $upscope $end + $scope module comb_stage1 $end + $var wire 16 s678 _in0_sampleIn_stage1_i $end + $var wire 16 s679 _in2_coeffIn_stage1_i $end + $var wire 16 s680 _in4_accumIn_stage1_i $end + $var wire 16 s681 _in6__sampleIn_stage1_add_accumIn_stage1 $end + $var wire 16 s682 _out1_sampleIn_stage1 $end + $var wire 16 s683 _out3_coeffIn_stage1 $end + $var wire 16 s684 _out5_accumIn_stage1 $end + $var wire 16 s685 _out7_sampleIn_stage1 $end + $upscope $end + $scope module add $end + $var wire 16 s686 _in0_sampleIn_stage1 $end + $var wire 16 s687 _in1_accumIn_stage1 $end + $var wire 16 s688 _sampleIn_stage1_add_accumIn_stage1 $end + $var wire 1 s689 _sampleIn_stage1_add_accumIn_stage1_carry $end + $upscope $end + $scope module ff_accumIn $end + $var wire 1 s690 _in0_reset $end + $var wire 16 s691 _in1_const_0 $end + $var wire 16 s692 _in2_const_0 $end + $var wire 1 s693 _in3_const_1 $end + $var wire 16 s694 _in4_accumIn_stage0_o $end + $var wire 16 s695 _in5_accumIn_stage1_o $end + $var wire 1 s696 _trigger0_clk $end + $var wire 16 s697 _out6_accumIn_stage1_i $end + $var wire 16 s698 _out7_accumIn_stage2_i $end + $upscope $end + $upscope $end + $scope module coeffBank $end + $var wire 2 s269 tapIndex $end + $var wire 1 s270 clk $end + $var wire 1 s271 reset $end + $var wire 16 s272 coeffOut $end + $var wire 1 s273 tapMatch0 $end + $var wire 1 s274 tapMatch1 $end + $var wire 1 s275 tapMatch2 $end + $upscope $end + $upscope $end + $scope module controller $end + $var wire 1 s59 clk $end + $var wire 1 s60 reset $end + $var wire 1 s61 start $end + $var wire 1 s62 inputValid $end + $var wire 1 s63 inputDone $end + $var wire 1 s64 filterEnable $end + $var wire 1 s65 loadingPhase $end + $var wire 1 s66 doneFlag $end + $var wire 3 s67 state $end + $var wire 3 s68 currentState $end + $var wire 1 s69 isDraining $end + $var wire 8 s70 drainNext $end + $var wire 8 s71 drainCount $end + $var wire 8 s72 drainIncr $end + $var wire 3 s73 nextState $end + $var wire 3 s74 FilterState_idle $end + $var wire 3 s75 FilterState_loading $end + $var wire 3 s76 FilterState_running $end + $var wire 3 s77 FilterState_draining $end + $var wire 3 s78 FilterState_done $end + $scope module combinational $end + $var wire 3 s276 _in0_currentState $end + $var wire 3 s277 _in1_FilterState_idle $end + $var wire 1 s278 _in2_const_0 $end + $var wire 1 s279 _in3_const_0 $end + $var wire 1 s280 _in4_const_0 $end + $var wire 1 s281 _in5_const_1 $end + $var wire 1 s282 _in6_start $end + $var wire 3 s283 _in7_const_1 $end + $var wire 3 s284 _in8_const_0 $end + $var wire 3 s285 _in9_FilterState_loading $end + $var wire 1 s286 _in10_const_1 $end + $var wire 1 s287 _in11_const_1 $end + $var wire 1 s288 _in12_const_0 $end + $var wire 1 s289 _in13_const_1 $end + $var wire 1 s290 _in14_inputValid $end + $var wire 3 s291 _in15_const_2 $end + $var wire 3 s292 _in16_const_1 $end + $var wire 3 s293 _in17_FilterState_running $end + $var wire 1 s294 _in18_const_1 $end + $var wire 1 s295 _in19_const_0 $end + $var wire 1 s296 _in20_const_0 $end + $var wire 1 s297 _in21_const_1 $end + $var wire 1 s298 _in22_inputDone $end + $var wire 3 s299 _in23_const_3 $end + $var wire 3 s300 _in24_const_2 $end + $var wire 3 s301 _in25_FilterState_draining $end + $var wire 1 s302 _in26_const_1 $end + $var wire 1 s303 _in27_const_0 $end + $var wire 1 s304 _in28_const_0 $end + $var wire 1 s305 _in29_const_1 $end + $var wire 1 s306 _in30__drainCount_equals_const_7 $end + $var wire 3 s307 _in31_const_4 $end + $var wire 3 s308 _in32_const_3 $end + $var wire 3 s309 _in33_FilterState_done $end + $var wire 1 s310 _in34_const_0 $end + $var wire 1 s311 _in35_const_0 $end + $var wire 1 s312 _in36_const_1 $end + $var wire 1 s313 _in37_const_1 $end + $var wire 3 s314 _in38_const_4 $end + $var wire 1 s315 _in39_const_0 $end + $var wire 1 s316 _in40_const_0 $end + $var wire 1 s317 _in41_const_0 $end + $var wire 1 s318 _out42_filterEnable $end + $var wire 1 s319 _out43_loadingPhase $end + $var wire 1 s320 _out44_doneFlag $end + $var wire 3 s321 _out45_nextState $end + $upscope $end + $scope module flipflop $end + $var wire 1 s322 _clk $end + $var wire 8 s323 _d $end + $var wire 1 s324 _reset $end + $var wire 8 s325 _q $end + $scope module sequential $end + $var wire 1 s699 _in0__reset $end + $var wire 8 s700 _in1_const_8_h0 $end + $var wire 1 s701 _in2_const_1 $end + $var wire 8 s702 _in3__d $end + $var wire 1 s703 _trigger0__clk $end + $var wire 8 s704 _out4__q $end + $upscope $end + $upscope $end + $scope module add $end + $var wire 8 s326 _in0_drainCount $end + $var wire 8 s327 _in1_const_1 $end + $var wire 8 s328 _drainCount_add_const_1 $end + $var wire 1 s329 _drainCount_add_const_1_carry $end + $upscope $end + $scope module sequential $end + $var wire 1 s330 _in0_reset $end + $var wire 3 s331 _in1_const_0 $end + $var wire 1 s332 _in2_const_1 $end + $var wire 3 s333 _in3_nextState $end + $var wire 1 s334 _trigger0_clk $end + $var wire 3 s335 _out4_currentState $end + $upscope $end + $upscope $end + $scope module ch1 $end + $var wire 16 s79 sampleIn $end + $var wire 1 s80 validIn $end + $var wire 1 s81 clk $end + $var wire 1 s82 reset $end + $var wire 1 s83 enable $end + $var wire 48 s84 coefficients $end + $var wire 16 s85 dataOut $end + $var wire 1 s86 validOut $end + $var wire 16 s87 dataOut_0 $end + $var wire 1 s88 validPipe $end + $var wire 1 s89 validMuxed $end + $var wire 1 s90 validStage1 $end + $var wire 1 s91 validIn_0 $end + $var wire 1 s92 shiftEn $end + $var wire 16 s93 nextTap0 $end + $var wire 16 s94 delayTap0 $end + $var wire 16 s95 nextTap1 $end + $var wire 16 s96 delayTap1 $end + $var wire 16 s97 nextTap2 $end + $var wire 16 s98 delayTap2 $end + $var wire 16 s99 sampleIn_0 $end + $var wire 1 s100 validOut_0 $end + $var wire 2 s101 tapIndex $end + $scope module flipflop $end + $var wire 1 s336 _clk $end + $var wire 1 s337 _d $end + $var wire 1 s338 _reset $end + $var wire 1 s339 _q $end + $scope module sequential $end + $var wire 1 s705 _in0__reset $end + $var wire 1 s706 _in1_const_1_h0 $end + $var wire 1 s707 _in2_const_1 $end + $var wire 1 s708 _in3__d $end + $var wire 1 s709 _trigger0__clk $end + $var wire 1 s710 _out4__q $end + $upscope $end + $upscope $end + $scope module flipflop_0 $end + $var wire 1 s340 _clk $end + $var wire 1 s341 _d $end + $var wire 1 s342 _reset $end + $var wire 1 s343 _q $end + $scope module sequential $end + $var wire 1 s711 _in0__reset $end + $var wire 1 s712 _in1_const_1_h0 $end + $var wire 1 s713 _in2_const_1 $end + $var wire 1 s714 _in3__d $end + $var wire 1 s715 _trigger0__clk $end + $var wire 1 s716 _out4__q $end + $upscope $end + $upscope $end + $scope module flipflop_1 $end + $var wire 1 s344 _clk $end + $var wire 16 s345 _d $end + $var wire 1 s346 _reset $end + $var wire 16 s347 _q $end + $scope module sequential $end + $var wire 1 s717 _in0__reset $end + $var wire 16 s718 _in1_const_16_h0 $end + $var wire 1 s719 _in2_const_1 $end + $var wire 16 s720 _in3__d $end + $var wire 1 s721 _trigger0__clk $end + $var wire 16 s722 _out4__q $end + $upscope $end + $upscope $end + $scope module flipflop_2 $end + $var wire 1 s348 _clk $end + $var wire 16 s349 _d $end + $var wire 1 s350 _reset $end + $var wire 16 s351 _q $end + $scope module sequential $end + $var wire 1 s723 _in0__reset $end + $var wire 16 s724 _in1_const_16_h0 $end + $var wire 1 s725 _in2_const_1 $end + $var wire 16 s726 _in3__d $end + $var wire 1 s727 _trigger0__clk $end + $var wire 16 s728 _out4__q $end + $upscope $end + $upscope $end + $scope module flipflop_3 $end + $var wire 1 s352 _clk $end + $var wire 16 s353 _d $end + $var wire 1 s354 _reset $end + $var wire 16 s355 _q $end + $scope module sequential $end + $var wire 1 s729 _in0__reset $end + $var wire 16 s730 _in1_const_16_h0 $end + $var wire 1 s731 _in2_const_1 $end + $var wire 16 s732 _in3__d $end + $var wire 1 s733 _trigger0__clk $end + $var wire 16 s734 _out4__q $end + $upscope $end + $upscope $end + $scope module macTap2 $end + $var wire 16 s356 sampleIn $end + $var wire 16 s357 coeffIn $end + $var wire 16 s358 accumIn $end + $var wire 1 s359 clk $end + $var wire 1 s360 reset $end + $var wire 1 s361 enable $end + $var wire 16 s362 result $end + $var wire 16 s363 sampleIn_stage2 $end + $var wire 16 s364 sampleIn_stage2_o $end + $var wire 16 s365 sampleIn_stage2_0 $end + $var wire 16 s366 sampleIn_stage2_i $end + $var wire 16 s367 sampleIn_stage0_o $end + $var wire 16 s368 sampleIn_stage0 $end + $var wire 16 s369 sampleIn_stage0_0 $end + $var wire 16 s370 sampleIn_stage0_i $end + $var wire 16 s371 coeffIn_stage0_i $end + $var wire 16 s372 accumIn_stage0_i $end + $var wire 16 s373 sampleIn_stage0_1 $end + $var wire 16 s374 sampleIn_stage0_2 $end + $var wire 16 s375 coeffIn_stage0 $end + $var wire 16 s376 coeffIn_stage0_0 $end + $var wire 16 s377 coeffIn_stage0_1 $end + $var wire 16 s378 coeffIn_stage0_o $end + $var wire 16 s379 coeffIn_stage1_i $end + $var wire 16 s380 sampleIn_stage1 $end + $var wire 16 s381 sampleIn_stage1_0 $end + $var wire 16 s382 accumIn_stage1 $end + $var wire 16 s383 accumIn_stage1_0 $end + $var wire 16 s384 accumIn_stage1_1 $end + $var wire 16 s385 accumIn_stage1_o $end + $var wire 16 s386 accumIn_stage1_i $end + $var wire 16 s387 accumIn_stage2_i $end + $var wire 16 s388 accumIn_stage0_o $end + $var wire 16 s389 accumIn_stage0 $end + $var wire 16 s390 accumIn_stage0_0 $end + $var wire 16 s391 coeffIn_stage1 $end + $var wire 16 s392 coeffIn_stage1_0 $end + $var wire 16 s393 coeffIn_stage1_o $end + $var wire 16 s394 sampleIn_stage1_1 $end + $var wire 16 s395 sampleIn_stage1_2 $end + $var wire 16 s396 sampleIn_stage1_o $end + $var wire 16 s397 sampleIn_stage1_i $end + $var wire 16 s398 coeffIn_stage2_i $end + $var wire 16 s399 coeffIn_stage2 $end + $var wire 16 s400 coeffIn_stage2_0 $end + $var wire 16 s401 coeffIn_stage2_o $end + $var wire 16 s402 accumIn_stage2 $end + $var wire 16 s403 accumIn_stage2_0 $end + $var wire 16 s404 accumIn_stage2_o $end + $scope module comb_stage2 $end + $var wire 16 s735 _in0_sampleIn_stage2_i $end + $var wire 16 s736 _in2_coeffIn_stage2_i $end + $var wire 16 s737 _in4_accumIn_stage2_i $end + $var wire 16 s738 _out1_sampleIn_stage2 $end + $var wire 16 s739 _out3_coeffIn_stage2 $end + $var wire 16 s740 _out5_accumIn_stage2 $end + $upscope $end + $scope module ff_sampleIn $end + $var wire 1 s741 _in0_reset $end + $var wire 16 s742 _in1_const_0 $end + $var wire 16 s743 _in2_const_0 $end + $var wire 1 s744 _in3_const_1 $end + $var wire 16 s745 _in4_sampleIn_stage0_o $end + $var wire 16 s746 _in5_sampleIn_stage1_o $end + $var wire 1 s747 _trigger0_clk $end + $var wire 16 s748 _out6_sampleIn_stage1_i $end + $var wire 16 s749 _out7_sampleIn_stage2_i $end + $upscope $end + $scope module comb_stage0 $end + $var wire 16 s750 _in0_sampleIn_stage0_i $end + $var wire 16 s751 _in2_coeffIn_stage0_i $end + $var wire 16 s752 _in4_accumIn_stage0_i $end + $var wire 16 s753 _in6__sampleIn_stage0_multiply_coeffIn_stage0 $end + $var wire 16 s754 _out1_sampleIn_stage0 $end + $var wire 16 s755 _out3_coeffIn_stage0 $end + $var wire 16 s756 _out5_accumIn_stage0 $end + $var wire 16 s757 _out7_sampleIn_stage0 $end + $upscope $end + $scope module ff_coeffIn $end + $var wire 1 s758 _in0_reset $end + $var wire 16 s759 _in1_const_0 $end + $var wire 16 s760 _in2_const_0 $end + $var wire 1 s761 _in3_const_1 $end + $var wire 16 s762 _in4_coeffIn_stage0_o $end + $var wire 16 s763 _in5_coeffIn_stage1_o $end + $var wire 1 s764 _trigger0_clk $end + $var wire 16 s765 _out6_coeffIn_stage1_i $end + $var wire 16 s766 _out7_coeffIn_stage2_i $end + $upscope $end + $scope module comb_stage1 $end + $var wire 16 s767 _in0_sampleIn_stage1_i $end + $var wire 16 s768 _in2_coeffIn_stage1_i $end + $var wire 16 s769 _in4_accumIn_stage1_i $end + $var wire 16 s770 _in6__sampleIn_stage1_add_accumIn_stage1 $end + $var wire 16 s771 _out1_sampleIn_stage1 $end + $var wire 16 s772 _out3_coeffIn_stage1 $end + $var wire 16 s773 _out5_accumIn_stage1 $end + $var wire 16 s774 _out7_sampleIn_stage1 $end + $upscope $end + $scope module add $end + $var wire 16 s775 _in0_sampleIn_stage1 $end + $var wire 16 s776 _in1_accumIn_stage1 $end + $var wire 16 s777 _sampleIn_stage1_add_accumIn_stage1 $end + $var wire 1 s778 _sampleIn_stage1_add_accumIn_stage1_carry $end + $upscope $end + $scope module ff_accumIn $end + $var wire 1 s779 _in0_reset $end + $var wire 16 s780 _in1_const_0 $end + $var wire 16 s781 _in2_const_0 $end + $var wire 1 s782 _in3_const_1 $end + $var wire 16 s783 _in4_accumIn_stage0_o $end + $var wire 16 s784 _in5_accumIn_stage1_o $end + $var wire 1 s785 _trigger0_clk $end + $var wire 16 s786 _out6_accumIn_stage1_i $end + $var wire 16 s787 _out7_accumIn_stage2_i $end + $upscope $end + $upscope $end + $scope module macTap1 $end + $var wire 16 s405 sampleIn $end + $var wire 16 s406 coeffIn $end + $var wire 16 s407 accumIn $end + $var wire 1 s408 clk $end + $var wire 1 s409 reset $end + $var wire 1 s410 enable $end + $var wire 16 s411 result $end + $var wire 16 s412 sampleIn_stage2 $end + $var wire 16 s413 sampleIn_stage2_o $end + $var wire 16 s414 sampleIn_stage2_0 $end + $var wire 16 s415 sampleIn_stage2_i $end + $var wire 16 s416 sampleIn_stage0_o $end + $var wire 16 s417 sampleIn_stage0 $end + $var wire 16 s418 sampleIn_stage0_0 $end + $var wire 16 s419 sampleIn_stage0_i $end + $var wire 16 s420 coeffIn_stage0_i $end + $var wire 16 s421 accumIn_stage0_i $end + $var wire 16 s422 sampleIn_stage0_1 $end + $var wire 16 s423 sampleIn_stage0_2 $end + $var wire 16 s424 coeffIn_stage0 $end + $var wire 16 s425 coeffIn_stage0_0 $end + $var wire 16 s426 coeffIn_stage0_1 $end + $var wire 16 s427 coeffIn_stage0_o $end + $var wire 16 s428 coeffIn_stage1_i $end + $var wire 16 s429 sampleIn_stage1 $end + $var wire 16 s430 sampleIn_stage1_0 $end + $var wire 16 s431 accumIn_stage1 $end + $var wire 16 s432 accumIn_stage1_0 $end + $var wire 16 s433 accumIn_stage1_1 $end + $var wire 16 s434 accumIn_stage1_o $end + $var wire 16 s435 accumIn_stage1_i $end + $var wire 16 s436 accumIn_stage2_i $end + $var wire 16 s437 accumIn_stage0_o $end + $var wire 16 s438 accumIn_stage0 $end + $var wire 16 s439 accumIn_stage0_0 $end + $var wire 16 s440 coeffIn_stage1 $end + $var wire 16 s441 coeffIn_stage1_0 $end + $var wire 16 s442 coeffIn_stage1_o $end + $var wire 16 s443 sampleIn_stage1_1 $end + $var wire 16 s444 sampleIn_stage1_2 $end + $var wire 16 s445 sampleIn_stage1_o $end + $var wire 16 s446 sampleIn_stage1_i $end + $var wire 16 s447 coeffIn_stage2_i $end + $var wire 16 s448 coeffIn_stage2 $end + $var wire 16 s449 coeffIn_stage2_0 $end + $var wire 16 s450 coeffIn_stage2_o $end + $var wire 16 s451 accumIn_stage2 $end + $var wire 16 s452 accumIn_stage2_0 $end + $var wire 16 s453 accumIn_stage2_o $end + $scope module comb_stage2 $end + $var wire 16 s788 _in0_sampleIn_stage2_i $end + $var wire 16 s789 _in2_coeffIn_stage2_i $end + $var wire 16 s790 _in4_accumIn_stage2_i $end + $var wire 16 s791 _out1_sampleIn_stage2 $end + $var wire 16 s792 _out3_coeffIn_stage2 $end + $var wire 16 s793 _out5_accumIn_stage2 $end + $upscope $end + $scope module ff_sampleIn $end + $var wire 1 s794 _in0_reset $end + $var wire 16 s795 _in1_const_0 $end + $var wire 16 s796 _in2_const_0 $end + $var wire 1 s797 _in3_const_1 $end + $var wire 16 s798 _in4_sampleIn_stage0_o $end + $var wire 16 s799 _in5_sampleIn_stage1_o $end + $var wire 1 s800 _trigger0_clk $end + $var wire 16 s801 _out6_sampleIn_stage1_i $end + $var wire 16 s802 _out7_sampleIn_stage2_i $end + $upscope $end + $scope module comb_stage0 $end + $var wire 16 s803 _in0_sampleIn_stage0_i $end + $var wire 16 s804 _in2_coeffIn_stage0_i $end + $var wire 16 s805 _in4_accumIn_stage0_i $end + $var wire 16 s806 _in6__sampleIn_stage0_multiply_coeffIn_stage0 $end + $var wire 16 s807 _out1_sampleIn_stage0 $end + $var wire 16 s808 _out3_coeffIn_stage0 $end + $var wire 16 s809 _out5_accumIn_stage0 $end + $var wire 16 s810 _out7_sampleIn_stage0 $end + $upscope $end + $scope module ff_coeffIn $end + $var wire 1 s811 _in0_reset $end + $var wire 16 s812 _in1_const_0 $end + $var wire 16 s813 _in2_const_0 $end + $var wire 1 s814 _in3_const_1 $end + $var wire 16 s815 _in4_coeffIn_stage0_o $end + $var wire 16 s816 _in5_coeffIn_stage1_o $end + $var wire 1 s817 _trigger0_clk $end + $var wire 16 s818 _out6_coeffIn_stage1_i $end + $var wire 16 s819 _out7_coeffIn_stage2_i $end + $upscope $end + $scope module comb_stage1 $end + $var wire 16 s820 _in0_sampleIn_stage1_i $end + $var wire 16 s821 _in2_coeffIn_stage1_i $end + $var wire 16 s822 _in4_accumIn_stage1_i $end + $var wire 16 s823 _in6__sampleIn_stage1_add_accumIn_stage1 $end + $var wire 16 s824 _out1_sampleIn_stage1 $end + $var wire 16 s825 _out3_coeffIn_stage1 $end + $var wire 16 s826 _out5_accumIn_stage1 $end + $var wire 16 s827 _out7_sampleIn_stage1 $end + $upscope $end + $scope module add $end + $var wire 16 s828 _in0_sampleIn_stage1 $end + $var wire 16 s829 _in1_accumIn_stage1 $end + $var wire 16 s830 _sampleIn_stage1_add_accumIn_stage1 $end + $var wire 1 s831 _sampleIn_stage1_add_accumIn_stage1_carry $end + $upscope $end + $scope module ff_accumIn $end + $var wire 1 s832 _in0_reset $end + $var wire 16 s833 _in1_const_0 $end + $var wire 16 s834 _in2_const_0 $end + $var wire 1 s835 _in3_const_1 $end + $var wire 16 s836 _in4_accumIn_stage0_o $end + $var wire 16 s837 _in5_accumIn_stage1_o $end + $var wire 1 s838 _trigger0_clk $end + $var wire 16 s839 _out6_accumIn_stage1_i $end + $var wire 16 s840 _out7_accumIn_stage2_i $end + $upscope $end + $upscope $end + $scope module macTap0 $end + $var wire 16 s454 sampleIn $end + $var wire 16 s455 coeffIn $end + $var wire 16 s456 accumIn $end + $var wire 1 s457 clk $end + $var wire 1 s458 reset $end + $var wire 1 s459 enable $end + $var wire 16 s460 result $end + $var wire 16 s461 result_0 $end + $var wire 16 s462 result_1 $end + $var wire 16 s463 result_2 $end + $var wire 16 s464 sampleIn_stage2_i $end + $var wire 16 s465 sampleIn_stage0_o $end + $var wire 16 s466 sampleIn_stage0_o_0 $end + $var wire 16 s467 sampleIn_stage0_o_1 $end + $var wire 16 s468 sampleIn_0 $end + $var wire 16 s469 coeffIn_0 $end + $var wire 16 s470 accumIn_0 $end + $var wire 16 s471 sampleIn_stage0 $end + $var wire 16 s472 sampleIn_stage0_0 $end + $var wire 16 s473 coeffIn_stage0_o $end + $var wire 16 s474 coeffIn_stage0_o_0 $end + $var wire 16 s475 coeffIn_stage0_o_1 $end + $var wire 16 s476 coeffIn_stage0_o_2 $end + $var wire 16 s477 coeffIn_stage1_i $end + $var wire 16 s478 sampleIn_stage1 $end + $var wire 16 s479 sampleIn_stage1_0 $end + $var wire 16 s480 accumIn_stage1_o $end + $var wire 16 s481 accumIn_stage1_o_0 $end + $var wire 16 s482 accumIn_stage1_o_1 $end + $var wire 16 s483 accumIn_stage1_o_2 $end + $var wire 16 s484 accumIn_stage1_i $end + $var wire 16 s485 accumIn_stage2_i $end + $var wire 16 s486 accumIn_stage0_o $end + $var wire 16 s487 accumIn_stage0_o_0 $end + $var wire 16 s488 accumIn_stage0_o_1 $end + $var wire 16 s489 coeffIn_stage1_o $end + $var wire 16 s490 coeffIn_stage1_o_0 $end + $var wire 16 s491 coeffIn_stage1_o_1 $end + $var wire 16 s492 sampleIn_stage1_o $end + $var wire 16 s493 sampleIn_stage1_o_0 $end + $var wire 16 s494 sampleIn_stage1_o_1 $end + $var wire 16 s495 sampleIn_stage1_i $end + $var wire 16 s496 coeffIn_stage2_i $end + $var wire 16 s497 coeffIn_stage2_o $end + $var wire 16 s498 coeffIn_stage2_o_0 $end + $var wire 16 s499 coeffIn_stage2_o_1 $end + $var wire 16 s500 accumIn_stage2_o $end + $var wire 16 s501 accumIn_stage2_o_0 $end + $var wire 16 s502 accumIn_stage2_o_1 $end + $scope module comb_stage2 $end + $var wire 16 s841 _in0_sampleIn_stage2_i $end + $var wire 16 s842 _in2_coeffIn_stage2_i $end + $var wire 16 s843 _in4_accumIn_stage2_i $end + $var wire 16 s844 _out1_sampleIn_stage2 $end + $var wire 16 s845 _out3_coeffIn_stage2 $end + $var wire 16 s846 _out5_accumIn_stage2 $end + $upscope $end + $scope module ff_sampleIn $end + $var wire 1 s847 _in0_reset $end + $var wire 16 s848 _in1_const_0 $end + $var wire 16 s849 _in2_const_0 $end + $var wire 1 s850 _in3_const_1 $end + $var wire 16 s851 _in4_sampleIn_stage0_o $end + $var wire 16 s852 _in5_sampleIn_stage1_o $end + $var wire 1 s853 _trigger0_clk $end + $var wire 16 s854 _out6_sampleIn_stage1_i $end + $var wire 16 s855 _out7_sampleIn_stage2_i $end + $upscope $end + $scope module comb_stage0 $end + $var wire 16 s856 _in0_sampleIn_stage0_i $end + $var wire 16 s857 _in2_coeffIn_stage0_i $end + $var wire 16 s858 _in4_accumIn_stage0_i $end + $var wire 16 s859 _in6__sampleIn_stage0_multiply_coeffIn_stage0 $end + $var wire 16 s860 _out1_sampleIn_stage0 $end + $var wire 16 s861 _out3_coeffIn_stage0 $end + $var wire 16 s862 _out5_accumIn_stage0 $end + $var wire 16 s863 _out7_sampleIn_stage0 $end + $upscope $end + $scope module ff_coeffIn $end + $var wire 1 s864 _in0_reset $end + $var wire 16 s865 _in1_const_0 $end + $var wire 16 s866 _in2_const_0 $end + $var wire 1 s867 _in3_const_1 $end + $var wire 16 s868 _in4_coeffIn_stage0_o $end + $var wire 16 s869 _in5_coeffIn_stage1_o $end + $var wire 1 s870 _trigger0_clk $end + $var wire 16 s871 _out6_coeffIn_stage1_i $end + $var wire 16 s872 _out7_coeffIn_stage2_i $end + $upscope $end + $scope module comb_stage1 $end + $var wire 16 s873 _in0_sampleIn_stage1_i $end + $var wire 16 s874 _in2_coeffIn_stage1_i $end + $var wire 16 s875 _in4_accumIn_stage1_i $end + $var wire 16 s876 _in6__sampleIn_stage1_add_accumIn_stage1 $end + $var wire 16 s877 _out1_sampleIn_stage1 $end + $var wire 16 s878 _out3_coeffIn_stage1 $end + $var wire 16 s879 _out5_accumIn_stage1 $end + $var wire 16 s880 _out7_sampleIn_stage1 $end + $upscope $end + $scope module add $end + $var wire 16 s881 _in0_sampleIn_stage1 $end + $var wire 16 s882 _in1_accumIn_stage1 $end + $var wire 16 s883 _sampleIn_stage1_add_accumIn_stage1 $end + $var wire 1 s884 _sampleIn_stage1_add_accumIn_stage1_carry $end + $upscope $end + $scope module ff_accumIn $end + $var wire 1 s885 _in0_reset $end + $var wire 16 s886 _in1_const_0 $end + $var wire 16 s887 _in2_const_0 $end + $var wire 1 s888 _in3_const_1 $end + $var wire 16 s889 _in4_accumIn_stage0_o $end + $var wire 16 s890 _in5_accumIn_stage1_o $end + $var wire 1 s891 _trigger0_clk $end + $var wire 16 s892 _out6_accumIn_stage1_i $end + $var wire 16 s893 _out7_accumIn_stage2_i $end + $upscope $end + $upscope $end + $scope module coeffBank $end + $var wire 2 s503 tapIndex $end + $var wire 1 s504 clk $end + $var wire 1 s505 reset $end + $var wire 16 s506 coeffOut $end + $var wire 1 s507 tapMatch0 $end + $var wire 1 s508 tapMatch1 $end + $var wire 1 s509 tapMatch2 $end + $upscope $end + $upscope $end +$upscope $end +$enddefinitions $end +$dumpvars +0s0 +zs1 +zs2 +bzzzzzzzzzzzzzzzz s3 +bzzzzzzzzzzzzzzzz s4 +zs5 +zs6 +bxxxxxxxxxxxxxxxx s7 +bxxxxxxxxxxxxxxxx s8 +zs9 +xs10 +bzzz s11 +bxxxxxxxxxxxxxxxx s12 +bzzzzzzzzzzzzzzzz s13 +bzzzzzzzzzzzzzzzz s14 +b0zzzzzzzzzzzzzzzzz s15 +zs16 +zs17 +0s18 +bxxxxxxxxxxxxxxxx s19 +zs20 +bzzzzzzzzzzzzzzzz s21 +bzzzzzzzzzzzzzzzz s22 +b1zzzzzzzzzzzzzzzzz s23 +zs24 +zs25 +1s26 +b0000000000000001 s27 +b000000000000000111111111111111100000000000000001 s28 +b1111111111111110 s29 +b0000000000000001 s30 +b0000000000000001 s31 +b000000000000000100000000000000100000000000000001 s32 +b0000000000000010 s33 +b0000000000000001 s34 +zs35 +bzzzzzzzzzzzzzzzz s36 +zs37 +0s38 +zs39 +xs40 +b000000000000000100000000000000100000000000000001 s41 +bxxxxxxxxxxxxxxxx s42 +zs43 +bxxxxxxxxxxxxxxxx s44 +zs45 +xs46 +zs47 +zs48 +xs49 +bxxxxxxxxxxxxxxxx s50 +bzzzzzzzzzzzzzzzz s51 +bxxxxxxxxxxxxxxxx s52 +bzzzzzzzzzzzzzzzz s53 +bxxxxxxxxxxxxxxxx s54 +bzzzzzzzzzzzzzzzz s55 +bzzzzzzzzzzzzzzzz s56 +zs57 +bzz s58 +0s59 +zs60 +zs61 +zs62 +zs63 +xs64 +xs65 +xs66 +bzzz s67 +bzzz s68 +xs69 +bxxxxxxxx s70 +bzzzzzzzz s71 +bxxxxxxxx s72 +bxxx s73 +b000 s74 +b001 s75 +b010 s76 +b011 s77 +b100 s78 +bzzzzzzzzzzzzzzzz s79 +zs80 +0s81 +zs82 +xs83 +b000000000000000111111111111111100000000000000001 s84 +bxxxxxxxxxxxxxxxx s85 +zs86 +bxxxxxxxxxxxxxxxx s87 +zs88 +xs89 +zs90 +zs91 +xs92 +bxxxxxxxxxxxxxxxx s93 +bzzzzzzzzzzzzzzzz s94 +bxxxxxxxxxxxxxxxx s95 +bzzzzzzzzzzzzzzzz s96 +bxxxxxxxxxxxxxxxx s97 +bzzzzzzzzzzzzzzzz s98 +bzzzzzzzzzzzzzzzz s99 +zs100 +bzz s101 +0s102 +xs103 +zs104 +zs105 +0s106 +zs107 +zs108 +zs109 +0s110 +bxxxxxxxxxxxxxxxx s111 +zs112 +bzzzzzzzzzzzzzzzz s113 +0s114 +bxxxxxxxxxxxxxxxx s115 +zs116 +bzzzzzzzzzzzzzzzz s117 +0s118 +bxxxxxxxxxxxxxxxx s119 +zs120 +bzzzzzzzzzzzzzzzz s121 +bzzzzzzzzzzzzzzzz s122 +b0000000000000001 s123 +bxxxxxxxxxxxxxxxx s124 +0s125 +zs126 +xs127 +bxxxxxxxxxxxxxxxx s128 +bxxxxxxxxxxxxxxxx s129 +bxxxxxxxxxxxxxxxx s130 +bxxxxxxxxxxxxxxxx s131 +bzzzzzzzzzzzzzzzz s132 +bxxxxxxxxxxxxxxxx s133 +bxxxxxxxxxxxxxxxx s134 +bxxxxxxxxxxxxxxxx s135 +bzzzzzzzzzzzzzzzz s136 +b0000000000000001 s137 +bxxxxxxxxxxxxxxxx s138 +bxxxxxxxxxxxxxxxx s139 +bxxxxxxxxxxxxxxxx s140 +b0000000000000001 s141 +b0000000000000001 s142 +b0000000000000001 s143 +b0000000000000001 s144 +bzzzzzzzzzzzzzzzz s145 +bxxxxxxxxxxxxxxxx s146 +bxxxxxxxxxxxxxxxx s147 +bxxxxxxxxxxxxxxxx s148 +bxxxxxxxxxxxxxxxx s149 +bxxxxxxxxxxxxxxxx s150 +bxxxxxxxxxxxxxxxx s151 +bzzzzzzzzzzzzzzzz s152 +bzzzzzzzzzzzzzzzz s153 +bxxxxxxxxxxxxxxxx s154 +bxxxxxxxxxxxxxxxx s155 +bxxxxxxxxxxxxxxxx s156 +bxxxxxxxxxxxxxxxx s157 +bxxxxxxxxxxxxxxxx s158 +bxxxxxxxxxxxxxxxx s159 +bxxxxxxxxxxxxxxxx s160 +bxxxxxxxxxxxxxxxx s161 +bxxxxxxxxxxxxxxxx s162 +bzzzzzzzzzzzzzzzz s163 +bzzzzzzzzzzzzzzzz s164 +bxxxxxxxxxxxxxxxx s165 +bxxxxxxxxxxxxxxxx s166 +bxxxxxxxxxxxxxxxx s167 +bxxxxxxxxxxxxxxxx s168 +bxxxxxxxxxxxxxxxx s169 +bxxxxxxxxxxxxxxxx s170 +bzzzzzzzzzzzzzzzz s171 +b0000000000000010 s172 +bxxxxxxxxxxxxxxxx s173 +0s174 +zs175 +xs176 +bxxxxxxxxxxxxxxxx s177 +bxxxxxxxxxxxxxxxx s178 +bxxxxxxxxxxxxxxxx s179 +bxxxxxxxxxxxxxxxx s180 +bzzzzzzzzzzzzzzzz s181 +bxxxxxxxxxxxxxxxx s182 +bxxxxxxxxxxxxxxxx s183 +bxxxxxxxxxxxxxxxx s184 +bzzzzzzzzzzzzzzzz s185 +b0000000000000010 s186 +bxxxxxxxxxxxxxxxx s187 +bxxxxxxxxxxxxxxxx s188 +bxxxxxxxxxxxxxxxx s189 +b0000000000000010 s190 +b0000000000000010 s191 +b0000000000000010 s192 +b0000000000000010 s193 +bzzzzzzzzzzzzzzzz s194 +bxxxxxxxxxxxxxxxx s195 +bxxxxxxxxxxxxxxxx s196 +bxxxxxxxxxxxxxxxx s197 +bxxxxxxxxxxxxxxxx s198 +bxxxxxxxxxxxxxxxx s199 +bxxxxxxxxxxxxxxxx s200 +bzzzzzzzzzzzzzzzz s201 +bzzzzzzzzzzzzzzzz s202 +bxxxxxxxxxxxxxxxx s203 +bxxxxxxxxxxxxxxxx s204 +bxxxxxxxxxxxxxxxx s205 +bxxxxxxxxxxxxxxxx s206 +bxxxxxxxxxxxxxxxx s207 +bxxxxxxxxxxxxxxxx s208 +bxxxxxxxxxxxxxxxx s209 +bxxxxxxxxxxxxxxxx s210 +bxxxxxxxxxxxxxxxx s211 +bzzzzzzzzzzzzzzzz s212 +bzzzzzzzzzzzzzzzz s213 +bxxxxxxxxxxxxxxxx s214 +bxxxxxxxxxxxxxxxx s215 +bxxxxxxxxxxxxxxxx s216 +bxxxxxxxxxxxxxxxx s217 +bxxxxxxxxxxxxxxxx s218 +bxxxxxxxxxxxxxxxx s219 +bzzzzzzzzzzzzzzzz s220 +b0000000000000001 s221 +b0000000000000000 s222 +0s223 +zs224 +xs225 +bxxxxxxxxxxxxxxxx s226 +bxxxxxxxxxxxxxxxx s227 +bxxxxxxxxxxxxxxxx s228 +bxxxxxxxxxxxxxxxx s229 +bzzzzzzzzzzzzzzzz s230 +bxxxxxxxxxxxxxxxx s231 +bxxxxxxxxxxxxxxxx s232 +bxxxxxxxxxxxxxxxx s233 +bzzzzzzzzzzzzzzzz s234 +b0000000000000001 s235 +b0000000000000000 s236 +bxxxxxxxxxxxxxxxx s237 +bxxxxxxxxxxxxxxxx s238 +b0000000000000001 s239 +b0000000000000001 s240 +b0000000000000001 s241 +b0000000000000001 s242 +bzzzzzzzzzzzzzzzz s243 +bxxxxxxxxxxxxxxxx s244 +bxxxxxxxxxxxxxxxx s245 +bxxxxxxxxxxxxxxxx s246 +bxxxxxxxxxxxxxxxx s247 +bxxxxxxxxxxxxxxxx s248 +bxxxxxxxxxxxxxxxx s249 +bzzzzzzzzzzzzzzzz s250 +bzzzzzzzzzzzzzzzz s251 +b0000000000000000 s252 +b0000000000000000 s253 +b0000000000000000 s254 +bxxxxxxxxxxxxxxxx s255 +bxxxxxxxxxxxxxxxx s256 +bxxxxxxxxxxxxxxxx s257 +bxxxxxxxxxxxxxxxx s258 +bxxxxxxxxxxxxxxxx s259 +bxxxxxxxxxxxxxxxx s260 +bzzzzzzzzzzzzzzzz s261 +bzzzzzzzzzzzzzzzz s262 +bxxxxxxxxxxxxxxxx s263 +bxxxxxxxxxxxxxxxx s264 +bxxxxxxxxxxxxxxxx s265 +bxxxxxxxxxxxxxxxx s266 +bxxxxxxxxxxxxxxxx s267 +bxxxxxxxxxxxxxxxx s268 +bzz s269 +0s270 +zs271 +bxxxxxxxxxxxxxxxx s272 +xs273 +xs274 +xs275 +bzzz s276 +b000 s277 +0s278 +0s279 +0s280 +1s281 +zs282 +b001 s283 +b000 s284 +b001 s285 +1s286 +1s287 +0s288 +1s289 +zs290 +b010 s291 +b001 s292 +b010 s293 +1s294 +0s295 +0s296 +1s297 +zs298 +b011 s299 +b010 s300 +b011 s301 +1s302 +0s303 +0s304 +1s305 +xs306 +b100 s307 +b011 s308 +b100 s309 +0s310 +0s311 +1s312 +1s313 +b100 s314 +0s315 +0s316 +0s317 +xs318 +xs319 +xs320 +bxxx s321 +0s322 +bxxxxxxxx s323 +zs324 +bzzzzzzzz s325 +bzzzzzzzz s326 +b00000001 s327 +bxxxxxxxx s328 +xs329 +zs330 +b000 s331 +1s332 +bxxx s333 +0s334 +bzzz s335 +0s336 +xs337 +zs338 +zs339 +0s340 +zs341 +zs342 +zs343 +0s344 +bxxxxxxxxxxxxxxxx s345 +zs346 +bzzzzzzzzzzzzzzzz s347 +0s348 +bxxxxxxxxxxxxxxxx s349 +zs350 +bzzzzzzzzzzzzzzzz s351 +0s352 +bxxxxxxxxxxxxxxxx s353 +zs354 +bzzzzzzzzzzzzzzzz s355 +bzzzzzzzzzzzzzzzz s356 +b0000000000000001 s357 +bxxxxxxxxxxxxxxxx s358 +0s359 +zs360 +xs361 +bxxxxxxxxxxxxxxxx s362 +bxxxxxxxxxxxxxxxx s363 +bxxxxxxxxxxxxxxxx s364 +bxxxxxxxxxxxxxxxx s365 +bzzzzzzzzzzzzzzzz s366 +bxxxxxxxxxxxxxxxx s367 +bxxxxxxxxxxxxxxxx s368 +bxxxxxxxxxxxxxxxx s369 +bzzzzzzzzzzzzzzzz s370 +b0000000000000001 s371 +bxxxxxxxxxxxxxxxx s372 +bxxxxxxxxxxxxxxxx s373 +bxxxxxxxxxxxxxxxx s374 +b0000000000000001 s375 +b0000000000000001 s376 +b0000000000000001 s377 +b0000000000000001 s378 +bzzzzzzzzzzzzzzzz s379 +bxxxxxxxxxxxxxxxx s380 +bxxxxxxxxxxxxxxxx s381 +bxxxxxxxxxxxxxxxx s382 +bxxxxxxxxxxxxxxxx s383 +bxxxxxxxxxxxxxxxx s384 +bxxxxxxxxxxxxxxxx s385 +bzzzzzzzzzzzzzzzz s386 +bzzzzzzzzzzzzzzzz s387 +bxxxxxxxxxxxxxxxx s388 +bxxxxxxxxxxxxxxxx s389 +bxxxxxxxxxxxxxxxx s390 +bxxxxxxxxxxxxxxxx s391 +bxxxxxxxxxxxxxxxx s392 +bxxxxxxxxxxxxxxxx s393 +bxxxxxxxxxxxxxxxx s394 +bxxxxxxxxxxxxxxxx s395 +bxxxxxxxxxxxxxxxx s396 +bzzzzzzzzzzzzzzzz s397 +bzzzzzzzzzzzzzzzz s398 +bxxxxxxxxxxxxxxxx s399 +bxxxxxxxxxxxxxxxx s400 +bxxxxxxxxxxxxxxxx s401 +bxxxxxxxxxxxxxxxx s402 +bxxxxxxxxxxxxxxxx s403 +bxxxxxxxxxxxxxxxx s404 +bzzzzzzzzzzzzzzzz s405 +b1111111111111110 s406 +bxxxxxxxxxxxxxxxx s407 +0s408 +zs409 +xs410 +bxxxxxxxxxxxxxxxx s411 +bxxxxxxxxxxxxxxxx s412 +bxxxxxxxxxxxxxxxx s413 +bxxxxxxxxxxxxxxxx s414 +bzzzzzzzzzzzzzzzz s415 +bxxxxxxxxxxxxxxxx s416 +bxxxxxxxxxxxxxxxx s417 +bxxxxxxxxxxxxxxxx s418 +bzzzzzzzzzzzzzzzz s419 +b1111111111111110 s420 +bxxxxxxxxxxxxxxxx s421 +bxxxxxxxxxxxxxxxx s422 +bxxxxxxxxxxxxxxxx s423 +b1111111111111110 s424 +b1111111111111110 s425 +b1111111111111110 s426 +b1111111111111110 s427 +bzzzzzzzzzzzzzzzz s428 +bxxxxxxxxxxxxxxxx s429 +bxxxxxxxxxxxxxxxx s430 +bxxxxxxxxxxxxxxxx s431 +bxxxxxxxxxxxxxxxx s432 +bxxxxxxxxxxxxxxxx s433 +bxxxxxxxxxxxxxxxx s434 +bzzzzzzzzzzzzzzzz s435 +bzzzzzzzzzzzzzzzz s436 +bxxxxxxxxxxxxxxxx s437 +bxxxxxxxxxxxxxxxx s438 +bxxxxxxxxxxxxxxxx s439 +bxxxxxxxxxxxxxxxx s440 +bxxxxxxxxxxxxxxxx s441 +bxxxxxxxxxxxxxxxx s442 +bxxxxxxxxxxxxxxxx s443 +bxxxxxxxxxxxxxxxx s444 +bxxxxxxxxxxxxxxxx s445 +bzzzzzzzzzzzzzzzz s446 +bzzzzzzzzzzzzzzzz s447 +bxxxxxxxxxxxxxxxx s448 +bxxxxxxxxxxxxxxxx s449 +bxxxxxxxxxxxxxxxx s450 +bxxxxxxxxxxxxxxxx s451 +bxxxxxxxxxxxxxxxx s452 +bxxxxxxxxxxxxxxxx s453 +bzzzzzzzzzzzzzzzz s454 +b0000000000000001 s455 +b0000000000000000 s456 +0s457 +zs458 +xs459 +bxxxxxxxxxxxxxxxx s460 +bxxxxxxxxxxxxxxxx s461 +bxxxxxxxxxxxxxxxx s462 +bxxxxxxxxxxxxxxxx s463 +bzzzzzzzzzzzzzzzz s464 +bxxxxxxxxxxxxxxxx s465 +bxxxxxxxxxxxxxxxx s466 +bxxxxxxxxxxxxxxxx s467 +bzzzzzzzzzzzzzzzz s468 +b0000000000000001 s469 +b0000000000000000 s470 +bxxxxxxxxxxxxxxxx s471 +bxxxxxxxxxxxxxxxx s472 +b0000000000000001 s473 +b0000000000000001 s474 +b0000000000000001 s475 +b0000000000000001 s476 +bzzzzzzzzzzzzzzzz s477 +bxxxxxxxxxxxxxxxx s478 +bxxxxxxxxxxxxxxxx s479 +bxxxxxxxxxxxxxxxx s480 +bxxxxxxxxxxxxxxxx s481 +bxxxxxxxxxxxxxxxx s482 +bxxxxxxxxxxxxxxxx s483 +bzzzzzzzzzzzzzzzz s484 +bzzzzzzzzzzzzzzzz s485 +b0000000000000000 s486 +b0000000000000000 s487 +b0000000000000000 s488 +bxxxxxxxxxxxxxxxx s489 +bxxxxxxxxxxxxxxxx s490 +bxxxxxxxxxxxxxxxx s491 +bxxxxxxxxxxxxxxxx s492 +bxxxxxxxxxxxxxxxx s493 +bxxxxxxxxxxxxxxxx s494 +bzzzzzzzzzzzzzzzz s495 +bzzzzzzzzzzzzzzzz s496 +bxxxxxxxxxxxxxxxx s497 +bxxxxxxxxxxxxxxxx s498 +bxxxxxxxxxxxxxxxx s499 +bxxxxxxxxxxxxxxxx s500 +bxxxxxxxxxxxxxxxx s501 +bxxxxxxxxxxxxxxxx s502 +bzz s503 +0s504 +zs505 +bxxxxxxxxxxxxxxxx s506 +xs507 +xs508 +xs509 +zs510 +0s511 +1s512 +xs513 +0s514 +zs515 +zs516 +0s517 +1s518 +zs519 +0s520 +zs521 +zs522 +b0000000000000000 s523 +1s524 +bxxxxxxxxxxxxxxxx s525 +0s526 +bzzzzzzzzzzzzzzzz s527 +zs528 +b0000000000000000 s529 +1s530 +bxxxxxxxxxxxxxxxx s531 +0s532 +bzzzzzzzzzzzzzzzz s533 +zs534 +b0000000000000000 s535 +1s536 +bxxxxxxxxxxxxxxxx s537 +0s538 +bzzzzzzzzzzzzzzzz s539 +bzzzzzzzzzzzzzzzz s540 +bzzzzzzzzzzzzzzzz s541 +bzzzzzzzzzzzzzzzz s542 +bxxxxxxxxxxxxxxxx s543 +bxxxxxxxxxxxxxxxx s544 +bxxxxxxxxxxxxxxxx s545 +zs546 +b0000000000000000 s547 +b0000000000000000 s548 +1s549 +bxxxxxxxxxxxxxxxx s550 +bxxxxxxxxxxxxxxxx s551 +0s552 +bzzzzzzzzzzzzzzzz s553 +bzzzzzzzzzzzzzzzz s554 +bzzzzzzzzzzzzzzzz s555 +b0000000000000001 s556 +bxxxxxxxxxxxxxxxx s557 +bxxxxxxxxxxxxxxxx s558 +bxxxxxxxxxxxxxxxx s559 +b0000000000000001 s560 +bxxxxxxxxxxxxxxxx s561 +bxxxxxxxxxxxxxxxx s562 +zs563 +b0000000000000000 s564 +b0000000000000000 s565 +1s566 +b0000000000000001 s567 +bxxxxxxxxxxxxxxxx s568 +0s569 +bzzzzzzzzzzzzzzzz s570 +bzzzzzzzzzzzzzzzz s571 +bzzzzzzzzzzzzzzzz s572 +bzzzzzzzzzzzzzzzz s573 +bzzzzzzzzzzzzzzzz s574 +bxxxxxxxxxxxxxxxx s575 +bxxxxxxxxxxxxxxxx s576 +bxxxxxxxxxxxxxxxx s577 +bxxxxxxxxxxxxxxxx s578 +bxxxxxxxxxxxxxxxx s579 +bxxxxxxxxxxxxxxxx s580 +bxxxxxxxxxxxxxxxx s581 +bxxxxxxxxxxxxxxxx s582 +xs583 +zs584 +b0000000000000000 s585 +b0000000000000000 s586 +1s587 +bxxxxxxxxxxxxxxxx s588 +bxxxxxxxxxxxxxxxx s589 +0s590 +bzzzzzzzzzzzzzzzz s591 +bzzzzzzzzzzzzzzzz s592 +bzzzzzzzzzzzzzzzz s593 +bzzzzzzzzzzzzzzzz s594 +bzzzzzzzzzzzzzzzz s595 +bxxxxxxxxxxxxxxxx s596 +bxxxxxxxxxxxxxxxx s597 +bxxxxxxxxxxxxxxxx s598 +zs599 +b0000000000000000 s600 +b0000000000000000 s601 +1s602 +bxxxxxxxxxxxxxxxx s603 +bxxxxxxxxxxxxxxxx s604 +0s605 +bzzzzzzzzzzzzzzzz s606 +bzzzzzzzzzzzzzzzz s607 +bzzzzzzzzzzzzzzzz s608 +b0000000000000010 s609 +bxxxxxxxxxxxxxxxx s610 +bxxxxxxxxxxxxxxxx s611 +bxxxxxxxxxxxxxxxx s612 +b0000000000000010 s613 +bxxxxxxxxxxxxxxxx s614 +bxxxxxxxxxxxxxxxx s615 +zs616 +b0000000000000000 s617 +b0000000000000000 s618 +1s619 +b0000000000000010 s620 +bxxxxxxxxxxxxxxxx s621 +0s622 +bzzzzzzzzzzzzzzzz s623 +bzzzzzzzzzzzzzzzz s624 +bzzzzzzzzzzzzzzzz s625 +bzzzzzzzzzzzzzzzz s626 +bzzzzzzzzzzzzzzzz s627 +bxxxxxxxxxxxxxxxx s628 +bxxxxxxxxxxxxxxxx s629 +bxxxxxxxxxxxxxxxx s630 +bxxxxxxxxxxxxxxxx s631 +bxxxxxxxxxxxxxxxx s632 +bxxxxxxxxxxxxxxxx s633 +bxxxxxxxxxxxxxxxx s634 +bxxxxxxxxxxxxxxxx s635 +xs636 +zs637 +b0000000000000000 s638 +b0000000000000000 s639 +1s640 +bxxxxxxxxxxxxxxxx s641 +bxxxxxxxxxxxxxxxx s642 +0s643 +bzzzzzzzzzzzzzzzz s644 +bzzzzzzzzzzzzzzzz s645 +bzzzzzzzzzzzzzzzz s646 +bzzzzzzzzzzzzzzzz s647 +bzzzzzzzzzzzzzzzz s648 +bxxxxxxxxxxxxxxxx s649 +bxxxxxxxxxxxxxxxx s650 +bxxxxxxxxxxxxxxxx s651 +zs652 +b0000000000000000 s653 +b0000000000000000 s654 +1s655 +bxxxxxxxxxxxxxxxx s656 +bxxxxxxxxxxxxxxxx s657 +0s658 +bzzzzzzzzzzzzzzzz s659 +bzzzzzzzzzzzzzzzz s660 +bzzzzzzzzzzzzzzzz s661 +b0000000000000001 s662 +b0000000000000000 s663 +bxxxxxxxxxxxxxxxx s664 +bxxxxxxxxxxxxxxxx s665 +b0000000000000001 s666 +b0000000000000000 s667 +bxxxxxxxxxxxxxxxx s668 +zs669 +b0000000000000000 s670 +b0000000000000000 s671 +1s672 +b0000000000000001 s673 +bxxxxxxxxxxxxxxxx s674 +0s675 +bzzzzzzzzzzzzzzzz s676 +bzzzzzzzzzzzzzzzz s677 +bzzzzzzzzzzzzzzzz s678 +bzzzzzzzzzzzzzzzz s679 +bzzzzzzzzzzzzzzzz s680 +bxxxxxxxxxxxxxxxx s681 +bxxxxxxxxxxxxxxxx s682 +bxxxxxxxxxxxxxxxx s683 +bxxxxxxxxxxxxxxxx s684 +bxxxxxxxxxxxxxxxx s685 +bxxxxxxxxxxxxxxxx s686 +bxxxxxxxxxxxxxxxx s687 +bxxxxxxxxxxxxxxxx s688 +xs689 +zs690 +b0000000000000000 s691 +b0000000000000000 s692 +1s693 +b0000000000000000 s694 +bxxxxxxxxxxxxxxxx s695 +0s696 +bzzzzzzzzzzzzzzzz s697 +bzzzzzzzzzzzzzzzz s698 +zs699 +b00000000 s700 +1s701 +bxxxxxxxx s702 +0s703 +bzzzzzzzz s704 +zs705 +0s706 +1s707 +xs708 +0s709 +zs710 +zs711 +0s712 +1s713 +zs714 +0s715 +zs716 +zs717 +b0000000000000000 s718 +1s719 +bxxxxxxxxxxxxxxxx s720 +0s721 +bzzzzzzzzzzzzzzzz s722 +zs723 +b0000000000000000 s724 +1s725 +bxxxxxxxxxxxxxxxx s726 +0s727 +bzzzzzzzzzzzzzzzz s728 +zs729 +b0000000000000000 s730 +1s731 +bxxxxxxxxxxxxxxxx s732 +0s733 +bzzzzzzzzzzzzzzzz s734 +bzzzzzzzzzzzzzzzz s735 +bzzzzzzzzzzzzzzzz s736 +bzzzzzzzzzzzzzzzz s737 +bxxxxxxxxxxxxxxxx s738 +bxxxxxxxxxxxxxxxx s739 +bxxxxxxxxxxxxxxxx s740 +zs741 +b0000000000000000 s742 +b0000000000000000 s743 +1s744 +bxxxxxxxxxxxxxxxx s745 +bxxxxxxxxxxxxxxxx s746 +0s747 +bzzzzzzzzzzzzzzzz s748 +bzzzzzzzzzzzzzzzz s749 +bzzzzzzzzzzzzzzzz s750 +b0000000000000001 s751 +bxxxxxxxxxxxxxxxx s752 +bxxxxxxxxxxxxxxxx s753 +bxxxxxxxxxxxxxxxx s754 +b0000000000000001 s755 +bxxxxxxxxxxxxxxxx s756 +bxxxxxxxxxxxxxxxx s757 +zs758 +b0000000000000000 s759 +b0000000000000000 s760 +1s761 +b0000000000000001 s762 +bxxxxxxxxxxxxxxxx s763 +0s764 +bzzzzzzzzzzzzzzzz s765 +bzzzzzzzzzzzzzzzz s766 +bzzzzzzzzzzzzzzzz s767 +bzzzzzzzzzzzzzzzz s768 +bzzzzzzzzzzzzzzzz s769 +bxxxxxxxxxxxxxxxx s770 +bxxxxxxxxxxxxxxxx s771 +bxxxxxxxxxxxxxxxx s772 +bxxxxxxxxxxxxxxxx s773 +bxxxxxxxxxxxxxxxx s774 +bxxxxxxxxxxxxxxxx s775 +bxxxxxxxxxxxxxxxx s776 +bxxxxxxxxxxxxxxxx s777 +xs778 +zs779 +b0000000000000000 s780 +b0000000000000000 s781 +1s782 +bxxxxxxxxxxxxxxxx s783 +bxxxxxxxxxxxxxxxx s784 +0s785 +bzzzzzzzzzzzzzzzz s786 +bzzzzzzzzzzzzzzzz s787 +bzzzzzzzzzzzzzzzz s788 +bzzzzzzzzzzzzzzzz s789 +bzzzzzzzzzzzzzzzz s790 +bxxxxxxxxxxxxxxxx s791 +bxxxxxxxxxxxxxxxx s792 +bxxxxxxxxxxxxxxxx s793 +zs794 +b0000000000000000 s795 +b0000000000000000 s796 +1s797 +bxxxxxxxxxxxxxxxx s798 +bxxxxxxxxxxxxxxxx s799 +0s800 +bzzzzzzzzzzzzzzzz s801 +bzzzzzzzzzzzzzzzz s802 +bzzzzzzzzzzzzzzzz s803 +b1111111111111110 s804 +bxxxxxxxxxxxxxxxx s805 +bxxxxxxxxxxxxxxxx s806 +bxxxxxxxxxxxxxxxx s807 +b1111111111111110 s808 +bxxxxxxxxxxxxxxxx s809 +bxxxxxxxxxxxxxxxx s810 +zs811 +b0000000000000000 s812 +b0000000000000000 s813 +1s814 +b1111111111111110 s815 +bxxxxxxxxxxxxxxxx s816 +0s817 +bzzzzzzzzzzzzzzzz s818 +bzzzzzzzzzzzzzzzz s819 +bzzzzzzzzzzzzzzzz s820 +bzzzzzzzzzzzzzzzz s821 +bzzzzzzzzzzzzzzzz s822 +bxxxxxxxxxxxxxxxx s823 +bxxxxxxxxxxxxxxxx s824 +bxxxxxxxxxxxxxxxx s825 +bxxxxxxxxxxxxxxxx s826 +bxxxxxxxxxxxxxxxx s827 +bxxxxxxxxxxxxxxxx s828 +bxxxxxxxxxxxxxxxx s829 +bxxxxxxxxxxxxxxxx s830 +xs831 +zs832 +b0000000000000000 s833 +b0000000000000000 s834 +1s835 +bxxxxxxxxxxxxxxxx s836 +bxxxxxxxxxxxxxxxx s837 +0s838 +bzzzzzzzzzzzzzzzz s839 +bzzzzzzzzzzzzzzzz s840 +bzzzzzzzzzzzzzzzz s841 +bzzzzzzzzzzzzzzzz s842 +bzzzzzzzzzzzzzzzz s843 +bxxxxxxxxxxxxxxxx s844 +bxxxxxxxxxxxxxxxx s845 +bxxxxxxxxxxxxxxxx s846 +zs847 +b0000000000000000 s848 +b0000000000000000 s849 +1s850 +bxxxxxxxxxxxxxxxx s851 +bxxxxxxxxxxxxxxxx s852 +0s853 +bzzzzzzzzzzzzzzzz s854 +bzzzzzzzzzzzzzzzz s855 +bzzzzzzzzzzzzzzzz s856 +b0000000000000001 s857 +b0000000000000000 s858 +bxxxxxxxxxxxxxxxx s859 +bxxxxxxxxxxxxxxxx s860 +b0000000000000001 s861 +b0000000000000000 s862 +bxxxxxxxxxxxxxxxx s863 +zs864 +b0000000000000000 s865 +b0000000000000000 s866 +1s867 +b0000000000000001 s868 +bxxxxxxxxxxxxxxxx s869 +0s870 +bzzzzzzzzzzzzzzzz s871 +bzzzzzzzzzzzzzzzz s872 +bzzzzzzzzzzzzzzzz s873 +bzzzzzzzzzzzzzzzz s874 +bzzzzzzzzzzzzzzzz s875 +bxxxxxxxxxxxxxxxx s876 +bxxxxxxxxxxxxxxxx s877 +bxxxxxxxxxxxxxxxx s878 +bxxxxxxxxxxxxxxxx s879 +bxxxxxxxxxxxxxxxx s880 +bxxxxxxxxxxxxxxxx s881 +bxxxxxxxxxxxxxxxx s882 +bxxxxxxxxxxxxxxxx s883 +xs884 +zs885 +b0000000000000000 s886 +b0000000000000000 s887 +1s888 +b0000000000000000 s889 +bxxxxxxxxxxxxxxxx s890 +0s891 +bzzzzzzzzzzzzzzzz s892 +bzzzzzzzzzzzzzzzz s893 +$end +#0 +0s63 +1s409 +1s126 +1s516 +b0000000000000000 s13 +1s847 +1s699 +1s758 +1s458 +0s282 +b0000000000000000 s36 +0s5 +1s330 +0s80 +0s48 +1s723 +0s290 +0s107 +0s24 +0s17 +1s811 +1s108 +1s39 +1s652 +0s37 +0s341 +0s2 +1s729 +1s669 +1s224 +1s794 +1s563 +b0000000000000000 s4 +1s616 +0s6 +1s584 +1s864 +1s705 +b000000000000000000 s15 +1s112 +1s350 +0s298 +b0000000000000000 s22 +b0000000000000000 s56 +0s62 +1s120 +1s637 +1s832 +1s324 +1s82 +1s60 +1s360 +1s522 +b0000000000000000 s14 +1s346 +b0000000000000000 s99 +1s338 +0s16 +b100000000000000000 s23 +0s49 +b0000000000000000 s3 +1s1 +1s505 +1s354 +0s91 +1s741 +b0000000000000000 s21 +1s534 +1s271 +1s175 +1s717 +b0000000000000000 s79 +1s342 +0s25 +1s779 +0s714 +0s92 +1s104 +1s116 +1s711 +1s528 +1s885 +1s690 +0s519 +0s61 +1s599 +1s510 +1s546 +#5 +b0000000000000000 s596 +b0000000000000000 s121 +1s514 +b0000000000000000 s264 +b0000000000000000 s256 +0s831 +b0000000000000000 s818 +0s100 +b0000000000000000 s736 +b00000000 s326 +1s359 +b0000000000000000 s726 +b0000000000000000 s668 +1s721 +b0000000000000000 s806 +b0000000000000000 s263 +b0000000000000000 s490 +0s176 +0s65 +1s0 +0s459 +b0000000000000000 s115 +b0000000000000000 s845 +b0000000000000000 s97 +b0000000000000000 s196 +b0000000000000000 s228 +1s643 +b0000000000000000 s684 +b0000000000000000 s873 +b0000000000000000 s461 +b0000000000000000 s130 +b0000000000000000 s170 +b0000000000000000 s370 +b0000000000000000 s432 +b0000000000000000 s480 +b0000000000000000 s869 +b0000000000000000 s595 +1s270 +b0000000000000000 s801 +b0000000000000000 s752 +1s870 +b0000000000000000 s495 +b0000000000000000 s445 +b0000000000000000 s379 +1s703 +b0000000000000000 s822 +b0000000000000000 s623 +b0000000000000000 s157 +b0000000000000000 s732 +b0000000000000000 s604 +b0000000000000000 s880 +b0000000000000000 s844 +b0000000000000000 s356 +1s348 +b0000000000000000 s265 +b0000000000000000 s648 +b0000000000000000 s641 +b0000000000000000 s93 +b0000000000000000 s843 +b0000000000000000 s790 +b0000000000000000 s645 +0s583 +b0000000000000000 s786 +0s716 +b00000000 s323 +1s658 +b0000000000000000 s448 +b0000000000000000 s863 +b0000000000000000 s158 +b0000000000000000 s161 +0s40 +b0000000000000000 s436 +b0000000000000000 s846 +0s225 +b0000000000000000 s366 +b0000000000000000 s44 +b0000000000000000 s823 +b0000000000000000 s258 +0s20 +b0000000000000000 s627 +b0000000000000000 s353 +b0000000000000000 s447 +b0000000000000000 s757 +0s109 +b0000000000000000 s452 +b0000000000000000 s525 +b0000000000000000 s827 +0s90 +b0000000000000000 s394 +b0000000000000000 s372 +b0000000000000000 s201 +b0000000000000000 s156 +b0000000000000000 s825 +b0000000000000000 s561 +b00000000 s325 +b0000000000000000 s677 +b0000000000000000 s151 +b0000000000000000 s362 +b0000000000000000 s882 +b0000000000000000 s247 +b0000000000000000 s345 +b0000000000000000 s205 +b0000000000000000 s647 +b0000000000000000 s203 +b0000000000000000 s51 +1s110 +b0000000000000000 s540 +b0000000000000000 s629 +b0000000000000000 s467 +b0000000000000000 s166 +b0000000000000000 s676 +1s408 +b0000000000000000 s765 +b0000000000000000 s182 +b0000000000000000 s396 +b0000000000000000 s575 +b0000000000000000 s550 +b0000000000000000 s8 +b0000000000000000 s398 +b0000000000000000 s494 +b0000000000000000 s262 +0s35 +b0000000000000000 s413 +b0000000000000000 s580 +b0000000000000000 s255 +b0000000000000000 s828 +0s710 +b0000000000000000 s577 +b0000000000000000 s533 +b0000000000000000 s234 +b0000000000000000 s763 +b0000000000000000 s683 +0s343 +b0000000000000000 s54 +b0000000000000000 s393 +b0000000000000000 s631 +b0000000000000000 s695 +b0000000000000000 s405 +b0000000000000000 s260 +b0000000000000000 s625 +0s306 +b0000000000000000 s367 +b0000000000000000 s96 +b0000000000000000 s603 +b0000000000000000 s482 +b0000000000000000 s837 +b0000000000000000 s364 +b0000000000000000 s250 +b0000000000000000 s423 +b0000000000000000 s852 +b0000000000000000 s877 +b0000000000000000 s739 +b0000000000000000 s215 +b0000000000000000 s493 +b0000000000000000 s816 +b0000000000000000 s259 +b0000000000000000 s826 +b0000000000000000 s571 +b0000000000000000 s576 +b0000000000000000 s386 +1s102 +b0000000000000000 s612 +b0000000000000000 s428 +b0000000000000000 s164 +0s521 +1s817 +b0000000000000000 s403 +b0000000000000000 s454 +1s853 +1s709 +b0000000000000000 s841 +b0000000000000000 s230 +b000 s68 +b0000000000000000 s472 +1s538 +0s86 +b0000000000000000 s798 +b0000000000000000 s418 +b0000000000000000 s382 +0s636 +b0000000000000000 s374 +b0000000000000000 s491 +0s88 +b0000000000000000 s231 +b0000000000000000 s204 +b0000000000000000 s851 +b0000000000000000 s185 +0s339 +b0000000000000000 s594 +b0000000000000000 s646 +b0000000000000000 s180 +b0000000000000000 s876 +b0000000000000000 s208 +b0000000000000000 s412 +b0000000000000000 s775 +b0000000000000000 s606 +b0000000000000000 s214 +b0000000000000000 s679 +b00000000 s71 +b0000000000000000 s737 +b0000000000000000 s574 +b0000000000000000 s216 +b0000000000000000 s635 +b0000000000000000 s149 +b0000000000000000 s199 +0s69 +b0000000000000000 s85 +b0000000000000000 s478 +b0000000000000000 s181 +b0000000000000000 s245 +b0000000000000000 s477 +b0000000000000000 s656 +b0000000000000000 s632 +b0000000000000000 s128 +b0000000000000000 s750 +1s552 +b0000000000000000 s591 +0s43 +1s336 +b0000000000000000 s194 +b0000000000000000 s824 +b0000000000000000 s836 +b0000000000000000 s207 +b0000000000000000 s859 +b0000000000000000 s440 +b0000000000000000 s50 +b0000000000000000 s492 +b0000000000000000 s539 +b0000000000000000 s688 +b0000000000000000 s608 +b0000000000000000 s659 +b0000000000000000 s545 +b0000000000000000 s369 +b0000000000000000 s437 +b0000000000000000 s129 +b0000000000000000 s363 +b00000000 s70 +b0000000000000000 s537 +1s696 +b0000000000000000 s735 +b0000000000000000 s160 +b0000000000000000 s788 +b0000000000000000 s380 +1s891 +b0000000000000000 s809 +1s715 +b0000000000000000 s787 +b0000000000000000 s227 +1s785 +1s520 +b0000000000000000 s610 +b0000000000000000 s389 +1s800 +1s457 +b000 s321 +1s526 +b0000000000000000 s392 +b0000000000000000 s748 +b0000000000000000 s401 +b000 s11 +b0000000000000000 s257 +b0000000000000000 s138 +b0000000000000000 s95 +b0000000000000000 s443 +b00000000 s704 +b0000000000000000 s607 +b0000000000000000 s419 +b0000000000000000 s557 +0s708 +0s689 +b0000000000000000 s881 +0s513 +b0000000000000000 s682 +b0000000000000000 s442 +b0000000000000000 s807 +b0000000000000000 s678 +1s764 +b0000000000000000 s749 +b0000000000000000 s628 +b0000000000000000 s238 +b0000000000000000 s434 +0s57 +1s340 +1s334 +b0000000000000000 s249 +b0000000000000000 s633 +b0000000000000000 s551 +0s361 +b0000000000000000 s558 +b0000000000000000 s484 +b0000000000000000 s573 +b0000000000000000 s541 +b0000000000000000 s879 +b0000000000000000 s481 +b0000000000000000 s385 +b0000000000000000 s131 +b0000000000000000 s184 +b00000001 s328 +b0000000000000000 s179 +b0000000000000000 s582 +b0000000000000000 s819 +b0000000000000000 s554 +b0000000000000000 s878 +b0000000000000000 s855 +b0000000000000000 s634 +b0000000000000000 s177 +b0000000000000000 s220 +1s605 +0s515 +b0000000000000000 s400 +b0000000000000000 s217 +b0000000000000000 s698 +b0000000000000000 s139 +b0000000000000000 s883 +b0000000000000000 s783 +1s727 +b0000000000000000 s421 +0s320 +b0000000000000000 s614 +0s89 +b0000000000000000 s621 +1s838 +b0000000000000000 s562 +b0000000000000000 s805 +b0000000000000000 s243 +b0000000000000000 s893 +1s504 +b0000000000000000 s414 +b0000000000000000 s464 +b0000000000000000 s756 +b0000000000000000 s119 +b0000000000000000 s555 +0s778 +b0000000000000000 s789 +b0000000000000000 s686 +b0000000000000000 s117 +b0000000000000000 s685 +b0000000000000000 s402 +b0000000000000000 s383 +b0000000000000000 s463 +b0000000000000000 s746 +1s344 +b0000000000000000 s581 +b0000000000000000 s722 +b0000000000000000 s251 +0s47 +b0000000000000000 s438 +b0000000000000000 s391 +b0000000000000000 s768 +b0000000000000000 s349 +0s329 +1s38 +1s733 +b0000000000000000 s871 +b000 s333 +b0000000000000000 s593 +b00000000 s702 +b0000000000000000 s113 +b0000000000000000 s771 +b0000000000000000 s373 +b0000000000000000 s132 +b0000000000000000 s650 +b0000000000000000 s52 +b0000000000000000 s19 +1s675 +b0000000000000000 s776 +b0000000000000000 s543 +b0000000000000000 s150 +b0000000000000000 s189 +b0000000000000000 s854 +1s322 +b0000000000000000 s433 +b0000000000000000 s856 +b0000000000000000 s820 +b0000000000000000 s124 +b0000000000000000 s875 +b0000000000000000 s368 +b0000000000000000 s753 +0s45 +b0000000000000000 s810 +b0000000000000000 s611 +b0000000000000000 s444 +b0000000000000000 s146 +b0000000000000000 s821 +b0000000000000000 s830 +1s569 +b0000000000000000 s155 +b0000000000000000 s597 +b0000000000000000 s135 +b000 s67 +b0000000000000000 s460 +b0000000000000000 s188 +b0000000000000000 s195 +b0000000000000000 s206 +b0000000000000000 s892 +b0000000000000000 s165 +0s64 +b0000000000000000 s358 +b0000000000000000 s740 +b0000000000000000 s198 +0s884 +b0000000000000000 s145 +b0000000000000000 s720 +b0000000000000000 s734 +b0000000000000000 s167 +b0000000000000000 s219 +b0000000000000000 s430 +b0000000000000000 s588 +b0000000000000000 s446 +1s106 +b0000000000000000 s210 +b0000000000000000 s218 +b0000000000000000 s496 +b0000000000000000 s397 +b0000000000000000 s173 +b0000000000000000 s351 +b0000000000000000 s55 +b0000000000000000 s766 +b0000000000000000 s874 +b0000000000000000 s466 +b0000000000000000 s624 +1s590 +b0000000000000000 s232 +b0000000000000000 s860 +b0000000000000000 s395 +b000 s335 +b0000000000000000 s154 +b0000000000000000 s451 +b0000000000000000 s140 +b000 s276 +b0000000000000000 s579 +b0000000000000000 s769 +b0000000000000000 s136 +b0000000000000000 s197 +b0000000000000000 s674 +0s9 +b0000000000000000 s644 +b0000000000000000 s745 +b0000000000000000 s381 +b0000000000000000 s489 +b0000000000000000 s133 +b0000000000000000 s697 +b0000000000000000 s842 +b0000000000000000 s163 +b0000000000000000 s468 +b0000000000000000 s626 +b0000000000000000 s829 +0s105 +b0000000000000000 s212 +b0000000000000000 s411 +b0000000000000000 s355 +b0000000000000000 s168 +b0000000000000000 s657 +b0000000000000000 s651 +b0000000000000000 s664 +b0000000000000000 s435 +b0000000000000000 s388 +b0000000000000000 s498 +0s103 +b0000000000000000 s431 +b0000000000000000 s661 +b0000000000000000 s483 +b0000000000000000 s178 +0s46 +b0000000000000000 s148 +b0000000000000000 s485 +b0000000000000000 s568 +b0000000000000000 s42 +b0000000000000000 s553 +0s410 +b0000000000000000 s417 +b0000000000000000 s387 +b0000000000000000 s147 +b0000000000000000 s267 +b0000000000000000 s572 +b0000000000000000 s578 +b0000000000000000 s799 +b0000000000000000 s237 +b0000000000000000 s462 +b0000000000000000 s441 +b0000000000000000 s246 +0s337 +1s81 +b0000000000000000 s429 +b0000000000000000 s87 +b0000000000000000 s687 +b0000000000000000 s839 +b0000000000000000 s152 +b0000000000000000 s592 +b0000000000000000 s660 +0s83 +b0000000000000000 s501 +b0000000000000000 s211 +b0000000000000000 s589 +b0000000000000000 s390 +1s223 +b0000000000000000 s754 +b0000000000000000 s598 +1s174 +b0000000000000000 s630 +1s114 +b0000000000000000 s791 +1s125 +b0000000000000000 s449 +b0000000000000000 s681 +b0000000000000000 s793 +b0000000000000000 s134 +b0000000000000000 s642 +b0000000000000000 s153 +b0000000000000000 s615 +b0000000000000000 s183 +1s532 +b0000000000000000 s772 +b0000000000000000 s500 +b0000000000000000 s384 +b0000000000000000 s890 +b0000000000000000 s649 +b0000000000000000 s187 +b0000000000000000 s665 +b0000000000000000 s416 +b0000000000000000 s202 +b0000000000000000 s266 +b0000000000000000 s122 +b0000000000000000 s407 +b0000000000000000 s465 +b0000000000000000 s268 +b0000000000000000 s527 +0s127 +b0000000000000000 s209 +b0000000000000000 s94 +b0000000000000000 s53 +b0000000000000000 s111 +b0000000000000000 s229 +b0000000000000000 s777 +b0000000000000000 s559 +b0000000000000000 s570 +b0000000000000000 s728 +b0000000000000000 s803 +b0000000000000000 s502 +1s352 +b0000000000000000 s439 +b0000000000000000 s531 +b0000000000000000 s248 +b0000000000000000 s200 +b0000000000000000 s399 +b0000000000000000 s213 +b0000000000000000 s872 +b0000000000000000 s479 +b0000000000000000 s840 +b000 s73 +b0000000000000000 s226 +1s747 +0s318 +b0000000000000000 s784 +b0000000000000000 s774 +0s10 +b0000000000000000 s261 +b0000000000000000 s471 +0s66 +b0000000000000000 s453 +1s622 +b0000000000000000 s415 +b0000000000000000 s233 +b0000000000000000 s7 +b0000000000000000 s159 +b0000000000000000 s169 +b0000000000000000 s767 +b0000000000000000 s404 +b0000000000000000 s347 +1s118 +1s59 +b0000000000000000 s542 +b0000000000000000 s244 +b0000000000000000 s365 +b0000000000000000 s499 +b0000000000000000 s544 +b0000000000000000 s171 +b0000000000000000 s802 +b0000000000000000 s98 +b0000000000000000 s450 +b0000000000000000 s680 +0s319 +b0000000000000000 s770 +b0000000000000000 s792 +b0000000000000000 s422 +b0000000000000000 s773 +b0000000000000000 s497 +b0000000000000000 s162 +b0000000000000000 s12 +b00000001 s72 +b0000000000000000 s738 +#10 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#15 +0s126 +1s514 +0s516 +0s847 +0s758 +0s699 +0s458 +1s359 +0s723 +1s721 +0s811 +1s102 +0s39 +0s652 +1s0 +1s605 +1s817 +0s729 +0s669 +0s224 +1s853 +1s709 +1s643 +1s538 +1s727 +1s838 +0s705 +1s504 +1s270 +0s637 +0s832 +0s324 +0s82 +1s870 +0s360 +0s522 +1s703 +0s1 +1s81 +0s741 +1s348 +1s344 +0s175 +0s779 +1s223 +1s658 +1s552 +1s174 +0s690 +1s38 +1s733 +1s114 +1s336 +0s599 +1s125 +0s409 +1s532 +1s675 +0s330 +1s322 +1s696 +1s891 +0s108 +1s715 +1s785 +1s520 +0s794 +1s800 +1s457 +0s563 +1s569 +0s616 +0s584 +1s352 +1s526 +0s864 +1s110 +0s112 +0s350 +1s747 +1s408 +0s120 +0s60 +1s764 +1s622 +1s106 +0s346 +0s338 +0s505 +0s354 +1s118 +1s59 +1s340 +0s534 +1s334 +0s271 +1s590 +0s717 +0s342 +0s104 +0s116 +0s711 +0s528 +0s885 +0s510 +0s546 +#20 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#25 +1s514 +b0000000000000001 s489 +b0000000000000001 s256 +b1111111111111110 s818 +b1111111111111110 s816 +b0000000000000001 s878 +1s359 +b0000000000000010 s626 +1s721 +b0000000000000001 s490 +1s102 +b1111111111111110 s428 +1s0 +1s605 +1s2 +1s817 +b0000000000000001 s568 +1s853 +1s709 +1s643 +1s538 +1s727 +b0000000000000010 s621 +1s838 +b0000000000000001 s491 +b0000000000000001 s243 +1s504 +b0000000000000001 s869 +1s270 +1s870 +b0000000000000010 s208 +b0000000000000001 s679 +b0000000000000001 s379 +1s703 +b0000000000000010 s623 +b0000000000000001 s157 +b1111111111111110 s441 +1s81 +1s348 +b0000000000000001 s477 +1s344 +b0000000000000001 s391 +1s223 +1s658 +b0000000000000001 s768 +1s552 +1s174 +b0000000000000010 s630 +1s38 +1s733 +1s114 +1s336 +b001 s333 +b0000000000000001 s871 +b0000000000000001 s158 +b0000000000000010 s194 +1s125 +b0000000000000010 s207 +b1111111111111110 s440 +1s532 +b0000000000000001 s772 +1s282 +1s675 +1s322 +1s696 +1s891 +1s715 +b1111111111111110 s825 +1s785 +1s520 +b1111111111111110 s821 +1s800 +1s457 +b0000000000000001 s570 +1s569 +b001 s321 +1s352 +1s526 +b0000000000000001 s392 +b0000000000000010 s206 +b0000000000000001 s257 +1s110 +b0000000000000001 s145 +b001 s73 +1s747 +b0000000000000001 s676 +1s408 +b0000000000000001 s765 +b1111111111111110 s442 +1s764 +1s622 +1s106 +b0000000000000001 s159 +1s118 +1s59 +b0000000000000001 s255 +b0000000000000001 s577 +1s340 +b0000000000000001 s763 +b0000000000000001 s874 +1s334 +1s590 +b0000000000000001 s683 +b0000000000000001 s393 +b0000000000000001 s573 +1s61 +b0000000000000001 s674 +#30 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#35 +1s514 +b0000000000000001 s264 +b0000000000000001 s36 +b1111111111111110 s819 +b0000000000000001 s842 +1s5 +b0000000000000001 s739 +b0000000000000010 s215 +1s80 +1s48 +b0000000000000001 s736 +1s359 +1s290 +1s107 +b0000000000000001 s571 +1s24 +1s721 +1s17 +b0000000000000001 s263 +1s102 +1s176 +1s65 +1s0 +1s459 +1s341 +1s605 +b0000000000000001 s164 +b0000000000000001 s400 +0s2 +b0000000000000001 s498 +1s817 +b0000000000000001 s845 +b0000000000000001 s4 +1s853 +1s709 +1s643 +1s410 +b001 s68 +1s538 +1s727 +1s838 +1s504 +1s270 +b0000000000000010 s594 +1s870 +b0000000000000001 s14 +b1111111111111110 s789 +b0000000000000001 s99 +b0000000000000010 s214 +b110000000000000001 s23 +1s49 +1s703 +b0000000000000010 s216 +1s81 +b0000000000000001 s21 +1s348 +b0000000000000001 s265 +1s344 +b0000000000000001 s79 +1s83 +b0000000000000001 s93 +1s223 +1s658 +1s552 +1s174 +1s38 +1s733 +1s114 +1s336 +b010 s333 +b1111111111111110 s448 +1s125 +b1111111111111110 s449 +1s40 +b0000000000000001 s13 +b0000000000000001 s650 +b0000000000000001 s50 +1s225 +1s532 +0s282 +1s675 +1s322 +b1111111111111110 s447 +1s696 +b0000000000000001 s525 +1s891 +1s127 +1s715 +1s37 +1s785 +1s520 +b0000000000000001 s111 +b0000000000000001 s677 +1s800 +1s457 +b0000000000000001 s345 +1s569 +b0000000000000010 s597 +b010 s321 +b001 s67 +b0000000000000001 s647 +1s352 +1s526 +b0000000000000001 s401 +b001 s11 +b0000000000000001 s165 +1s64 +b0000000000000001 s399 +b0000000000000010 s213 +b0000000000000001 s872 +1s110 +b010000000000000001 s15 +b010 s73 +b0000000000000001 s720 +b0000000000000001 s22 +1s747 +b0000000000000001 s56 +1s318 +b0000000000000001 s166 +1s62 +1s408 +b0000000000000001 s167 +1s764 +1s622 +1s106 +1s16 +b0000000000000001 s3 +b0000000000000001 s398 +b0000000000000001 s496 +b0000000000000001 s262 +1s118 +1s59 +1s91 +b0000000000000001 s766 +1s340 +b0000000000000001 s499 +b0000000000000001 s544 +1s334 +b0000000000000010 s624 +1s590 +1s25 +1s714 +b1111111111111110 s450 +1s361 +b001 s335 +1s92 +b0000000000000001 s541 +1s319 +b1111111111111110 s792 +b0000000000000001 s497 +1s519 +0s61 +b001 s276 +#40 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#45 +1s514 +b0000000000000000 s36 +b0000000000000001 s468 +1s359 +b0000000000000001 s726 +b0000000000000001 s668 +1s721 +1s102 +b0000000000000001 s220 +0s65 +1s0 +b0000000000000001 s664 +1s605 +1s521 +b0000000000000001 s115 +1s817 +1s103 +b0000000000000001 s661 +1s46 +b0000000000000000 s4 +1s853 +b0000000000000001 s454 +1s709 +1s643 +b010 s68 +b0000000000000001 s472 +1s538 +1s727 +1s89 +1s838 +b0000000000000001 s231 +b0000000000000001 s851 +1s504 +1s270 +1s870 +b0000000000000000 s14 +b0000000000000000 s99 +b0000000000000001 s237 +b110000000000000000 s23 +1s703 +1s81 +1s337 +b0000000000000000 s21 +1s348 +1s344 +b0000000000000000 s79 +b0000000000000001 s722 +b0000000000000001 s656 +1s47 +b0000000000000000 s93 +1s223 +1s716 +1s658 +1s552 +1s174 +b0000000000000001 s349 +1s38 +1s733 +1s114 +1s336 +b0000000000000001 s863 +b0000000000000001 s113 +1s125 +b0000000000000001 s859 +b0000000000000000 s13 +b0000000000000000 s50 +1s532 +b0000000000000001 s52 +1s675 +b0000000000000001 s665 +1s322 +b0000000000000001 s856 +1s696 +1s109 +b0000000000000000 s525 +1s891 +1s90 +b0000000000000001 s465 +b0000000000000001 s527 +1s715 +b0000000000000001 s94 +1s785 +1s520 +b0000000000000000 s111 +1s800 +1s457 +b0000000000000000 s345 +1s569 +b010 s67 +1s352 +1s526 +b0000000000000001 s531 +b010 s11 +b0000000000000001 s51 +b0000000000000001 s95 +1s110 +b010000000000000000 s15 +b0000000000000000 s720 +b0000000000000000 s22 +b0000000000000001 s467 +1s747 +1s708 +b0000000000000000 s56 +1s408 +1s513 +b0000000000000001 s471 +1s764 +1s622 +1s106 +b0000000000000001 s233 +b0000000000000000 s3 +b0000000000000001 s347 +b0000000000000001 s238 +1s118 +1s59 +1s340 +b0000000000000001 s234 +b0000000000000001 s466 +1s334 +1s590 +1s343 +b0000000000000001 s232 +b0000000000000001 s860 +b010 s335 +0s319 +b010 s276 +#50 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#55 +1s514 +b0000000000000001 s423 +b0000000000000001 s852 +1s100 +b0000000000000001 s877 +b0000000000000001 s493 +b0000000000000000 s468 +b0000000000000001 s259 +1s359 +b0000000000000000 s726 +b0000000000000000 s668 +1s105 +1s721 +b1111111111111110 s806 +b0000000000000001 s657 +b0000000000000001 s612 +1s102 +b0000000000000000 s220 +1s0 +b0000000000000000 s664 +1s605 +1s515 +b0000000000000000 s115 +1s817 +b0000000000000001 s97 +b0000000000000000 s661 +1s853 +b0000000000000000 s454 +1s709 +b0000000000000001 s883 +1s643 +b0000000000000000 s472 +1s538 +1s86 +1s727 +b0000000000000001 s873 +b1111111111111110 s798 +b1111111111111110 s418 +b1111111111111110 s417 +1s838 +1s88 +b0000000000000000 s231 +b0000000000000000 s851 +b0000000000000001 s185 +1s504 +1s339 +1s270 +b0000000000000001 s119 +b0000000000000001 s876 +1s870 +b0000000000000001 s495 +b0000000000000000 s237 +b0000000000000001 s686 +1s703 +b0000000000000001 s117 +b0000000000000001 s685 +b0000000000000001 s732 +1s81 +b0000000000000001 s478 +b0000000000000001 s880 +b0000000000000001 s245 +1s348 +1s344 +b0000000000000000 s722 +b0000000000000000 s656 +1s223 +1s658 +1s552 +1s174 +b0000000000000000 s349 +1s38 +1s43 +1s733 +1s114 +1s336 +b0000000000000000 s863 +b0000000000000000 s113 +1s125 +b0000000000000001 s681 +b0000000000000000 s859 +b0000000000000010 s615 +b0000000000000010 s183 +b0000000000000001 s492 +1s532 +b0000000000000001 s688 +b0000000000000001 s659 +b0000000000000001 s608 +b0000000000000001 s258 +b0000000000000000 s52 +1s675 +1s20 +b0000000000000000 s665 +b1111111111111110 s416 +b0000000000000001 s189 +b0000000000000001 s353 +b0000000000000001 s854 +1s322 +b0000000000000001 s537 +b0000000000000000 s856 +1s696 +1s891 +b0000000000000000 s465 +1s45 +b1111111111111110 s810 +b0000000000000000 s527 +b0000000000000010 s611 +1s715 +b0000000000000000 s94 +1s785 +1s520 +b0000000000000001 s53 +1s800 +1s457 +b0000000000000001 s728 +1s569 +b0000000000000001 s803 +1s352 +b0000000000000001 s188 +1s526 +b0000000000000000 s531 +b0000000000000000 s51 +b0000000000000000 s95 +b0000000000000001 s479 +1s110 +b0000000000000001 s419 +b0000000000000000 s467 +1s747 +1s408 +b0000000000000001 s881 +b0000000000000001 s682 +b0000000000000010 s182 +b0000000000000001 s807 +b0000000000000001 s261 +b0000000000000001 s678 +b0000000000000000 s471 +1s764 +1s622 +1s106 +b0000000000000000 s233 +b0000000000000001 s494 +1s35 +b0000000000000001 s351 +b0000000000000000 s238 +b0000000000000000 s347 +1s118 +1s59 +b0000000000000001 s244 +1s710 +1s57 +b0000000000000001 s533 +1s340 +b0000000000000000 s234 +b0000000000000000 s466 +1s334 +b0000000000000001 s171 +1s590 +b0000000000000001 s54 +b0000000000000000 s232 +b0000000000000000 s860 +b0000000000000001 s405 +b0000000000000001 s422 +b0000000000000001 s260 +b0000000000000010 s184 +b0000000000000001 s96 +b0000000000000010 s603 +1s9 +#60 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#65 +b0000000000000001 s121 +1s514 +1s359 +b0000000000000001 s855 +1s721 +b0000000000000000 s806 +1s0 +1s605 +b0000000000000000 s97 +b0000000000000010 s196 +b0000000000000001 s228 +b0000000000000001 s139 +b0000000000000000 s883 +1s643 +1s727 +b0000000000000000 s873 +b0000000000000001 s461 +b0000000000000001 s370 +b0000000000000001 s614 +b0000000000000001 s421 +1s838 +b0000000000000001 s562 +b0000000000000001 s805 +1s504 +b0000000000000001 s464 +1s270 +b1111111111111110 s801 +b0000000000000000 s119 +b0000000000000001 s555 +1s870 +b0000000000000000 s495 +b1111111111111110 s445 +b0000000000000000 s686 +1s703 +b0000000000000000 s117 +b0000000000000000 s685 +b0000000000000000 s732 +b0000000000000010 s604 +b0000000000000001 s463 +b0000000000000000 s880 +b0000000000000001 s844 +b0000000000000001 s356 +1s348 +1s344 +b0000000000000001 s641 +b0000000000000001 s438 +1s658 +1s38 +1s733 +b0000000000000001 s373 +b1111111111111110 s823 +b0000000000000000 s258 +1s675 +b0000000000000000 s353 +b0000000000000000 s189 +b0000000000000000 s854 +1s322 +b0000000000000001 s757 +b1111111111111110 s820 +b1111111111111110 s827 +b0000000000000001 s368 +b0000000000000001 s753 +b0000000000000000 s810 +b0000000000000000 s611 +b1111111111111110 s444 +b1111111111111110 s830 +1s569 +b0000000000000001 s135 +b0000000000000001 s205 +b0000000000000001 s460 +b0000000000000000 s188 +b0000000000000010 s195 +b0000000000000001 s203 +1s110 +b0000000000000010 s629 +b0000000000000001 s734 +1s408 +b0000000000000000 s182 +b0000000000000001 s550 +b1111111111111110 s430 +1s106 +b1111111111111110 s446 +b0000000000000010 s210 +b0000000000000000 s494 +b0000000000000001 s173 +b0000000000000000 s351 +b0000000000000001 s55 +b1111111111111110 s828 +b0000000000000000 s533 +1s590 +b0000000000000000 s54 +b0000000000000000 s405 +b0000000000000001 s140 +b0000000000000000 s260 +b0000000000000010 s625 +b0000000000000001 s367 +b0000000000000000 s96 +b0000000000000001 s136 +b0000000000000000 s603 +b0000000000000001 s745 +b0000000000000000 s423 +b0000000000000001 s133 +b0000000000000000 s852 +b0000000000000000 s877 +b0000000000000000 s493 +b0000000000000000 s259 +b0000000000000010 s212 +b0000000000000001 s355 +b0000000000000000 s657 +1s102 +b0000000000000000 s612 +1s817 +1s853 +1s709 +b0000000000000001 s230 +b0000000000000001 s841 +1s538 +b0000000000000000 s418 +b0000000000000000 s798 +b0000000000000000 s417 +b0000000000000001 s374 +b0000000000000001 s204 +b0000000000000000 s185 +b0000000000000001 s646 +b0000000000000000 s876 +b1111111111111110 s799 +b0000000000000010 s606 +b0000000000000010 s635 +b0000000000000001 s462 +1s81 +b0000000000000000 s478 +b1111111111111110 s429 +b0000000000000000 s245 +b0000000000000001 s660 +b0000000000000010 s211 +1s223 +b0000000000000010 s632 +b0000000000000001 s754 +b0000000000000001 s750 +1s552 +1s174 +1s336 +1s114 +1s125 +b1111111111111110 s824 +b0000000000000000 s681 +b0000000000000001 s134 +b0000000000000001 s836 +b0000000000000000 s615 +b0000000000000000 s183 +b0000000000000001 s539 +1s532 +b0000000000000000 s492 +b0000000000000000 s688 +b0000000000000000 s608 +b0000000000000000 s659 +b0000000000000001 s369 +b0000000000000001 s649 +b0000000000000001 s437 +b0000000000000001 s187 +b0000000000000000 s416 +b0000000000000000 s537 +b0000000000000001 s122 +1s696 +b0000000000000001 s407 +1s891 +b0000000000000001 s809 +1s715 +b0000000000000010 s209 +b0000000000000001 s227 +1s785 +1s520 +b0000000000000000 s53 +b0000000000000001 s610 +b0000000000000001 s229 +b0000000000000001 s559 +1s457 +1s800 +b0000000000000000 s728 +b0000000000000000 s803 +1s352 +1s526 +b0000000000000001 s439 +b0000000000000000 s479 +b1111111111111110 s443 +b0000000000000001 s226 +b0000000000000000 s419 +1s747 +b0000000000000000 s682 +b0000000000000000 s881 +b0000000000000000 s807 +b0000000000000000 s261 +b0000000000000000 s678 +1s622 +1s764 +b0000000000000010 s628 +1s59 +1s118 +b0000000000000000 s244 +1s340 +b0000000000000000 s171 +1s334 +b0000000000000001 s98 +b0000000000000010 s633 +b0000000000000001 s558 +b0000000000000000 s422 +b0000000000000000 s184 +#70 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#75 +b0000000000000010 s596 +b0000000000000000 s121 +1s514 +b0000000000000010 s179 +b0000000000000001 s582 +1s359 +b0000000000000000 s855 +1s721 +b0000000000000001 s634 +b0000000000000010 s177 +1s0 +1s605 +b0000000000000000 s196 +b0000000000000000 s139 +b0000000000000000 s228 +1s643 +1s727 +b1111111111111110 s783 +b0000000000000000 s461 +b0000000000000000 s370 +b0000000000000000 s614 +b0000000000000000 s421 +b0000000000000001 s432 +1s838 +b0000000000000000 s562 +b0000000000000000 s805 +1s504 +b1111111111111110 s414 +b0000000000000000 s464 +1s270 +b0000000000000000 s801 +b1111111111111110 s756 +b0000000000000000 s555 +b1111111111111110 s752 +1s870 +b0000000000000001 s445 +1s703 +b0000000000000001 s822 +b0000000000000001 s604 +b0000000000000000 s463 +b0000000000000001 s746 +b0000000000000000 s844 +b0000000000000000 s356 +1s348 +1s344 +b0000000000000000 s641 +b0000000000000000 s438 +1s658 +1s38 +1s733 +b0000000000000010 s593 +b0000000000000001 s161 +b0000000000000001 s771 +b0000000000000000 s373 +b0000000000000001 s823 +1s675 +b0000000000000001 s627 +1s322 +b0000000000000001 s433 +b0000000000000000 s757 +b0000000000000000 s820 +b0000000000000001 s827 +b0000000000000010 s124 +b0000000000000001 s394 +b0000000000000000 s368 +b1111111111111110 s372 +b0000000000000000 s753 +b0000000000000001 s201 +b0000000000000010 s156 +b0000000000000001 s444 +b0000000000000010 s561 +b0000000000000001 s146 +b0000000000000001 s830 +1s569 +b0000000000000010 s155 +b0000000000000000 s135 +b0000000000000000 s205 +b0000000000000000 s460 +b0000000000000000 s195 +b0000000000000000 s203 +b1111111111111110 s358 +b0000000000000001 s198 +1s110 +b0000000000000000 s629 +b0000000000000000 s734 +1s408 +b0000000000000001 s396 +b0000000000000001 s575 +b0000000000000000 s550 +b0000000000000000 s430 +b0000000000000010 s588 +b0000000000000000 s446 +1s106 +b0000000000000001 s210 +b0000000000000000 s173 +b0000000000000001 s397 +b1111111111111110 s413 +b0000000000000001 s580 +b0000000000000000 s55 +b0000000000000000 s828 +1s590 +b0000000000000010 s154 +b0000000000000001 s395 +b0000000000000001 s631 +b0000000000000000 s140 +b0000000000000000 s625 +b0000000000000001 s579 +b0000000000000000 s367 +b0000000000000000 s136 +b0000000000000001 s197 +b0000000000000001 s644 +b0000000000000000 s745 +b0000000000000001 s837 +b0000000000000001 s381 +b0000000000000000 s133 +b0000000000000001 s163 +b0000000000000001 s826 +b0000000000000001 s829 +b0000000000000001 s576 +b0000000000000000 s212 +b1111111111111110 s411 +b0000000000000000 s355 +1s102 +b0000000000000001 s435 +b1111111111111110 s388 +1s817 +b0000000000000001 s431 +b0000000000000010 s178 +1s853 +b0000000000000001 s553 +1s709 +b0000000000000000 s841 +b0000000000000000 s230 +1s538 +b0000000000000000 s374 +b0000000000000000 s204 +b0000000000000001 s147 +b0000000000000000 s646 +b0000000000000010 s180 +b0000000000000001 s572 +b1111111111111110 s412 +b0000000000000001 s799 +b0000000000000000 s606 +b0000000000000001 s775 +b0000000000000001 s635 +b0000000000000000 s462 +b0000000000000001 s199 +1s81 +b0000000000000010 s181 +b0000000000000000 s429 +b0000000000000001 s839 +b0000000000000000 s660 +b0000000000000001 s211 +b1111111111111110 s390 +1s223 +b0000000000000001 s632 +b0000000000000000 s754 +b0000000000000000 s750 +1s552 +1s174 +1s336 +1s114 +b1111111111111110 s791 +1s125 +b0000000000000000 s824 +b0000000000000000 s836 +b0000000000000000 s134 +b0000000000000001 s642 +b0000000000000000 s539 +1s532 +b0000000000000000 s369 +b0000000000000000 s649 +b0000000000000000 s437 +b0000000000000000 s187 +b0000000000000000 s122 +1s696 +b0000000000000000 s407 +b0000000000000001 s160 +b0000000000000001 s380 +b1111111111111110 s788 +1s891 +b0000000000000000 s809 +1s715 +b0000000000000001 s209 +b0000000000000000 s227 +1s785 +1s520 +b0000000000000000 s610 +b1111111111111110 s389 +b0000000000000000 s229 +b0000000000000001 s777 +b0000000000000000 s559 +1s457 +1s800 +1s352 +b0000000000000000 s439 +1s526 +b0000000000000001 s748 +b0000000000000001 s200 +b0000000000000010 s138 +b0000000000000001 s443 +b0000000000000010 s607 +b0000000000000000 s226 +b0000000000000010 s557 +1s747 +b0000000000000001 s774 +1s622 +1s764 +b1111111111111110 s415 +b0000000000000001 s767 +b0000000000000001 s628 +1s59 +1s118 +b0000000000000001 s434 +1s340 +1s334 +b0000000000000000 s98 +b1111111111111110 s802 +b0000000000000000 s633 +b0000000000000001 s551 +b0000000000000000 s558 +b0000000000000001 s770 +b0000000000000001 s162 +#80 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#85 +b0000000000000001 s596 +1s514 +b0000000000000001 s179 +b0000000000000010 s582 +b0000000000000001 s554 +1s359 +1s721 +b0000000000000000 s634 +b0000000000000001 s177 +1s0 +1s605 +b0000000000000001 s217 +1s643 +1s727 +b0000000000000001 s783 +b0000000000000001 s130 +b0000000000000000 s432 +1s838 +1s504 +b0000000000000001 s414 +b0000000000000001 s595 +1s270 +b0000000000000001 s756 +b0000000000000001 s752 +1s870 +b0000000000000000 s445 +1s703 +b0000000000000000 s822 +b0000000000000000 s604 +b1111111111111110 s383 +b1111111111111110 s746 +1s348 +1s344 +b0000000000000010 s581 +b0000000000000001 s645 +b0000000000000001 s790 +b1111111111111110 s786 +1s658 +1s38 +1s733 +b0000000000000001 s593 +b0000000000000010 s161 +b0000000000000000 s771 +b0000000000000001 s132 +b0000000000000001 s436 +b0000000000000001 s366 +b0000000000000001 s44 +b0000000000000000 s823 +b0000000000000001 s19 +1s675 +b0000000000000000 s627 +b1111111111111110 s776 +b0000000000000001 s543 +b0000000000000010 s150 +1s322 +b0000000000000000 s433 +b0000000000000001 s452 +b0000000000000000 s827 +b0000000000000001 s124 +b1111111111111110 s394 +b0000000000000001 s372 +b0000000000000000 s201 +b0000000000000001 s156 +b0000000000000001 s561 +b0000000000000000 s146 +b0000000000000000 s444 +b0000000000000010 s151 +b0000000000000001 s362 +b0000000000000000 s830 +1s569 +b0000000000000001 s155 +b0000000000000001 s358 +b0000000000000000 s198 +1s110 +b0000000000000001 s540 +1s408 +b0000000000000001 s219 +b1111111111111110 s396 +b0000000000000010 s575 +b0000000000000001 s588 +1s106 +b0000000000000000 s210 +b0000000000000001 s218 +b0000000000000001 s8 +b0000000000000000 s397 +b0000000000000001 s413 +b0000000000000000 s580 +1s590 +b0000000000000001 s154 +b1111111111111110 s395 +b0000000000000000 s631 +b0000000000000001 s451 +b0000000000000010 s579 +b0000000000000000 s197 +b1111111111111110 s769 +b0000000000000000 s644 +b0000000000000000 s381 +b0000000000000000 s837 +b0000000000000001 s364 +b0000000000000000 s163 +b0000000000000000 s826 +b0000000000000000 s829 +b0000000000000000 s576 +b0000000000000001 s411 +b1111111111111110 s386 +1s102 +b0000000000000001 s388 +b0000000000000000 s435 +1s817 +b0000000000000000 s431 +b0000000000000001 s178 +b0000000000000010 s148 +1s853 +b0000000000000001 s42 +1s709 +b0000000000000000 s553 +1s538 +b1111111111111110 s382 +b0000000000000000 s147 +b0000000000000001 s180 +b0000000000000000 s572 +b0000000000000010 s578 +b0000000000000001 s412 +b0000000000000000 s799 +b0000000000000000 s775 +b0000000000000010 s574 +b0000000000000000 s635 +b0000000000000010 s149 +b0000000000000000 s199 +b0000000000000001 s85 +1s81 +b0000000000000001 s181 +b0000000000000001 s87 +b0000000000000010 s152 +b0000000000000000 s839 +b0000000000000000 s211 +b0000000000000010 s589 +b0000000000000001 s390 +1s223 +b0000000000000000 s632 +b0000000000000001 s128 +1s552 +b0000000000000001 s598 +1s174 +b0000000000000010 s591 +1s336 +1s114 +b0000000000000001 s791 +1s125 +b0000000000000001 s793 +b0000000000000000 s642 +1s532 +b1111111111111110 s384 +b0000000000000001 s129 +b0000000000000001 s202 +b0000000000000001 s363 +1s696 +b0000000000000010 s160 +b0000000000000001 s735 +b0000000000000000 s380 +b0000000000000001 s788 +1s891 +1s715 +b0000000000000000 s209 +1s785 +1s520 +b0000000000000001 s389 +b1111111111111110 s777 +1s457 +1s800 +1s352 +1s526 +b0000000000000000 s748 +b0000000000000000 s200 +b0000000000000001 s138 +b0000000000000001 s840 +b0000000000000000 s443 +b0000000000000001 s607 +b0000000000000001 s557 +1s747 +b1111111111111110 s784 +b1111111111111110 s774 +b0000000000000001 s453 +1s622 +1s764 +b0000000000000001 s415 +b0000000000000001 s7 +b0000000000000001 s749 +b0000000000000000 s767 +b0000000000000000 s628 +1s59 +1s118 +b0000000000000000 s434 +b0000000000000001 s365 +1s340 +1s334 +b0000000000000001 s802 +b0000000000000010 s551 +b1111111111111110 s770 +b1111111111111110 s385 +b1111111111111110 s773 +b0000000000000001 s131 +b0000000000000010 s162 +b0000000000000001 s12 +b0000000000000001 s738 +#90 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#95 +b0000000000000000 s596 +1s514 +b1111111111111110 s364 +b0000000000000000 s179 +b0000000000000001 s582 +b0000000000000010 s554 +1s359 +1s721 +b0000000000000001 s386 +b0000000000000000 s411 +b0000000000000010 s168 +1s102 +b0000000000000000 s177 +1s0 +b0000000000000000 s388 +1s605 +b0000000000000000 s217 +1s817 +b0000000000000000 s178 +b0000000000000001 s148 +b1111111111111110 s403 +1s853 +1s709 +b0000000000000010 s42 +1s643 +1s538 +b0000000000000000 s783 +1s727 +b0000000000000010 s170 +b0000000000000010 s130 +b0000000000000001 s382 +b1111111111111110 s387 +1s838 +b0000000000000000 s414 +1s504 +b0000000000000000 s595 +1s270 +b0000000000000000 s756 +b0000000000000000 s180 +b0000000000000000 s752 +1s870 +b0000000000000000 s412 +b0000000000000001 s578 +b1111111111111110 s737 +b0000000000000001 s574 +1s703 +b0000000000000001 s149 +b1111111111111110 s402 +b1111111111111110 s85 +b0000000000000001 s383 +1s81 +b0000000000000000 s181 +b0000000000000001 s746 +b1111111111111110 s87 +1s348 +b0000000000000001 s152 +1s344 +b0000000000000010 s592 +b0000000000000001 s581 +b0000000000000001 s589 +b0000000000000000 s790 +b0000000000000000 s390 +b0000000000000000 s645 +b0000000000000001 s786 +1s223 +1s658 +b0000000000000010 s128 +b0000000000000000 s598 +1s552 +1s174 +b0000000000000001 s591 +1s38 +1s733 +1s114 +1s336 +b0000000000000000 s791 +b0000000000000000 s593 +1s125 +b0000000000000001 s161 +b0000000000000000 s793 +b0000000000000010 s132 +b0000000000000000 s436 +b0000000000000010 s153 +b1111111111111110 s366 +1s532 +b0000000000000010 s44 +b0000000000000010 s545 +b1111111111111110 s19 +1s675 +b0000000000000001 s384 +b0000000000000010 s129 +b0000000000000001 s776 +b0000000000000000 s202 +b1111111111111110 s363 +b0000000000000010 s543 +b0000000000000001 s150 +1s322 +1s696 +b0000000000000000 s452 +b1111111111111110 s735 +b0000000000000001 s160 +b0000000000000000 s788 +1s891 +b0000000000000000 s124 +b0000000000000001 s394 +b0000000000000000 s372 +1s715 +b0000000000000000 s156 +b1111111111111110 s787 +1s785 +1s520 +b0000000000000000 s561 +b0000000000000000 s389 +b1111111111111110 s362 +b0000000000000001 s151 +b0000000000000001 s777 +1s800 +1s457 +1s569 +b0000000000000000 s155 +1s352 +1s526 +b0000000000000000 s358 +b1111111111111110 s740 +b0000000000000000 s138 +1s110 +b0000000000000000 s840 +b0000000000000010 s540 +b0000000000000000 s607 +1s747 +b0000000000000000 s557 +b0000000000000001 s784 +1s408 +b0000000000000001 s774 +b0000000000000001 s396 +b0000000000000000 s219 +b0000000000000001 s575 +b0000000000000000 s588 +b0000000000000000 s453 +1s764 +1s622 +1s106 +b0000000000000000 s415 +b0000000000000000 s218 +b1111111111111110 s8 +b0000000000000010 s7 +b0000000000000010 s169 +b1111111111111110 s749 +b0000000000000000 s413 +b1111111111111110 s404 +1s118 +1s59 +b0000000000000010 s542 +b1111111111111110 s365 +1s340 +1s334 +b0000000000000000 s802 +1s590 +b0000000000000001 s551 +b0000000000000001 s395 +b0000000000000000 s154 +b0000000000000000 s451 +b0000000000000001 s770 +b0000000000000001 s385 +b0000000000000001 s773 +b0000000000000001 s162 +b0000000000000010 s131 +b0000000000000010 s12 +b0000000000000001 s579 +b0000000000000001 s769 +b1111111111111110 s738 +#100 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#105 +1s514 +b0000000000000001 s364 +b0000000000000000 s582 +b0000000000000001 s554 +1s359 +1s721 +b0000000000000000 s386 +b0000000000000001 s168 +1s102 +1s0 +1s605 +1s817 +b0000000000000000 s148 +b0000000000000001 s403 +1s853 +1s709 +b0000000000000001 s42 +1s643 +1s538 +1s727 +b0000000000000001 s130 +b0000000000000001 s170 +b0000000000000000 s382 +b0000000000000001 s387 +1s838 +1s504 +1s270 +1s870 +b0000000000000000 s578 +b0000000000000001 s737 +b0000000000000000 s574 +1s703 +b0000000000000000 s149 +b0000000000000001 s402 +b0000000000000001 s85 +b0000000000000000 s383 +1s81 +b0000000000000000 s746 +b0000000000000001 s87 +1s348 +b0000000000000000 s152 +1s344 +b0000000000000001 s592 +b0000000000000000 s581 +b0000000000000000 s589 +b0000000000000000 s786 +1s223 +1s658 +b0000000000000001 s128 +1s552 +1s174 +b0000000000000000 s591 +1s38 +1s733 +1s114 +1s336 +1s125 +b0000000000000000 s161 +b0000000000000001 s132 +b0000000000000001 s153 +1s532 +b0000000000000001 s366 +b0000000000000001 s44 +b0000000000000001 s545 +b0000000000000001 s19 +1s675 +b0000000000000000 s384 +b0000000000000001 s129 +b0000000000000000 s776 +b0000000000000001 s543 +b0000000000000001 s363 +b0000000000000000 s150 +1s322 +1s696 +b0000000000000001 s735 +b0000000000000000 s160 +1s891 +b0000000000000000 s394 +1s715 +b0000000000000001 s787 +1s785 +1s520 +b0000000000000000 s151 +b0000000000000001 s362 +b0000000000000000 s777 +1s800 +1s457 +1s569 +1s352 +1s526 +b0000000000000001 s740 +1s110 +b0000000000000001 s540 +1s747 +b0000000000000000 s784 +1s408 +b0000000000000000 s774 +b0000000000000000 s396 +b0000000000000000 s575 +1s764 +1s622 +1s106 +b0000000000000001 s8 +b0000000000000001 s7 +b0000000000000001 s169 +b0000000000000001 s749 +b0000000000000001 s404 +1s118 +1s59 +b0000000000000001 s542 +b0000000000000001 s365 +1s340 +1s334 +1s590 +b0000000000000000 s551 +b0000000000000000 s395 +b0000000000000000 s770 +b0000000000000000 s385 +b0000000000000000 s773 +b0000000000000001 s131 +b0000000000000000 s162 +b0000000000000001 s12 +b0000000000000000 s579 +b0000000000000000 s769 +b0000000000000001 s738 +#110 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#115 +b0000000000000000 s132 +b0000000000000000 s153 +1s514 +b0000000000000000 s364 +b0000000000000000 s366 +1s532 +b0000000000000000 s44 +b0000000000000000 s545 +b0000000000000000 s19 +1s675 +b0000000000000000 s554 +b0000000000000000 s129 +b0000000000000000 s363 +b0000000000000000 s543 +1s322 +1s359 +1s696 +1s721 +b0000000000000000 s735 +b0000000000000000 s168 +1s891 +1s102 +1s0 +1s715 +b0000000000000000 s787 +1s605 +1s785 +1s520 +1s817 +b0000000000000000 s362 +1s457 +1s800 +1s569 +b0000000000000000 s403 +1s853 +b0000000000000000 s42 +1s709 +1s643 +1s352 +1s526 +1s538 +1s727 +b0000000000000000 s170 +b0000000000000000 s130 +b0000000000000000 s740 +b0000000000000000 s387 +1s838 +1s110 +b0000000000000000 s540 +1s504 +1s747 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +b0000000000000000 s737 +b0000000000000000 s8 +b0000000000000000 s7 +1s703 +b0000000000000000 s169 +b0000000000000000 s749 +b0000000000000000 s404 +b0000000000000000 s402 +b0000000000000000 s542 +1s59 +1s118 +b0000000000000000 s85 +b0000000000000000 s365 +1s81 +b0000000000000000 s87 +1s340 +1s348 +1s334 +1s590 +1s344 +b0000000000000000 s592 +1s223 +b0000000000000000 s128 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +b0000000000000000 s131 +b0000000000000000 s12 +b0000000000000000 s738 +1s125 +#120 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#125 +1s63 +1s514 +1s532 +1s675 +0s5 +0s80 +0s48 +1s322 +1s359 +0s290 +0s107 +1s696 +0s24 +1s721 +0s17 +1s891 +1s102 +1s0 +1s715 +0s37 +0s341 +1s605 +1s785 +1s520 +1s817 +1s457 +1s800 +1s569 +1s853 +1s709 +b011 s321 +1s6 +1s643 +1s352 +1s526 +1s538 +1s727 +1s838 +1s110 +b000000000000000000 s15 +b011 s73 +1s298 +1s504 +1s747 +0s62 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +0s16 +b100000000000000000 s23 +0s49 +1s703 +1s59 +1s118 +1s81 +0s91 +1s340 +1s348 +1s334 +1s590 +1s344 +0s25 +0s714 +0s92 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +0s519 +b011 s333 +1s125 +#130 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#135 +0s63 +1s514 +1s532 +1s675 +b00000001 s70 +1s322 +1s359 +0s109 +1s696 +1s721 +0s90 +1s891 +1s102 +1s0 +1s715 +1s605 +0s521 +1s785 +1s520 +1s817 +0s103 +0s46 +1s457 +1s800 +1s569 +1s853 +1s709 +0s6 +b011 s67 +1s643 +b011 s68 +1s352 +1s526 +1s538 +1s727 +0s89 +b011 s11 +1s838 +1s110 +0s298 +0s708 +1s504 +1s747 +1s408 +1s270 +0s513 +1s870 +1s106 +1s622 +1s764 +1s703 +1s59 +1s118 +1s69 +0s337 +1s81 +1s340 +1s348 +1s334 +1s590 +1s344 +0s343 +b011 s335 +0s47 +0s716 +b00000001 s323 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +b011 s276 +b00000001 s702 +1s125 +#140 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#145 +1s514 +b00000010 s328 +1s532 +0s20 +1s675 +0s100 +b00000010 s70 +1s322 +b00000001 s326 +1s359 +1s696 +0s105 +1s721 +1s891 +1s102 +0s45 +1s0 +1s715 +0s515 +1s605 +1s785 +1s520 +1s817 +b00000001 s325 +1s457 +1s800 +1s569 +1s853 +1s709 +1s643 +1s352 +1s526 +1s538 +0s86 +1s727 +1s838 +0s88 +1s110 +b00000001 s704 +1s504 +1s747 +0s339 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +b00000001 s71 +1s703 +0s35 +1s59 +1s118 +0s710 +1s81 +0s57 +1s340 +1s348 +1s334 +1s590 +1s344 +b00000010 s323 +1s223 +1s658 +1s552 +1s174 +0s43 +1s38 +1s336 +1s114 +1s733 +b00000010 s702 +b00000010 s72 +0s9 +1s125 +#150 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#155 +1s514 +b00000011 s328 +1s532 +1s675 +b00000011 s70 +1s322 +b00000010 s326 +1s359 +1s696 +1s721 +1s891 +1s102 +1s0 +1s715 +1s605 +1s785 +1s520 +1s817 +b00000010 s325 +1s457 +1s800 +1s569 +1s853 +1s709 +1s643 +1s352 +1s526 +1s538 +1s727 +1s838 +1s110 +b00000010 s704 +1s504 +1s747 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +b00000010 s71 +1s703 +1s59 +1s118 +1s81 +1s340 +1s348 +1s334 +1s590 +1s344 +b00000011 s323 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +b00000011 s702 +b00000011 s72 +1s125 +#160 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#165 +1s514 +b00000100 s328 +1s532 +1s675 +b00000100 s70 +1s322 +b00000011 s326 +1s359 +1s696 +1s721 +1s891 +1s102 +1s0 +1s715 +1s605 +1s785 +1s520 +1s817 +b00000011 s325 +1s457 +1s800 +1s569 +1s853 +1s709 +1s643 +1s352 +1s526 +1s538 +1s727 +1s838 +1s110 +b00000011 s704 +1s504 +1s747 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +b00000011 s71 +1s703 +1s59 +1s118 +1s81 +1s340 +1s348 +1s334 +1s590 +1s344 +b00000100 s323 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +b00000100 s702 +b00000100 s72 +1s125 +#170 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#175 +1s514 +b00000101 s328 +1s532 +1s675 +b00000101 s70 +1s322 +b00000100 s326 +1s359 +1s696 +1s721 +1s891 +1s102 +1s0 +1s715 +1s605 +1s785 +1s520 +1s817 +b00000100 s325 +1s457 +1s800 +1s569 +1s853 +1s709 +1s643 +1s352 +1s526 +1s538 +1s727 +1s838 +1s110 +b00000100 s704 +1s504 +1s747 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +b00000100 s71 +1s703 +1s59 +1s118 +1s81 +1s340 +1s348 +1s334 +1s590 +1s344 +b00000101 s323 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +b00000101 s702 +b00000101 s72 +1s125 +#180 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#185 +1s514 +b00000110 s328 +1s532 +1s675 +b00000110 s70 +1s322 +b00000101 s326 +1s359 +1s696 +1s721 +1s891 +1s102 +1s0 +1s715 +1s605 +1s785 +1s520 +1s817 +b00000101 s325 +1s457 +1s800 +1s569 +1s853 +1s709 +1s643 +1s352 +1s526 +1s538 +1s727 +1s838 +1s110 +b00000101 s704 +1s504 +1s747 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +b00000101 s71 +1s703 +1s59 +1s118 +1s81 +1s340 +1s348 +1s334 +1s590 +1s344 +b00000110 s323 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +b00000110 s702 +b00000110 s72 +1s125 +#190 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#195 +1s514 +b00000111 s328 +1s532 +1s675 +b00000111 s70 +1s322 +b00000110 s326 +1s359 +1s696 +1s721 +1s891 +1s102 +1s0 +1s715 +1s605 +1s785 +1s520 +1s817 +b00000110 s325 +1s457 +1s800 +1s569 +1s853 +1s709 +1s643 +1s352 +1s526 +1s538 +1s727 +1s838 +1s110 +b00000110 s704 +1s504 +1s747 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +b00000110 s71 +1s703 +1s59 +1s118 +1s81 +1s340 +1s348 +1s334 +1s590 +1s344 +b00000111 s323 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +b00000111 s702 +b00000111 s72 +1s125 +#200 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#205 +1s514 +b00001000 s328 +1s532 +1s675 +b00001000 s70 +1s322 +b00000111 s326 +1s359 +1s696 +1s721 +1s891 +1s102 +1s0 +1s715 +1s605 +1s785 +1s520 +1s817 +b00000111 s325 +1s457 +1s800 +1s569 +1s853 +1s709 +b100 s321 +1s643 +1s352 +1s526 +1s538 +1s727 +1s838 +1s110 +b00000111 s704 +b100 s73 +1s504 +1s747 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +b00000111 s71 +1s703 +1s59 +1s118 +1s81 +1s340 +1s348 +1s334 +1s590 +1s344 +b00001000 s323 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +1s306 +b100 s333 +b00001000 s702 +b00001000 s72 +1s125 +#210 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#215 +0s40 +1s514 +b00001001 s328 +0s225 +1s532 +1s675 +b00000000 s70 +1s322 +b00001000 s326 +1s359 +1s696 +1s721 +1s891 +0s176 +1s102 +0s459 +0s127 +1s0 +1s715 +1s605 +1s785 +1s520 +1s817 +b00001000 s325 +1s457 +1s800 +1s569 +1s853 +1s709 +b100 s67 +1s643 +b100 s68 +0s410 +1s352 +1s526 +1s538 +1s727 +1s320 +b100 s11 +0s64 +1s838 +1s110 +b00001000 s704 +1s504 +1s747 +0s318 +1s408 +1s270 +1s10 +1s870 +1s66 +1s106 +1s622 +1s764 +b00001000 s71 +1s703 +1s59 +1s118 +0s69 +1s81 +1s340 +1s348 +1s334 +1s590 +1s344 +b100 s335 +0s361 +0s83 +b00000000 s323 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +b100 s276 +0s306 +b00000000 s702 +b00001001 s72 +1s125 +#220 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#225 +1s514 +b00000001 s328 +1s532 +1s675 +1s322 +b00000000 s326 +1s359 +1s696 +1s721 +1s891 +1s102 +1s0 +1s715 +1s605 +1s785 +1s520 +1s817 +b00000000 s325 +1s457 +1s800 +1s569 +1s853 +1s709 +1s643 +1s352 +1s526 +1s538 +1s727 +1s838 +1s110 +b00000000 s704 +1s504 +1s747 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +b00000000 s71 +1s703 +1s59 +1s118 +1s81 +1s340 +1s348 +1s334 +1s590 +1s344 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +b00000001 s72 +1s125 +#230 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#235 +1s514 +1s532 +1s675 +1s322 +1s359 +1s696 +1s721 +1s891 +1s102 +1s0 +1s715 +1s605 +1s785 +1s520 +1s817 +1s457 +1s800 +1s569 +1s853 +1s709 +1s643 +1s352 +1s526 +1s538 +1s727 +1s838 +1s110 +1s504 +1s747 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +1s703 +1s59 +1s118 +1s81 +1s340 +1s348 +1s334 +1s590 +1s344 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +1s125 +#240 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#245 +1s514 +1s532 +1s675 +1s322 +1s359 +1s696 +1s721 +1s891 +1s102 +1s0 +1s715 +1s605 +1s785 +1s520 +1s817 +1s457 +1s800 +1s569 +1s853 +1s709 +1s643 +1s352 +1s526 +1s538 +1s727 +1s838 +1s110 +1s504 +1s747 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +1s703 +1s59 +1s118 +1s81 +1s340 +1s348 +1s334 +1s590 +1s344 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +1s125 +#250 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#255 +1s514 +1s532 +1s675 +1s322 +1s359 +1s696 +1s721 +1s891 +1s102 +1s0 +1s715 +1s605 +1s785 +1s520 +1s817 +1s457 +1s800 +1s569 +1s853 +1s709 +1s643 +1s352 +1s526 +1s538 +1s727 +1s838 +1s110 +1s504 +1s747 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +1s703 +1s59 +1s118 +1s81 +1s340 +1s348 +1s334 +1s590 +1s344 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +1s125 +#260 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#265 +1s514 +1s532 +1s675 +1s322 +1s359 +1s696 +1s721 +1s891 +1s102 +1s0 +1s715 +1s605 +1s785 +1s520 +1s817 +1s457 +1s800 +1s569 +1s853 +1s709 +1s643 +1s352 +1s526 +1s538 +1s727 +1s838 +1s110 +1s504 +1s747 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +1s703 +1s59 +1s118 +1s81 +1s340 +1s348 +1s334 +1s590 +1s344 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +1s125 +#270 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#275 +1s514 +1s532 +1s675 +1s322 +1s359 +1s696 +1s721 +1s891 +1s102 +1s0 +1s715 +1s605 +1s785 +1s520 +1s817 +1s457 +1s800 +1s569 +1s853 +1s709 +1s643 +1s352 +1s526 +1s538 +1s727 +1s838 +1s110 +1s504 +1s747 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +1s703 +1s59 +1s118 +1s81 +1s340 +1s348 +1s334 +1s590 +1s344 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +1s125 +#280 +0s514 +0s532 +0s675 +0s322 +0s359 +0s696 +0s721 +0s891 +0s102 +0s0 +0s715 +0s605 +0s785 +0s520 +0s817 +0s457 +0s800 +0s569 +0s853 +0s709 +0s643 +0s352 +0s526 +0s538 +0s727 +0s838 +0s110 +0s504 +0s747 +0s408 +0s270 +0s870 +0s106 +0s622 +0s764 +0s703 +0s59 +0s118 +0s81 +0s340 +0s348 +0s334 +0s590 +0s344 +0s223 +0s658 +0s552 +0s174 +0s38 +0s336 +0s114 +0s733 +0s125 +#285 +1s514 +1s532 +1s675 +1s322 +1s359 +1s696 +1s721 +1s891 +1s102 +1s0 +1s715 +1s605 +1s785 +1s520 +1s817 +1s457 +1s800 +1s569 +1s853 +1s709 +1s643 +1s352 +1s526 +1s538 +1s727 +1s838 +1s110 +1s504 +1s747 +1s408 +1s270 +1s870 +1s106 +1s622 +1s764 +1s703 +1s59 +1s118 +1s81 +1s340 +1s348 +1s334 +1s590 +1s344 +1s223 +1s658 +1s552 +1s174 +1s38 +1s336 +1s114 +1s733 +1s125 diff --git a/tool/gh_actions/pana_source.sh b/tool/gh_actions/pana_source.sh index 27612c77ac..29a6c8342f 100755 --- a/tool/gh_actions/pana_source.sh +++ b/tool/gh_actions/pana_source.sh @@ -74,9 +74,15 @@ copy_package() { } copy_package "$package_dir" "$temp_dir/package" +hierarchy_dir="" +if [[ -f "$package_dir/../rohd_hierarchy/pubspec.yaml" ]]; then + hierarchy_dir="$package_dir/../rohd_hierarchy" +elif [[ -f "$package_dir/packages/rohd_hierarchy/pubspec.yaml" ]]; then + hierarchy_dir="$package_dir/packages/rohd_hierarchy" +fi if grep -Eq '^[[:space:]]*rohd_hierarchy:' "$package_dir/pubspec.yaml" && - [[ -f "$package_dir/../rohd_hierarchy/pubspec.yaml" ]]; then - hierarchy_dir="$(cd "$package_dir/../rohd_hierarchy" && pwd)" + [[ -n "$hierarchy_dir" ]]; then + hierarchy_dir="$(cd "$hierarchy_dir" && pwd)" copy_package "$hierarchy_dir" "$temp_dir/rohd_hierarchy" cat > "$temp_dir/package/pubspec_overrides.yaml" <<'EOF' dependency_overrides: diff --git a/tool/test/pana_source_test.sh b/tool/test/pana_source_test.sh index 91a358f877..5e1b75700b 100644 --- a/tool/test/pana_source_test.sh +++ b/tool/test/pana_source_test.sh @@ -53,8 +53,10 @@ case "$*" in else [[ ! -e pubspec_overrides.yaml ]] fi - cmp pubspec.yaml "$SOURCE/pubspec.yaml" - cmp lib/fixture.dart "$SOURCE/lib/fixture.dart" + cmp pubspec.yaml "${EXPECTED_PACKAGE_SOURCE:-$SOURCE}/pubspec.yaml" + if [[ -f "${EXPECTED_PACKAGE_SOURCE:-$SOURCE}/lib/fixture.dart" ]]; then + cmp lib/fixture.dart "${EXPECTED_PACKAGE_SOURCE:-$SOURCE}/lib/fixture.dart" + fi if grep -q 'rohd_hierarchy:' pubspec.yaml; then [[ -f ../rohd_hierarchy/pubspec.yaml ]] fi @@ -163,6 +165,21 @@ export EXPECTED_THRESHOLD=0 run_case 0 "$SOURCE" dart [[ "$(cat "$SDK_LOG")" == $'dart|pub get\ndart|analyze --fatal-infos lib\ndart|pub downgrade\ndart|analyze --fatal-infos lib' ]] +mkdir -p "$FIXTURE/root-package/packages" +cp -R "$SOURCE" "$FIXTURE/root-package/package" +mv "$FIXTURE/root-package/package" "$FIXTURE/root-package/packages/rohd_hierarchy" +mkdir -p "$FIXTURE/root-package/lib" +printf 'name: rohd\n' > "$FIXTURE/root-package/pubspec.yaml" +printf 'dependencies:\n rohd_hierarchy: ^0.2.0\n' >> \ + "$FIXTURE/root-package/pubspec.yaml" +printf 'library rohd;\n' > "$FIXTURE/root-package/lib/rohd.dart" +cp -R "$FIXTURE/root-package" "$FIXTURE/original-root-package" +export EXPECTED_PACKAGE_SOURCE="$FIXTURE/root-package" +run_case 0 "$FIXTURE/root-package" dart +diff -ru "$FIXTURE/original-root-package" "$FIXTURE/root-package" +[[ "$(cat "$SDK_LOG")" == $'dart|pub get\ndart|analyze --fatal-infos lib\ndart|pub downgrade\ndart|analyze --fatal-infos lib' ]] +unset EXPECTED_PACKAGE_SOURCE + mv "$PUB_CACHE/bin/pana" "$FIXTURE/pana" run_case 2 "$SOURCE" dart grep -q 'Pana is required' "$FIXTURE/output" From bd1cf027f3917b4282b01c34088a58496691ec97 Mon Sep 17 00:00:00 2001 From: "Desmond A. Kirkpatrick" Date: Tue, 13 Oct 2026 13:39:47 -0700 Subject: [PATCH 11/26] rohd_hierararchy dependency is challenging pana --- .github/workflows/general.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/general.yml b/.github/workflows/general.yml index 690f2698f9..5c63db9b6b 100644 --- a/.github/workflows/general.yml +++ b/.github/workflows/general.yml @@ -64,7 +64,7 @@ jobs: run: tool/gh_actions/analyze_source.sh - name: Run Pana on project source - run: tool/gh_actions/pana_source.sh + run: tool/gh_actions/pana_source.sh . dart - name: Check project documentation run: tool/gh_actions/generate_documentation.sh From 1989c7f2f2810c22a0da34f3f0121af1606be2c4 Mon Sep 17 00:00:00 2001 From: "Desmond A. Kirkpatrick" Date: Tue, 13 Oct 2026 14:02:51 -0700 Subject: [PATCH 12/26] stil more struggle with monorepo, package dependencies, and new package versioning --- rohd_devtools_extension/pubspec.yaml | 6 ++---- .../tool/test_devtools_install.dart | 11 +++++++++++ tool/test/devtools_install_test.sh | 13 ++++++++++++- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/rohd_devtools_extension/pubspec.yaml b/rohd_devtools_extension/pubspec.yaml index 0bc38980d1..1b98d38695 100644 --- a/rohd_devtools_extension/pubspec.yaml +++ b/rohd_devtools_extension/pubspec.yaml @@ -30,11 +30,9 @@ dependencies: material_ui: ">=1.1.0 <1.3.0" path: ^1.9.0 path_provider: ^2.1.0 - rohd: ^0.6.11 + rohd: ^0.6.12 rohd_devtools_widgets: ^0.1.0 - # Version 0.2.0 is available through the development-mode local/git overrides - # but has not yet been published to pub.dev. - rohd_hierarchy: ^0.1.0 + rohd_hierarchy: ^0.2.0 rohd_schematic_viewer: ^0.2.0 rohd_source_navigator: ^0.1.0 rohd_wave_viewer: ^0.1.0 diff --git a/rohd_devtools_extension/tool/test_devtools_install.dart b/rohd_devtools_extension/tool/test_devtools_install.dart index 26734b99c0..e4458cb3a3 100644 --- a/rohd_devtools_extension/tool/test_devtools_install.dart +++ b/rohd_devtools_extension/tool/test_devtools_install.dart @@ -216,6 +216,17 @@ dependencies: rohd: path: ${jsonEncode(packageRoot.path)} '''); + final hierarchyDir = Directory( + p.join(packageRoot.path, 'packages', 'rohd_hierarchy'), + ); + if (hierarchyDir.existsSync()) { + final overrides = File(p.join(projectRoot.path, 'pubspec_overrides.yaml')); + await overrides.writeAsString(''' +dependency_overrides: + rohd_hierarchy: + path: ${jsonEncode(hierarchyDir.path)} +'''); + } final result = await Process.run( Platform.resolvedExecutable, diff --git a/tool/test/devtools_install_test.sh b/tool/test/devtools_install_test.sh index f33af7b2e9..17d357666e 100644 --- a/tool/test/devtools_install_test.sh +++ b/tool/test/devtools_install_test.sh @@ -23,12 +23,23 @@ readonly PACKAGE_ROOT="$FIXTURE/package with spaces" readonly EXTENSION_DIR="$PACKAGE_ROOT/extension/devtools" trap 'rm -rf "$FIXTURE"' EXIT -mkdir -p "$EXTENSION_DIR/build/assets" "$EXTENSION_DIR/build/canvaskit" +mkdir -p "$EXTENSION_DIR/build/assets" "$EXTENSION_DIR/build/canvaskit" \ + "$PACKAGE_ROOT/packages/rohd_hierarchy/lib" cat > "$PACKAGE_ROOT/pubspec.yaml" <<'EOF' name: rohd environment: sdk: ^3.6.0 +dependencies: + rohd_hierarchy: ^0.2.0 EOF +cat > "$PACKAGE_ROOT/packages/rohd_hierarchy/pubspec.yaml" <<'EOF' +name: rohd_hierarchy +version: 0.2.0 +environment: + sdk: ^3.6.0 +EOF +printf 'library rohd_hierarchy;\n' \ + > "$PACKAGE_ROOT/packages/rohd_hierarchy/lib/rohd_hierarchy.dart" cp "$REPO_ROOT/extension/devtools/config.yaml" "$EXTENSION_DIR/config.yaml" for asset in index.html flutter_bootstrap.js flutter.js main.dart.js version.json \ assets/AssetManifest.bin assets/FontManifest.json canvaskit/canvaskit.js canvaskit/canvaskit.wasm; do From eb8d87e791efe25e631daf9aaf5af29be36d3694 Mon Sep 17 00:00:00 2001 From: "Desmond A. Kirkpatrick" Date: Tue, 13 Oct 2026 15:14:56 -0700 Subject: [PATCH 13/26] yet more struggle with monorepo and package updates --- rohd_devtools_extension/Makefile | 2 + .../scripts/stage_assets.sh | 8 +- rohd_devtools_extension/web/pkg/LICENSE | 28 + rohd_devtools_extension/web/pkg/README.md | 22 + .../web/pkg/wellen_bridge.js | 797 ++++++++++++++++++ .../web/pkg/wellen_bridge_bg.wasm | Bin 0 -> 611078 bytes tool/gh_actions/devtool/install_devtools.sh | 19 +- 7 files changed, 870 insertions(+), 6 deletions(-) create mode 100644 rohd_devtools_extension/web/pkg/LICENSE create mode 100644 rohd_devtools_extension/web/pkg/README.md create mode 100644 rohd_devtools_extension/web/pkg/wellen_bridge.js create mode 100644 rohd_devtools_extension/web/pkg/wellen_bridge_bg.wasm diff --git a/rohd_devtools_extension/Makefile b/rohd_devtools_extension/Makefile index 7b76282fe3..d78026bcb1 100644 --- a/rohd_devtools_extension/Makefile +++ b/rohd_devtools_extension/Makefile @@ -94,8 +94,10 @@ build/web/index.html: web/pkg pubspec.yaml $(DART_SOURCES) @bash $(ROOT)/scripts/verify_elk_distribution.sh $(ROOT)/build/web/assets @echo "Copying widget artifacts into build/web..." @rm -rf $(ROOT)/build/web/pkg + @cp -r $(ROOT)/web/pkg $(ROOT)/build/web/ @for widget in $(WIDGET_DIRS); do \ if [ -d "$$widget/web/pkg" ]; then \ + rm -rf $(ROOT)/build/web/pkg; \ cp -r $$widget/web/pkg $(ROOT)/build/web/; \ break; \ fi; \ diff --git a/rohd_devtools_extension/scripts/stage_assets.sh b/rohd_devtools_extension/scripts/stage_assets.sh index 243169a6a9..b7fbd19383 100755 --- a/rohd_devtools_extension/scripts/stage_assets.sh +++ b/rohd_devtools_extension/scripts/stage_assets.sh @@ -90,7 +90,11 @@ echo " - build/linux/assets/ (for Linux native builds)" # copied into the host app's web/ directory for the