usage-cli 0.34.2__tar.gz → 0.34.4__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.
- {usage_cli-0.34.2/usage_cli.egg-info → usage_cli-0.34.4}/PKG-INFO +1 -1
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/muse_quota_probe.py +2 -1
- {usage_cli-0.34.2 → usage_cli-0.34.4}/pyproject.toml +1 -1
- {usage_cli-0.34.2 → usage_cli-0.34.4}/quota/codex_window_keeper.py +2 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/quota/window_keeper.py +6 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_codex_window_keeper.py +1 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_muse_quota_probe.py +9 -1
- usage_cli-0.34.4/tests/test_taskbar_obstacles.py +118 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_window_keeper.py +4 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4/usage_cli.egg-info}/PKG-INFO +1 -1
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_cli.egg-info/SOURCES.txt +1 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/wintray/taskbar_obstacles.py +73 -1
- {usage_cli-0.34.2 → usage_cli-0.34.4}/LICENSE +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/README.md +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/THIRD_PARTY_NOTICES.md +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/adapters/__init__.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/adapters/agy.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/adapters/claude.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/adapters/codex.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/adapters/grok.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/adapters/muse.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/adapters/rate_limits.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/adapters/registry.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/adapters/types.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/analyzer/__init__.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/analyzer/aggregator.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/analyzer/blocks.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/analyzer/diagnoser.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/analyzer/diagnosis_snapshot.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/analyzer/dispatch_ledger.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/analyzer/history_persist.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/analyzer/insights.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/analyzer/ledger_backfill.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/analyzer/persona_loader.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/analyzer/reporter.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/analyzer/subscription.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/analyzer/usage_snapshot.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/i18n.json +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/installer/__init__.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/installer/claude_pane.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/installer/codex_hook_trust.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/installer/login_item.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/installer/session_hooks.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/installer/setup_hook.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/installer/statusline_settings.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/__init__.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/_shared_cache_file.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/agy_disk_cache.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/agy_loader.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/agy_quota_probe.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/cache_quarantine.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/chromium_cache.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/claude_desktop.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/claude_paths.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/claude_usage.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/codex_disk_cache.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/codex_events.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/codex_fork_replay.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/codex_loader.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/codex_paths.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/disk_cache_common.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/disk_cache_lifecycle.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/grok_loader.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/grok_quota_probe.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/history_disk_cache.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/history_loader.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/jsonl_limits.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/jsonl_utils.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/loaders/muse_loader.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/main.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/__init__.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/actions.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/agy.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/app.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/chrome.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/fsevents_watch.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/grok.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/manual_refresh.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/menu.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/muse.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/new_badge.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/notify.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/popover.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/prefs.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/refresh.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/state.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/title.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/update.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/menubar/whats_new.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/panels/__init__.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/panels/base.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/panels/catalog.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/panels/dynamic_height.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/panels/panel_scale.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/panels/panel_window.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/panels/panel_window_state.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/panels/payload.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/panels/web_panel.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/panels/window_drag.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/quota/__init__.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/quota/agy_window_keeper.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/quota/burn_rate.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/quota/keeper_outcome.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/quota/notifications.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/quota/quota_snapshot.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/quota/status_payload.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/quota/usage_rate.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/setup.cfg +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/setup_app.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_adapters_claude.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_adapters_codex.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_adapters_rate_limits.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_aggregator.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_agy_adapter.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_agy_disk_cache.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_agy_loader.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_agy_quota_probe.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_agy_window_keeper.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_analyzer_blocks.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_analyzer_pipeline.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_app_version.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_burn_rate.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_cache_quarantine.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_check_upstream.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_chromium_cache.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_claude_desktop.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_claude_pane.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_claude_paths.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_codex_consistency.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_codex_hook_trust.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_codex_loader.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_compact_cards.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_desktop_fresh_cache.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_desktop_quota_display.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_desktop_quota_review.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_diagnoser.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_disk_cache_shards.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_dispatch_ledger.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_doctor.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_dynamic_height.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_fsevents_watch.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_grok_loader.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_grok_quota_probe.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_history_loader.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_history_persist.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_hook_scripts_are_standalone.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_html_report_snapshot.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_i18n_format_fallback.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_i18n_key_parity.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_i18n_packaged_path.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_insights.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_jsonl_utils.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_keeper_menu.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_keeper_outcome.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_ledger_backfill.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_login_item.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_main.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_manual_refresh.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_menubar.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_menubar_agy.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_menubar_grok.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_menubar_muse.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_menubar_notify.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_menubar_prefs.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_menubar_state.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_menubar_update.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_muse_coverage.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_muse_loader.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_muse_review_regressions.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_new_badge.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_packaged_resources.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_packaging.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_panel_footer_layout.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_panel_scale.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_panel_window_state.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_panels.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_panels_lazy_import.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_persona_loader.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_pricing.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_project_resolver.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_quota_aware.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_quota_label.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_report_cold_read.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_report_daily_chart.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_report_filter_js.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_report_share_mask.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_reporter_build_data.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_service_status.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_session_resume.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_setup_app.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_setup_hook.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_setup_hook_coexistence.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_setup_hook_resume.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_setup_hook_terse.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_subprocess_utils.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_subscription.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_taskbar_menu.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_time_utils.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_tui.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_tui_sprite.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_ui_tables.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_update_checker.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_update_gate.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_update_release_notes.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_cli.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_client.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_diagnosis_snapshot.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_dir_sweeper.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_lang.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_logging.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_notifications.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_rate.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_snapshot.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_snapshot_replay.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_statusline.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_statusline_agy.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_statusline_forwarder.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_statusline_grok.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_terse_mode.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_usage_terse_reminder.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_web_panel_payload.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_whats_new.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_wheel_packaging.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_win_login_item.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_windows_manifest.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tests/test_wintray.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tui/__init__.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tui/app.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/tui/sprite.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/ui/__init__.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/ui/html_report.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/ui/report_charts.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/ui/report_daily_chart.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/ui/report_filter.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/ui/report_ledger.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/ui/report_scripts.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/ui/report_styles.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/ui/tables.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/updates/__init__.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/updates/checker.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/updates/gate.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/updates/release_notes.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/updates/whats_new.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_app/__init__.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_app/cli.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_app/doctor.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_cli.egg-info/dependency_links.txt +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_cli.egg-info/entry_points.txt +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_cli.egg-info/requires.txt +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_cli.egg-info/top_level.txt +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_common/__init__.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_common/app_version.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_common/i18n.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_common/prefs.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_common/pricing.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_common/project_resolver.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_common/service_status.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_common/subprocess_utils.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_common/time_utils.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_common/usage_dir_sweeper.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_common/usage_lang.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_common/usage_logging.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_hooks/__init__.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_hooks/usage_quota_aware.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_hooks/usage_session_resume.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_hooks/usage_statusline.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_hooks/usage_statusline_agy.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_hooks/usage_statusline_forwarder.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_hooks/usage_statusline_grok.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_hooks/usage_terse_mode.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/usage_hooks/usage_terse_reminder.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/wintray/__init__.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/wintray/app.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/wintray/login_item.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/wintray/menu.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/wintray/prefs.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/wintray/quota_label.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/wintray/taskbar_menu.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/wintray/taskbar_overlay.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/wintray/watch.py +0 -0
- {usage_cli-0.34.2 → usage_cli-0.34.4}/wintray/whats_new.py +0 -0
|
@@ -76,7 +76,8 @@ def validate_muse_cache(payload: object) -> MuseQuotaResult | None:
|
|
|
76
76
|
if not isinstance(window, dict):
|
|
77
77
|
return None
|
|
78
78
|
used, reset = window.get("used_percent"), window.get("resets_at")
|
|
79
|
-
|
|
79
|
+
# An exhausted window reports past 100 (e.g. 104); the row clamps it for display.
|
|
80
|
+
if not _number(used) or not _number(reset) or used < 0:
|
|
80
81
|
return None
|
|
81
82
|
windows.append(MuseQuotaWindow(used_percent=float(used), resets_at=float(reset)))
|
|
82
83
|
return MuseQuotaResult(
|
|
@@ -171,6 +171,8 @@ def _run_codex_ping(codex_bin: str) -> subprocess.CompletedProcess[str]:
|
|
|
171
171
|
"-m",
|
|
172
172
|
"gpt-5.6-luna",
|
|
173
173
|
"--skip-git-repo-check",
|
|
174
|
+
# Keep the ping out of the user's `codex resume` list.
|
|
175
|
+
"--ephemeral",
|
|
174
176
|
"-c",
|
|
175
177
|
"features.hooks=false",
|
|
176
178
|
"-c",
|
|
@@ -172,6 +172,12 @@ def _run_claude_ping(claude_bin: str) -> subprocess.CompletedProcess[str]:
|
|
|
172
172
|
"haiku",
|
|
173
173
|
"--settings",
|
|
174
174
|
str(KEEPER_CLAUDE_SETTINGS_PATH),
|
|
175
|
+
# No tools or MCP servers keeps the ping small; no persistence keeps
|
|
176
|
+
# it out of the user's /resume list.
|
|
177
|
+
"--tools",
|
|
178
|
+
"",
|
|
179
|
+
"--strict-mcp-config",
|
|
180
|
+
"--no-session-persistence",
|
|
175
181
|
],
|
|
176
182
|
stdin=subprocess.DEVNULL,
|
|
177
183
|
capture_output=True,
|
|
@@ -60,13 +60,21 @@ def test_read_missing_corrupt_and_good_cache() -> None:
|
|
|
60
60
|
assert probe.read_cache() == quota()
|
|
61
61
|
|
|
62
62
|
|
|
63
|
-
@pytest.mark.parametrize("value", [True, None, "25", -1,
|
|
63
|
+
@pytest.mark.parametrize("value", [True, None, "25", -1, float("nan"), float("inf"), 10**400])
|
|
64
64
|
def test_invalid_percent_rejected(value: object) -> None:
|
|
65
65
|
raw = event()
|
|
66
66
|
raw["payload"]["allowance"]["window"]["used_percent"] = value
|
|
67
67
|
assert probe.parse_muse_allowance(json.dumps(raw), 1000) is None
|
|
68
68
|
|
|
69
69
|
|
|
70
|
+
@pytest.mark.parametrize("value", [100, 104, 105, 250])
|
|
71
|
+
def test_exhausted_window_past_100_is_kept(value: int) -> None:
|
|
72
|
+
raw = event()
|
|
73
|
+
raw["payload"]["allowance"]["window"]["used_percent"] = value
|
|
74
|
+
result = probe.parse_muse_allowance(json.dumps(raw), 1000)
|
|
75
|
+
assert result is not None and result["window"]["used_percent"] == value
|
|
76
|
+
|
|
77
|
+
|
|
70
78
|
def test_missing_weekly_is_rejected() -> None:
|
|
71
79
|
raw = event()
|
|
72
80
|
del raw["payload"]["allowance"]["weekly"]
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
# Copyright (C) 2026 lollapalooza <https://github.com/aqua5230>
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import ctypes as C
|
|
7
|
+
import importlib
|
|
8
|
+
from collections.abc import Iterator
|
|
9
|
+
from types import SimpleNamespace
|
|
10
|
+
from typing import Any
|
|
11
|
+
from unittest.mock import Mock
|
|
12
|
+
|
|
13
|
+
import pytest
|
|
14
|
+
|
|
15
|
+
from wintray import taskbar_obstacles as obstacles
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@pytest.fixture(autouse=True)
|
|
19
|
+
def clear_wts_api_cache() -> Iterator[None]:
|
|
20
|
+
obstacles._wts_api.cache_clear()
|
|
21
|
+
yield
|
|
22
|
+
obstacles._wts_api.cache_clear()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_session_flags_offset() -> None:
|
|
26
|
+
assert (
|
|
27
|
+
obstacles._WTSINFOEXW.Data.offset + obstacles._WTSINFOEX_LEVEL1_W.SessionFlags.offset == 16
|
|
28
|
+
)
|
|
29
|
+
assert C.sizeof(obstacles._WTSINFOEXW) == 232
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@pytest.mark.parametrize("flags, locked", [(0, True), (1, False), (-1, False)])
|
|
33
|
+
def test_session_locked_reads_buffer(
|
|
34
|
+
monkeypatch: pytest.MonkeyPatch, flags: int, locked: bool
|
|
35
|
+
) -> None:
|
|
36
|
+
info = obstacles._WTSINFOEXW(Level=1)
|
|
37
|
+
info.Data.WTSInfoExLevel1.SessionFlags = flags
|
|
38
|
+
|
|
39
|
+
def query(server: object, session: int, kind: int, buffer: Any, size: Any) -> int:
|
|
40
|
+
assert (server, session, kind) == (None, 0xFFFFFFFF, 25)
|
|
41
|
+
C.cast(buffer, C.POINTER(C.c_void_p))[0] = C.addressof(info)
|
|
42
|
+
C.cast(size, C.POINTER(C.c_uint32))[0] = C.sizeof(info)
|
|
43
|
+
return 1
|
|
44
|
+
|
|
45
|
+
wts = SimpleNamespace(WTSQuerySessionInformationW=Mock(side_effect=query), WTSFreeMemory=Mock())
|
|
46
|
+
load = Mock(return_value=wts)
|
|
47
|
+
monkeypatch.setattr(C, "WinDLL", load, raising=False)
|
|
48
|
+
|
|
49
|
+
assert obstacles._session_locked() is locked
|
|
50
|
+
load.assert_called_once_with("wtsapi32", use_last_error=True)
|
|
51
|
+
assert wts.WTSQuerySessionInformationW.restype is C.c_int
|
|
52
|
+
assert len(wts.WTSQuerySessionInformationW.argtypes) == 5
|
|
53
|
+
wts.WTSFreeMemory.assert_called_once()
|
|
54
|
+
assert wts.WTSFreeMemory.call_args.args[0].value == C.addressof(info)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_session_locked_api_failure(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
58
|
+
wts = SimpleNamespace(WTSQuerySessionInformationW=Mock(return_value=0), WTSFreeMemory=Mock())
|
|
59
|
+
monkeypatch.setattr(C, "WinDLL", Mock(return_value=wts), raising=False)
|
|
60
|
+
assert obstacles._session_locked() is False
|
|
61
|
+
wts.WTSFreeMemory.assert_not_called()
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@pytest.mark.parametrize("error", [OSError("unavailable"), AttributeError("WinDLL")])
|
|
65
|
+
def test_session_locked_unavailable(monkeypatch: pytest.MonkeyPatch, error: Exception) -> None:
|
|
66
|
+
monkeypatch.setattr(C, "WinDLL", Mock(side_effect=error), raising=False)
|
|
67
|
+
assert obstacles._session_locked() is False
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def test_watch_preserves_snapshot_while_locked_then_refreshes(
|
|
71
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
72
|
+
) -> None:
|
|
73
|
+
bounds = SimpleNamespace(Left=1.2, Top=2.3, Right=30.4, Bottom=40.5, IsEmpty=False)
|
|
74
|
+
button = SimpleNamespace(Current=SimpleNamespace(BoundingRectangle=bounds, IsOffscreen=False))
|
|
75
|
+
find_all = Mock(return_value=[button])
|
|
76
|
+
element = SimpleNamespace(
|
|
77
|
+
ControlTypeProperty="control",
|
|
78
|
+
FromHandle=Mock(return_value=SimpleNamespace(FindAll=find_all)),
|
|
79
|
+
)
|
|
80
|
+
modules = {
|
|
81
|
+
"clr": SimpleNamespace(AddReference=Mock()),
|
|
82
|
+
"System.Runtime.InteropServices": SimpleNamespace(
|
|
83
|
+
RuntimeEnvironment=SimpleNamespace(GetRuntimeDirectory=lambda: "/framework")
|
|
84
|
+
),
|
|
85
|
+
"System.Windows.Automation": SimpleNamespace(
|
|
86
|
+
AutomationElement=element,
|
|
87
|
+
OrCondition=Mock(),
|
|
88
|
+
PropertyCondition=Mock(),
|
|
89
|
+
ControlType=SimpleNamespace(Button="button", ListItem="item"),
|
|
90
|
+
TreeScope=SimpleNamespace(Descendants="descendants"),
|
|
91
|
+
),
|
|
92
|
+
"System": SimpleNamespace(IntPtr=lambda hwnd: hwnd),
|
|
93
|
+
}
|
|
94
|
+
monkeypatch.setattr(importlib, "import_module", lambda name: modules[name])
|
|
95
|
+
monkeypatch.setattr(obstacles, "_session_locked", Mock(side_effect=[True, False]))
|
|
96
|
+
worker = obstacles.TaskbarObstacles.__new__(obstacles.TaskbarObstacles)
|
|
97
|
+
worker.hwnd = 123
|
|
98
|
+
worker.snapshot = (123, ((5, 6, 7, 8),))
|
|
99
|
+
stop = Mock()
|
|
100
|
+
stop.is_set.side_effect = [False, False, True]
|
|
101
|
+
worker._stop = stop
|
|
102
|
+
|
|
103
|
+
def wait(seconds: int) -> None:
|
|
104
|
+
assert seconds == 2
|
|
105
|
+
if stop.wait.call_count == 1:
|
|
106
|
+
find_all.assert_not_called()
|
|
107
|
+
element.FromHandle.assert_not_called()
|
|
108
|
+
assert worker.snapshot == (123, ((5, 6, 7, 8),))
|
|
109
|
+
else:
|
|
110
|
+
find_all.assert_called_once_with(
|
|
111
|
+
"descendants", modules["System.Windows.Automation"].OrCondition.return_value
|
|
112
|
+
)
|
|
113
|
+
assert worker.snapshot == (123, ((1, 2, 30, 40),))
|
|
114
|
+
|
|
115
|
+
stop.wait.side_effect = wait
|
|
116
|
+
worker._watch()
|
|
117
|
+
assert stop.wait.call_count == 2
|
|
118
|
+
assert worker.snapshot == (123, ((1, 2, 30, 40),))
|
|
@@ -38,6 +38,10 @@ def test_run_claude_ping_skips_user_hooks(monkeypatch: pytest.MonkeyPatch, tmp_p
|
|
|
38
38
|
"haiku",
|
|
39
39
|
"--settings",
|
|
40
40
|
str(settings_path),
|
|
41
|
+
"--tools",
|
|
42
|
+
"",
|
|
43
|
+
"--strict-mcp-config",
|
|
44
|
+
"--no-session-persistence",
|
|
41
45
|
]
|
|
42
46
|
assert settings_path.is_file()
|
|
43
47
|
assert json.loads(settings_path.read_text(encoding="utf-8")) == {"disableAllHooks": True}
|
|
@@ -5,9 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
+
import ctypes as C
|
|
8
9
|
import importlib
|
|
9
10
|
import logging
|
|
10
11
|
import threading
|
|
12
|
+
from functools import cache
|
|
11
13
|
from pathlib import Path
|
|
12
14
|
|
|
13
15
|
from wintray.taskbar_overlay import Rect
|
|
@@ -15,6 +17,76 @@ from wintray.taskbar_overlay import Rect
|
|
|
15
17
|
logger = logging.getLogger(__name__)
|
|
16
18
|
|
|
17
19
|
|
|
20
|
+
class _WTSINFOEX_LEVEL1_W(C.Structure):
|
|
21
|
+
# Windows WCHAR and LONG stay 16/32 bits even on hosts with wider C types.
|
|
22
|
+
_fields_ = [
|
|
23
|
+
("SessionId", C.c_uint32),
|
|
24
|
+
("SessionState", C.c_int32),
|
|
25
|
+
("SessionFlags", C.c_int32),
|
|
26
|
+
("WinStationName", C.c_uint16 * 33),
|
|
27
|
+
("UserName", C.c_uint16 * 21),
|
|
28
|
+
("DomainName", C.c_uint16 * 18),
|
|
29
|
+
("LogonTime", C.c_int64),
|
|
30
|
+
("ConnectTime", C.c_int64),
|
|
31
|
+
("DisconnectTime", C.c_int64),
|
|
32
|
+
("LastInputTime", C.c_int64),
|
|
33
|
+
("CurrentTime", C.c_int64),
|
|
34
|
+
("IncomingBytes", C.c_uint32),
|
|
35
|
+
("OutgoingBytes", C.c_uint32),
|
|
36
|
+
("IncomingFrames", C.c_uint32),
|
|
37
|
+
("OutgoingFrames", C.c_uint32),
|
|
38
|
+
("IncomingCompressedBytes", C.c_uint32),
|
|
39
|
+
("OutgoingCompressedBytes", C.c_uint32),
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class _WTSINFOEX_LEVEL_W(C.Union):
|
|
44
|
+
_fields_ = [("WTSInfoExLevel1", _WTSINFOEX_LEVEL1_W)]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class _WTSINFOEXW(C.Structure):
|
|
48
|
+
_fields_ = [("Level", C.c_uint32), ("Data", _WTSINFOEX_LEVEL_W)]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@cache
|
|
52
|
+
def _wts_api() -> C.CDLL:
|
|
53
|
+
# WinDLL is absent from ctypes and its stubs on non-Windows hosts.
|
|
54
|
+
loader = getattr(C, "WinDLL") # noqa: B009
|
|
55
|
+
wts: C.CDLL = loader("wtsapi32", use_last_error=True)
|
|
56
|
+
wts.WTSQuerySessionInformationW.argtypes = [
|
|
57
|
+
C.c_void_p,
|
|
58
|
+
C.c_uint32,
|
|
59
|
+
C.c_int,
|
|
60
|
+
C.POINTER(C.c_void_p),
|
|
61
|
+
C.POINTER(C.c_uint32),
|
|
62
|
+
]
|
|
63
|
+
wts.WTSQuerySessionInformationW.restype = C.c_int
|
|
64
|
+
wts.WTSFreeMemory.argtypes = [C.c_void_p]
|
|
65
|
+
wts.WTSFreeMemory.restype = None
|
|
66
|
+
return wts
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _session_locked() -> bool:
|
|
70
|
+
try:
|
|
71
|
+
wts = _wts_api()
|
|
72
|
+
buffer = C.c_void_p()
|
|
73
|
+
size = C.c_uint32()
|
|
74
|
+
try:
|
|
75
|
+
if not wts.WTSQuerySessionInformationW(
|
|
76
|
+
None, 0xFFFFFFFF, 25, C.byref(buffer), C.byref(size)
|
|
77
|
+
):
|
|
78
|
+
return False
|
|
79
|
+
if not buffer or size.value < C.sizeof(_WTSINFOEXW):
|
|
80
|
+
return False
|
|
81
|
+
info = C.cast(buffer, C.POINTER(_WTSINFOEXW)).contents
|
|
82
|
+
return bool(info.Level == 1 and info.Data.WTSInfoExLevel1.SessionFlags == 0)
|
|
83
|
+
finally:
|
|
84
|
+
if buffer:
|
|
85
|
+
wts.WTSFreeMemory(buffer)
|
|
86
|
+
except (OSError, AttributeError):
|
|
87
|
+
return False
|
|
88
|
+
|
|
89
|
+
|
|
18
90
|
class TaskbarObstacles:
|
|
19
91
|
def __init__(self) -> None:
|
|
20
92
|
self.hwnd = 0
|
|
@@ -42,7 +114,7 @@ class TaskbarObstacles:
|
|
|
42
114
|
)
|
|
43
115
|
while not self._stop.is_set():
|
|
44
116
|
hwnd = self.hwnd
|
|
45
|
-
if hwnd:
|
|
117
|
+
if hwnd and not _session_locked():
|
|
46
118
|
try:
|
|
47
119
|
root = element.FromHandle(system.IntPtr(hwnd))
|
|
48
120
|
buttons = root.FindAll(automation.TreeScope.Descendants, condition)
|
|
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
|
|
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
|