jarvisplot 2.0.0__tar.gz → 2.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/JarvisPLOT.egg-info/PKG-INFO +1 -1
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/PKG-INFO +1 -1
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/figure.py +5 -2
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/layout_runtime.py +15 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/flowchart/default.json +1 -1
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/core.py +12 -1
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/flowchart.py +21 -5
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/pyproject.toml +1 -1
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_agent_digest.py +25 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_figure_contracts.py +33 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_flowchart_renderer.py +64 -1
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/JarvisPLOT.egg-info/SOURCES.txt +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/JarvisPLOT.egg-info/dependency_links.txt +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/JarvisPLOT.egg-info/entry_points.txt +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/JarvisPLOT.egg-info/requires.txt +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/JarvisPLOT.egg-info/top_level.txt +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/README.md +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/__init__.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/adapters_rect.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/adapters_ternary.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/cards/std_axes_adapter_config.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/colorbar_runtime.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/config_runtime.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/data_pipelines.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/density_cell_runtime.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/design_runtime.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/dynesty_runtime.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/figure_types.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/helper.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/interp_2d_runtime.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/interp_natural_neighbor.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/interp_natural_neighbor_exact.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/layer_runtime.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/method_registry.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/posterior_density_runtime.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/posterior_hpd.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/posterior_mesh.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/preprocessor.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/preprocessor_runtime.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/profile_runtime.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/Figure/style_runtime.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/__init__.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/agent_digest.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/agent_io.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cache_store.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/capabilities.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/1x1/ternary.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/2x1/dynesty_runplot.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/2x1/rect.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/2x1/rect5x1.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/2x1/rect_cmap.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/2x1/ternary.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/2x1/ternary_cmap.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/4x1/rect.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/4x1/rect_cmap.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/4x1/ternary.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/a4paper/4x1/ternary_cmap.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/args.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/colors/colormaps.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/default/output.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/gambit/1x1/ternary.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/gambit/2x1/rect_cmap.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/gambit/2x1/ternary.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/gambit/2x1/ternary_cmap.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/JarvisHEP.png +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/flowchart/JarvisHEP.png +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/flowchart/calculator.png +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/flowchart/inputfile.png +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/flowchart/opera.png +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/flowchart/outputfile.png +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/flowchart/sampler.png +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/gambit.png +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/icons/gambit_small.png +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cards/style_preference.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cli.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/cli_help.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/client.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/column_demand.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/column_probe.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/config.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/config_address.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/core_assets.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/core_runtime.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/data_access.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/data_loader.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/data_loader_hdf5.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/data_loader_runtime.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/data_loader_summary.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/diagnostic_guidance.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/diagnostics.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/dryrun_runtime.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/expr_names.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/fix_apply.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/inner_func.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/man_catalog.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/man_methods.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/man_render_agent.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/man_render_human.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/man_transforms.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/agent-output.yaml +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/cli-map.yaml +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/data-columns.yaml +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/diagnostics.yaml +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/dryrun-viz.yaml +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/layer-method.yaml +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/manifest.yaml +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/method_notes.yaml +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/style-axes.yaml +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/type-posterior-2d.yaml +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/type-profile-2d.yaml +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/validate.yaml +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/workflow.yaml +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/manual_cards/yaml-root.yaml +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/memtrace.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/method_contracts.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/render_health.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/core/common.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/core/dataset.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/core/figure.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/core/layer.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/core/transform.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/manifest.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/bar.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/barh.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/contour.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/contourf.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/dynesty_runplot.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/errorbar.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/fill.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/fill_between.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/fill_betweenx.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/hist.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/imshow.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/jpcontour.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/jpcontourf.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/jpfield.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/pcolor.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/pcolormesh.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/plot.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/quiver.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/scatter.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/step.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/tricontour.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/tricontourf.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/tripcolor.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/tripcolor_axes.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/triplot.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/voronoi.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/methods/voronoif.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema/plot-config.json +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema_catalog.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/schema_diagnostics.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/templates_catalog.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/transform_contracts.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/utils/__init__.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/utils/cmaps.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/utils/dataframes.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/utils/expression.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/utils/interpolator.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/utils/pathing.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/validation.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/__init__.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/cap.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/config_cmd.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/data.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/doctor.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/dryrun.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/explain.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/man.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/suggest.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/template.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/verbs/validate.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/jarvisplot/yaml_io.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/setup.cfg +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_agent_envelope.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_axis_title.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_capabilities.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_cli_help.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_cli_verbs.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_cmaps.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_column_existence.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_config_addressing.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_config_edit.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_config_expand.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_data_access.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_data_describe.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_data_head_eval.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_data_loader_contracts.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_data_pipelines.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_density_cell_transform.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_diagnostic_guidance.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_docs_status_labels.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_doctor_partial.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_explain.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_figure_type_expander.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_fix_application.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_interp_2d_transform.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_interp_natural_neighbor.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_interpolator_contracts.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_jpcontour_methods.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_man_cli.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_method_contracts.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_parse_data_metadata.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_pathing_contracts.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_posterior_hpd.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_render_health.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_row_ledger.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_schema_catalog.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_suggest.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_suggest_axes.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_template_catalog.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_template_json.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_transform_contracts.py +0 -0
- {jarvisplot-2.0.0 → jarvisplot-2.0.2}/tests/test_validate_no_matplotlib.py +0 -0
|
@@ -26,6 +26,7 @@ from .layout_runtime import (
|
|
|
26
26
|
apply_manual_ticks,
|
|
27
27
|
ensure_numbered_rect_axes,
|
|
28
28
|
has_manual_ticks,
|
|
29
|
+
hide_log_minor_tick_labels,
|
|
29
30
|
is_numbered_ax,
|
|
30
31
|
)
|
|
31
32
|
from .colorbar_runtime import (
|
|
@@ -802,6 +803,7 @@ class Figure:
|
|
|
802
803
|
self.ax.set_yscale("log")
|
|
803
804
|
from matplotlib.ticker import LogLocator
|
|
804
805
|
self.ax.yaxis.set_minor_locator(LogLocator(subs='auto'))
|
|
806
|
+
hide_log_minor_tick_labels(self.ax, "y")
|
|
805
807
|
else:
|
|
806
808
|
self.ax.yaxis.set_minor_locator(AutoMinorLocator())
|
|
807
809
|
|
|
@@ -809,6 +811,7 @@ class Figure:
|
|
|
809
811
|
self.ax.set_xscale("log")
|
|
810
812
|
from matplotlib.ticker import LogLocator
|
|
811
813
|
self.ax.xaxis.set_minor_locator(LogLocator(subs='auto'))
|
|
814
|
+
hide_log_minor_tick_labels(self.ax, "x")
|
|
812
815
|
else:
|
|
813
816
|
self.ax.xaxis.set_minor_locator(AutoMinorLocator())
|
|
814
817
|
|
|
@@ -838,8 +841,8 @@ class Figure:
|
|
|
838
841
|
|
|
839
842
|
# Apply manual ticks here at initialization if provided in YAML
|
|
840
843
|
ax_ticks_cfg = self.frame.get('ax', {}).get('ticks', {})
|
|
841
|
-
|
|
842
|
-
|
|
844
|
+
self._apply_manual_ticks(self.ax, "x", ax_ticks_cfg.get('x', {}))
|
|
845
|
+
self._apply_manual_ticks(self.ax, "y", ax_ticks_cfg.get('y', {}))
|
|
843
846
|
|
|
844
847
|
|
|
845
848
|
self.ax.tick_params(**self.frame['ax']['ticks'].get("both", {}))
|
|
@@ -61,6 +61,19 @@ def apply_axis_title(fig, ax_obj, ax_name: str) -> None:
|
|
|
61
61
|
ax_obj.text(s=str(title), **text_params)
|
|
62
62
|
|
|
63
63
|
|
|
64
|
+
def hide_log_minor_tick_labels(ax_obj, which: str) -> None:
|
|
65
|
+
"""Keep log minor tick marks, but hide their labels by default."""
|
|
66
|
+
target = ax_obj.ax if hasattr(ax_obj, "ax") else ax_obj
|
|
67
|
+
if which == "x":
|
|
68
|
+
target.tick_params(
|
|
69
|
+
axis="x", which="minor", labelbottom=False, labeltop=False
|
|
70
|
+
)
|
|
71
|
+
elif which == "y":
|
|
72
|
+
target.tick_params(
|
|
73
|
+
axis="y", which="minor", labelleft=False, labelright=False
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
|
|
64
77
|
def ensure_numbered_rect_axes(fig, ax_name: str, kwgs: dict):
|
|
65
78
|
if not is_numbered_ax(ax_name):
|
|
66
79
|
raise ValueError(f"Illegal dynamic axes name '{ax_name}'. Only ax<NUMBER> is allowed.")
|
|
@@ -88,12 +101,14 @@ def ensure_numbered_rect_axes(fig, ax_name: str, kwgs: dict):
|
|
|
88
101
|
if fig.frame.get(ax_name, {}).get("yscale", "").lower() == "log":
|
|
89
102
|
ax_obj.set_yscale("log")
|
|
90
103
|
ax_obj.yaxis.set_minor_locator(LogLocator(subs="auto"))
|
|
104
|
+
hide_log_minor_tick_labels(ax_obj, "y")
|
|
91
105
|
else:
|
|
92
106
|
ax_obj.yaxis.set_minor_locator(AutoMinorLocator())
|
|
93
107
|
|
|
94
108
|
if fig.frame.get(ax_name, {}).get("xscale", "").lower() == "log":
|
|
95
109
|
ax_obj.set_xscale("log")
|
|
96
110
|
ax_obj.xaxis.set_minor_locator(LogLocator(subs="auto"))
|
|
111
|
+
hide_log_minor_tick_labels(ax_obj, "x")
|
|
97
112
|
else:
|
|
98
113
|
ax_obj.xaxis.set_minor_locator(AutoMinorLocator())
|
|
99
114
|
|
|
@@ -285,11 +285,22 @@ class JarvisPLOT():
|
|
|
285
285
|
def _maybe_write_agent_digest(self, figure_cfg, figobj) -> None:
|
|
286
286
|
"""Write figure-level agent_output digest after a successful plot."""
|
|
287
287
|
try:
|
|
288
|
-
from .agent_digest import
|
|
288
|
+
from .agent_digest import (
|
|
289
|
+
load_figure_source_dataframe,
|
|
290
|
+
maybe_write_figure_digest,
|
|
291
|
+
parse_agent_output,
|
|
292
|
+
)
|
|
289
293
|
from .cli import JPLOT_VERSION
|
|
290
294
|
|
|
291
295
|
if not isinstance(figure_cfg, dict):
|
|
292
296
|
return
|
|
297
|
+
# Do not load the source dataframe just to discover that no agent
|
|
298
|
+
# digest was requested. This matters after rendering releases the
|
|
299
|
+
# last layer's source data.
|
|
300
|
+
root_config = getattr(self.yaml, "config", {}) or {}
|
|
301
|
+
root_output = root_config.get("output", {}) if isinstance(root_config, dict) else {}
|
|
302
|
+
if parse_agent_output(figure_cfg, root_output=root_output) is None:
|
|
303
|
+
return
|
|
293
304
|
# Prefer raw YAML figure block (pre type-expand may have type: fields).
|
|
294
305
|
# After expand_figure_types, config figures are already expanded; still OK.
|
|
295
306
|
df = load_figure_source_dataframe(self, figure_cfg)
|
|
@@ -412,6 +412,7 @@ class _ClassicGraph:
|
|
|
412
412
|
self.output_variable_dx = float(self.classic.get("output_variable_dx", self.variable_dx))
|
|
413
413
|
self.bridge_y_offset = float(self.classic.get("bridge_y_offset", 0.45))
|
|
414
414
|
self.bridge_output_pad = float(self.classic.get("bridge_output_pad", 0.18))
|
|
415
|
+
self.module_icon_size = float(self.classic.get("module_icon_size", 0.9))
|
|
415
416
|
self.mains: dict[str, dict] = {}
|
|
416
417
|
self.files: dict[str, dict] = {}
|
|
417
418
|
self.variables: dict[str, dict] = {}
|
|
@@ -585,7 +586,7 @@ class _ClassicGraph:
|
|
|
585
586
|
y = cursor - height / 2.0
|
|
586
587
|
self._place_main_group(main_id, x, y, height)
|
|
587
588
|
cursor -= height + self.group_gap
|
|
588
|
-
self._place_standalone_bridges(layer_id, x, max_height)
|
|
589
|
+
self._place_standalone_bridges(layer_id, x, max_height, layer_groups.get(layer_id, []))
|
|
589
590
|
|
|
590
591
|
self._place_unpositioned_variables(max_height)
|
|
591
592
|
self._compute_bounds(max_height)
|
|
@@ -704,11 +705,20 @@ class _ClassicGraph:
|
|
|
704
705
|
self._place_variable(var_id, x - self.input_variable_dx, y, align="right")
|
|
705
706
|
self._place_variables(self._direct_output_variables(main_id), x + self.output_variable_dx, y, align="right")
|
|
706
707
|
|
|
707
|
-
def _place_standalone_bridges(self, layer_id: str, x: float, max_height: float) -> None:
|
|
708
|
+
def _place_standalone_bridges(self, layer_id: str, x: float, max_height: float, main_ids: list[str]) -> None:
|
|
708
709
|
bridges = self._standalone_bridges(layer_id)
|
|
709
710
|
if not bridges:
|
|
710
711
|
return
|
|
711
|
-
|
|
712
|
+
main_items = [self.mains[main_id] for main_id in main_ids if main_id in self.mains]
|
|
713
|
+
if main_items:
|
|
714
|
+
module_top = max(item["pos"][1] + self.module_icon_size / 2.0 for item in main_items)
|
|
715
|
+
lowest_bridge_y = module_top + self.bridge_y_offset
|
|
716
|
+
ys = [
|
|
717
|
+
lowest_bridge_y + (len(bridges) - 1 - idx) * self.var_gap
|
|
718
|
+
for idx in range(len(bridges))
|
|
719
|
+
]
|
|
720
|
+
else:
|
|
721
|
+
ys = self._spread_y(max_height / 2.0 + self.bridge_y_offset, len(bridges), self.var_gap)
|
|
712
722
|
for node_id, y in zip(bridges, ys):
|
|
713
723
|
label = str(self.nodes[node_id].get("label") or "")
|
|
714
724
|
self.bridges[node_id] = {
|
|
@@ -823,12 +833,18 @@ class _ClassicGraph:
|
|
|
823
833
|
return [str(node_id) for node_id in layer.get("nodes", [])]
|
|
824
834
|
return []
|
|
825
835
|
|
|
826
|
-
def _bridge_order_key(self, bridge_id: str) -> tuple[
|
|
836
|
+
def _bridge_order_key(self, bridge_id: str) -> tuple[float, float, str]:
|
|
827
837
|
source_id = None
|
|
828
838
|
for edge in self.edges:
|
|
829
839
|
if str(edge.get("target", {}).get("node")) == bridge_id:
|
|
830
840
|
source_id = str(edge.get("source", {}).get("node"))
|
|
831
841
|
break
|
|
842
|
+
|
|
843
|
+
source_item = self.variables.get(source_id or "") or self.bridges.get(source_id or "")
|
|
844
|
+
if source_item is not None:
|
|
845
|
+
# Preserve the actual top-to-bottom order of the previous layer.
|
|
846
|
+
return (0.0, -float(source_item["pos"][1]), bridge_id)
|
|
847
|
+
|
|
832
848
|
source_node = self.nodes.get(source_id or "")
|
|
833
849
|
source_layer = str(source_node.get("layer", "")) if isinstance(source_node, Mapping) else ""
|
|
834
850
|
layer_ids = self._layer_node_ids(source_layer)
|
|
@@ -841,7 +857,7 @@ class _ClassicGraph:
|
|
|
841
857
|
if str(layer.get("id")) == source_layer:
|
|
842
858
|
layer_pos = idx
|
|
843
859
|
break
|
|
844
|
-
return (layer_pos, source_pos, bridge_id)
|
|
860
|
+
return (float(layer_pos + 1), float(source_pos), bridge_id)
|
|
845
861
|
|
|
846
862
|
def _incoming_variables(self, target_id: str) -> list[str]:
|
|
847
863
|
return self._unique(
|
|
@@ -5,6 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
import json
|
|
6
6
|
import textwrap
|
|
7
7
|
from pathlib import Path
|
|
8
|
+
from types import SimpleNamespace
|
|
8
9
|
|
|
9
10
|
import numpy as np
|
|
10
11
|
|
|
@@ -18,6 +19,30 @@ from jarvisplot.client import main
|
|
|
18
19
|
from jarvisplot.diagnostics import DiagnosticBag
|
|
19
20
|
|
|
20
21
|
|
|
22
|
+
def test_render_skips_agent_digest_source_load_when_not_requested(monkeypatch):
|
|
23
|
+
from jarvisplot.core import JarvisPLOT
|
|
24
|
+
|
|
25
|
+
core = JarvisPLOT()
|
|
26
|
+
core.yaml = SimpleNamespace(config={"output": {}})
|
|
27
|
+
core.logger = SimpleNamespace(warning=lambda *args, **kwargs: None)
|
|
28
|
+
|
|
29
|
+
def fail_if_source_is_loaded(*args, **kwargs):
|
|
30
|
+
raise AssertionError("agent digest source should not load when disabled")
|
|
31
|
+
|
|
32
|
+
monkeypatch.setattr(
|
|
33
|
+
"jarvisplot.agent_digest.load_figure_source_dataframe",
|
|
34
|
+
fail_if_source_is_loaded,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
core._maybe_write_agent_digest(
|
|
38
|
+
{
|
|
39
|
+
"name": "plain_plot",
|
|
40
|
+
"layers": [{"data": [{"source": "samples"}]}],
|
|
41
|
+
},
|
|
42
|
+
SimpleNamespace(),
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
21
46
|
def test_strip_digest_axes_stash_removes_key(tmp_path):
|
|
22
47
|
from jarvisplot.agent_digest import strip_digest_axes_stash
|
|
23
48
|
|
|
@@ -716,6 +716,39 @@ def test_colorbar_manual_y_ticks_override_auto_ticks(axc_name):
|
|
|
716
716
|
plt.close(fig.fig)
|
|
717
717
|
|
|
718
718
|
|
|
719
|
+
def test_main_axis_manual_log_x_ticks_are_applied_and_preserved():
|
|
720
|
+
positions = [0.1, 1.0, 5.0]
|
|
721
|
+
labels = ["0.1", "1", "5"]
|
|
722
|
+
|
|
723
|
+
fig = Figure()
|
|
724
|
+
fig.logger = _logger()
|
|
725
|
+
fig.frame = {
|
|
726
|
+
"figure": {"figsize": (2, 2)},
|
|
727
|
+
"ax": {
|
|
728
|
+
"labels": {"x": "", "y": ""},
|
|
729
|
+
"xlim": [0.1, 5.0],
|
|
730
|
+
"ylim": [0.1, 5.0],
|
|
731
|
+
"xscale": "log",
|
|
732
|
+
"yscale": "linear",
|
|
733
|
+
"ticks": {"x": {"positions": positions, "labels": labels}},
|
|
734
|
+
},
|
|
735
|
+
}
|
|
736
|
+
fig.fig = plt.figure(figsize=(2, 2))
|
|
737
|
+
fig.axes = {}
|
|
738
|
+
fig.ax = {"rect": [0.1, 0.1, 0.8, 0.8]}
|
|
739
|
+
|
|
740
|
+
fig.render()
|
|
741
|
+
fig.fig.canvas.draw()
|
|
742
|
+
|
|
743
|
+
np.testing.assert_allclose(fig.ax.xaxis.get_majorticklocs(), positions)
|
|
744
|
+
assert [label.get_text() for label in fig.ax.get_xticklabels()] == labels
|
|
745
|
+
assert all(
|
|
746
|
+
not tick.label1.get_visible() and not tick.label2.get_visible()
|
|
747
|
+
for tick in fig.ax.xaxis.get_minor_ticks()
|
|
748
|
+
)
|
|
749
|
+
plt.close(fig.fig)
|
|
750
|
+
|
|
751
|
+
|
|
719
752
|
@pytest.mark.parametrize("ax_type", ["rect", "tri"])
|
|
720
753
|
def test_render_layer_does_not_mutate_layer_data(monkeypatch, ax_type):
|
|
721
754
|
original_data = object()
|
|
@@ -158,7 +158,10 @@ def test_flowchart_synthesizes_missing_bridge_for_cross_layer_file_input():
|
|
|
158
158
|
],
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
-
graph = _ClassicGraph(
|
|
161
|
+
graph = _ClassicGraph(
|
|
162
|
+
scene,
|
|
163
|
+
{"classic": {"synthesize_missing_bridges": True, "bridge_y_offset": 0.6}},
|
|
164
|
+
)
|
|
162
165
|
|
|
163
166
|
bridge_id = "bridge::x::L2"
|
|
164
167
|
assert bridge_id in graph.nodes
|
|
@@ -181,6 +184,66 @@ def test_flowchart_synthesizes_missing_bridge_for_cross_layer_file_input():
|
|
|
181
184
|
for edge in graph.edges
|
|
182
185
|
)
|
|
183
186
|
|
|
187
|
+
graph.layout()
|
|
188
|
+
module_top = graph.mains["FirstModule"]["pos"][1] + graph.module_icon_size / 2.0
|
|
189
|
+
bridge_y = graph.bridges[bridge_id]["pos"][1]
|
|
190
|
+
assert abs(bridge_y - module_top - 0.6) < 1e-9
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def test_flowchart_orders_bridge_chain_by_previous_layer_y_position():
|
|
194
|
+
scene = {
|
|
195
|
+
"schema": "jarvisplot.scene/v1",
|
|
196
|
+
"scene_type": "flowchart",
|
|
197
|
+
"layers": [
|
|
198
|
+
{"id": "layer_1", "index": 1, "nodes": ["Parameters", "var::top", "var::bottom"]},
|
|
199
|
+
{"id": "layer_2", "index": 2, "nodes": []},
|
|
200
|
+
{"id": "layer_3", "index": 3, "nodes": []},
|
|
201
|
+
{
|
|
202
|
+
"id": "layer_4",
|
|
203
|
+
"index": 4,
|
|
204
|
+
"nodes": ["FinalModule", "file::FinalModule::input::final_input"],
|
|
205
|
+
},
|
|
206
|
+
],
|
|
207
|
+
"nodes": [
|
|
208
|
+
{"id": "Parameters", "kind": "source", "label": "Parameters", "layer": "layer_1"},
|
|
209
|
+
{"id": "var::top", "kind": "variable", "role": "parameter", "label": "top", "layer": "layer_1"},
|
|
210
|
+
{"id": "var::bottom", "kind": "variable", "role": "parameter", "label": "bottom", "layer": "layer_1"},
|
|
211
|
+
{"id": "FinalModule", "kind": "module", "label": "FinalModule", "layer": "layer_4"},
|
|
212
|
+
{
|
|
213
|
+
"id": "file::FinalModule::input::final_input",
|
|
214
|
+
"kind": "file",
|
|
215
|
+
"role": "input_file",
|
|
216
|
+
"label": "final_input",
|
|
217
|
+
"layer": "layer_4",
|
|
218
|
+
},
|
|
219
|
+
],
|
|
220
|
+
"edges": [
|
|
221
|
+
{"source": {"node": "Parameters", "port": "top"}, "target": {"node": "var::top", "port": "in"}, "role": "parameterflow"},
|
|
222
|
+
{"source": {"node": "Parameters", "port": "bottom"}, "target": {"node": "var::bottom", "port": "in"}, "role": "parameterflow"},
|
|
223
|
+
{
|
|
224
|
+
"source": {"node": "var::bottom", "port": "out"},
|
|
225
|
+
"target": {"node": "file::FinalModule::input::final_input", "port": "in"},
|
|
226
|
+
"role": "fileflow",
|
|
227
|
+
"metadata": {"variable": "bottom"},
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"source": {"node": "var::top", "port": "out"},
|
|
231
|
+
"target": {"node": "file::FinalModule::input::final_input", "port": "in"},
|
|
232
|
+
"role": "fileflow",
|
|
233
|
+
"metadata": {"variable": "top"},
|
|
234
|
+
},
|
|
235
|
+
],
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
graph = _ClassicGraph(scene, {"classic": {"synthesize_missing_bridges": True}})
|
|
239
|
+
graph.layout()
|
|
240
|
+
|
|
241
|
+
layer_2_bridges = graph._standalone_bridges("layer_2")
|
|
242
|
+
layer_3_bridges = graph._standalone_bridges("layer_3")
|
|
243
|
+
assert layer_2_bridges == ["bridge::top::L2", "bridge::bottom::L2"]
|
|
244
|
+
assert layer_3_bridges == ["bridge::top::L3", "bridge::bottom::L3"]
|
|
245
|
+
assert graph.bridges["bridge::top::L3"]["pos"][1] > graph.bridges["bridge::bottom::L3"]["pos"][1]
|
|
246
|
+
|
|
184
247
|
|
|
185
248
|
def test_flowchart_uses_triangle_for_file_output_variables():
|
|
186
249
|
scene = {
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|