tuipet 0.2.330__tar.gz → 0.2.332__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.
- {tuipet-0.2.330/src/tuipet.egg-info → tuipet-0.2.332}/PKG-INFO +1 -1
- {tuipet-0.2.330 → tuipet-0.2.332}/pyproject.toml +1 -1
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data.py +27 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/egg.py +5 -1
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/persistence.py +20 -7
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/pet.py +44 -0
- {tuipet-0.2.330 → tuipet-0.2.332/src/tuipet.egg-info}/PKG-INFO +1 -1
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet.egg-info/SOURCES.txt +2 -0
- tuipet-0.2.332/tests/test_album_dex.py +52 -0
- tuipet-0.2.332/tests/test_stage_arrival.py +59 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/LICENSE +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/README.md +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/setup.cfg +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/__init__.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/adventure.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/adventurescreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/anim.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/app.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/assistscreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/battle.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/battlefx.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/battlescreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/cloudsync.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/attr_icons.json +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/backgrounds.json.gz +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/battle_overlays.json +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/careEffect.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/digicoreMenuConfig.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/digimon.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/dropRate.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/effects.json.gz +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/eggUnlock.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/eggs.json.gz +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/elementAffinity.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/enemies.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/evolutions.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/fieldAffinity.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/foods.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/habitats.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/hp_dummies.json +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/icons.json.gz +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/items.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/lines.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/lootTable.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/maps.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/orbs.json.gz +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/shopConsumable.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/alarm.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/angry.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/attack.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/attackHit.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/battle.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/cancel.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/champion.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/click.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/compatible.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/confirm.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/death.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/eat.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/error.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/evolve.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/happy.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/hatch.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/jogress.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/largePoop.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/lastBite.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/lose.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/menu.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/mischief.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/poop.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/refuse.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/reward.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/scroll.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/select.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/smallPoop.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/startBattle.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/strongAttack.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/strongHit.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/trainhit.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/wash.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/win.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/wind.wav +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sprites.json.gz +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/tournies.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/towns.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/zones.csv +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/deathscreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/digicorescreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/dnascreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/eggselectscreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/evolution.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/feedscreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/grid.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/habitatscreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/jogress.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/jogressscreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/lines.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/lobbyscreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/loot.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/menu.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/net.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/optionsscreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/placeholder.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/render.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/shop.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/shopscreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/sound.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/strikefx.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/theme.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/themescreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/titlescreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/tournament.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/tournamentscreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/townscreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/training.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/transportscreen.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/update.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/weather.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet.egg-info/dependency_links.txt +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet.egg-info/entry_points.txt +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet.egg-info/requires.txt +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet.egg-info/top_level.txt +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_adventure.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_adventure_math.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_adventure_scenery.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_anim_canon.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_anim_timing.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_announce.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_audit_fixes.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_auto_care.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_battle.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_battle_math.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_bedtime.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_birthday.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_body_math.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_care_asleep.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_care_bonus.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_data.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_dead_gate.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_death.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_digicore.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_digimemory.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_discipline.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_effects_integrity.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_egg_economy.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_egg_unlock.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_egg_unlock_math.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_energy_system.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_evolution.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_evolution_math.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_evolution_system.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_feed.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_feeding_math.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_filth_system.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_fx.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_gift_birthday_math.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_habitat.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_habitat_math.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_hud.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_hunger.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_item_effects.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_item_heal.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_jogress.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_jogress_math.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_line_curation.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_lines.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_lobby.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_lobby_screens.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_medicine.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_messages.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_mood_system.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_mortality_math.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_msg_strip.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_nav_quit.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_night_palette.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_obedience_system.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_options.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_panel_smoke.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_performance.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_persistence.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_persistence_audit.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_pet_effect.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_poop_model.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_poop_placement.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_protocol_math.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_rank_system.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_refusal.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_refusal_math.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_robustness.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_save_integrity.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_screen_sweep.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_sfx_scroll.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_shop.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_shop_economy.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_shop_math.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_sickness_system.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_sleep.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_sleep_system.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_sleep_weather_math.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_sound.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_status_box.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_status_icons.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_sync.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_theme.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_toilet.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_tournament.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_town.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_training.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_training_facing.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_training_hp.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_training_math.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_training_strike.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_training_system.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_ui_stats.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_update.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_verx.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_weight_system.py +0 -0
- {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_win_eggs.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tuipet
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.332
|
|
4
4
|
Summary: A terminal virtual pet (Digimon V-Pet style) rendered with halfblock sprites, built on data extracted from DVPet.
|
|
5
5
|
Author-email: Joel Taylor <joeltaylor734@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -389,6 +389,33 @@ def assist_pool():
|
|
|
389
389
|
return sorted(n for n, r in load_requirements().items() if r.get("can_assist"))
|
|
390
390
|
|
|
391
391
|
|
|
392
|
+
@lru_cache(maxsize=1)
|
|
393
|
+
def _name_canonical_map():
|
|
394
|
+
"""num -> the CANONICAL (lowest) num among same-name roster rows. DVPet
|
|
395
|
+
stores duplicate species rows (the 1410+ egg-hatch block mirrors the
|
|
396
|
+
chart's canonical rows) and its dex sync is BY NAME: checkNaturalUnlocked
|
|
397
|
+
propagates `unlocked` across every same-name row, so a form raised under
|
|
398
|
+
either num reveals both (album/dex audit 2026-07-06). Empty names stay
|
|
399
|
+
themselves -- never lump the unnamed rows into one group."""
|
|
400
|
+
_, by_num = load_sprites()
|
|
401
|
+
groups = {}
|
|
402
|
+
for n, rec in by_num.items():
|
|
403
|
+
nm = (rec.get("name") or "").upper()
|
|
404
|
+
if nm:
|
|
405
|
+
groups.setdefault(nm, []).append(n)
|
|
406
|
+
out = {}
|
|
407
|
+
for ns in groups.values():
|
|
408
|
+
c = min(ns)
|
|
409
|
+
for n in ns:
|
|
410
|
+
out[n] = c
|
|
411
|
+
return out
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
def canonical_num(num):
|
|
415
|
+
"""The name-canonical roster num (checkNaturalUnlocked's identity)."""
|
|
416
|
+
return _name_canonical_map().get(num, num)
|
|
417
|
+
|
|
418
|
+
|
|
392
419
|
@lru_cache(maxsize=1)
|
|
393
420
|
def _canonical_habitat_by_name():
|
|
394
421
|
"""DVPet stores duplicate species rows: the egg-hatch duplicates carry
|
|
@@ -121,7 +121,11 @@ def _conditions_met(rule, prog):
|
|
|
121
121
|
return False
|
|
122
122
|
if rule["map"] is not None and rule["map"] not in prog["maps"]:
|
|
123
123
|
return False
|
|
124
|
-
if rule["history"] and not all(n in prog["album"]
|
|
124
|
+
if rule["history"] and not all(data.canonical_num(n) in prog["album"]
|
|
125
|
+
for n in rule["history"]):
|
|
126
|
+
# name-canonical both sides (album/dex audit 2026-07-06): raising
|
|
127
|
+
# ChibiKiwimon as its 1432 hatch-twin satisfies a 944 history gate,
|
|
128
|
+
# exactly like canon's checkNaturalUnlocked name sync
|
|
125
129
|
return False
|
|
126
130
|
if rule["prev_field"] is not None and prog["last_field"] != rule["prev_field"]:
|
|
127
131
|
return False
|
|
@@ -51,8 +51,14 @@ def save_settings(d, path=None):
|
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
def get_album():
|
|
54
|
-
"""Set of distinct Digimon species
|
|
55
|
-
|
|
54
|
+
"""Set of distinct Digimon species ever raised, NAME-CANONICAL (the
|
|
55
|
+
DM20-style zukan). DVPet's dex sync is by name (checkNaturalUnlocked):
|
|
56
|
+
the 1410+ egg-hatch duplicate rows and their chart twins reveal together
|
|
57
|
+
-- old saves may hold either num, so entries canonicalize on read
|
|
58
|
+
(album/dex audit 2026-07-06)."""
|
|
59
|
+
from . import data
|
|
60
|
+
return {data.canonical_num(n)
|
|
61
|
+
for n in load_settings().get("progress", {}).get("album", [])}
|
|
56
62
|
|
|
57
63
|
|
|
58
64
|
def get_wins():
|
|
@@ -65,15 +71,22 @@ _ALBUM_SEEN = set() # in-memory mirror: the 10s autosave was re-reading
|
|
|
65
71
|
|
|
66
72
|
|
|
67
73
|
def album_seen(num):
|
|
68
|
-
"""Has ANY generation been this form
|
|
69
|
-
|
|
74
|
+
"""Has ANY generation been this form -- under EITHER of its name-twin nums?
|
|
75
|
+
(canon Evolution.setUnlocked + checkNaturalUnlocked: the dex reveal state
|
|
76
|
+
the hidden-evolution mask keys on, synced across same-name rows)."""
|
|
77
|
+
from . import data
|
|
78
|
+
num = data.canonical_num(num)
|
|
70
79
|
if num in _ALBUM_SEEN:
|
|
71
80
|
return True
|
|
72
|
-
return num in
|
|
81
|
+
return num in get_album()
|
|
73
82
|
|
|
74
83
|
|
|
75
84
|
def album_add(num):
|
|
76
|
-
if num is None or num < 0
|
|
85
|
+
if num is None or num < 0:
|
|
86
|
+
return
|
|
87
|
+
from . import data
|
|
88
|
+
num = data.canonical_num(num) # store the name-canonical identity
|
|
89
|
+
if num in _ALBUM_SEEN:
|
|
77
90
|
return
|
|
78
91
|
_ALBUM_SEEN.add(num)
|
|
79
92
|
d = load_settings()
|
|
@@ -277,7 +290,7 @@ def get_progress():
|
|
|
277
290
|
prog = _prog()
|
|
278
291
|
last = prog.get("last_gen", {}) or {}
|
|
279
292
|
return {
|
|
280
|
-
"album":
|
|
293
|
+
"album": get_album(), # name-canonical (the egg gates match on it)
|
|
281
294
|
"wins": int(prog.get("wins", 0)),
|
|
282
295
|
"mega_kills": int(prog.get("mega_kills", 0)),
|
|
283
296
|
"max_gen": int(prog.get("max_gen", 1)),
|
|
@@ -155,6 +155,16 @@ ITEM_INTEREST_HIGH_TIMER = 80 # ItemInterestHighTimer (disposition -1)
|
|
|
155
155
|
PERSONALITY_MOOD_MATCH = 10 # ConsumablePersonalityMatchMoodChange
|
|
156
156
|
PERSONALITY_MOOD_UNMATCH = -10 # ConsumablePersonalityUnmatchMoodChange
|
|
157
157
|
EGG_MOOD = 100 # EggMood: a new egg starts warm (Evolution.egg)
|
|
158
|
+
# Evolution.java per-stage ARRIVAL setters (egg/hatch audit 2026-07-06; the
|
|
159
|
+
# shipped ranges are all min==max -> deterministic)
|
|
160
|
+
FRESH_MOOD = -10 # FreshMood: born grumpy (it's a newborn)
|
|
161
|
+
FRESH_OBEDIENCE = 75 # FreshObedienceMin/Max: born TRUSTING
|
|
162
|
+
START_NUTRITION = 6 # StartProtein/StartMineral/StartVitamin
|
|
163
|
+
IN_TRAINING_OBEDIENCE = 50 # InTrainingObedienceMin/Max: toddler rebellion cap
|
|
164
|
+
IN_TRAINING_SLEEP_LAPSE = 360 # InTrainingSleepLapse: wakes with real bedtime pressure
|
|
165
|
+
ROOKIE_OBED_GOOD = 50 # RookieGoodObedience (Happy daily majority)
|
|
166
|
+
ROOKIE_OBED_DEFAULT = 25 # RookieDefaultObedience (Neutral majority)
|
|
167
|
+
ROOKIE_OBED_BAD = 0 # RookieBadObedience (anything else, ties included)
|
|
158
168
|
# the missed-day / birthday system (setTimeToAge): each game day of AGE the pet
|
|
159
169
|
# has a birthday judged by the day's MAJOR mood and its missed-day tally
|
|
160
170
|
MOOD_RECORD_MIN = 5 # MoodRecordMin: sample the mood tier every 5 game-min
|
|
@@ -2411,6 +2421,40 @@ class Pet:
|
|
|
2411
2421
|
def evolve_to(self, num):
|
|
2412
2422
|
was_young = self.stage in ("Egg", "Fresh", "InTraining", "Rookie")
|
|
2413
2423
|
_req = self._become(num)
|
|
2424
|
+
# Evolution.java's per-stage ARRIVAL setters (egg/hatch audit
|
|
2425
|
+
# 2026-07-06 -- none of these were ported; the missing fresh()
|
|
2426
|
+
# obedience 75 was the deepest root of the misbehaving-babies era):
|
|
2427
|
+
if self.stage == "Fresh":
|
|
2428
|
+
# fresh(): born TRUSTING (obedience 75) but grumpy (-10 mood),
|
|
2429
|
+
# hungry, full of energy, with a starter nutrition base 6/6/6
|
|
2430
|
+
lo, hi = self.ideal_temp
|
|
2431
|
+
self.temp = (lo + hi) // 2
|
|
2432
|
+
self._set_mood(FRESH_MOOD)
|
|
2433
|
+
self._set_obedience(FRESH_OBEDIENCE)
|
|
2434
|
+
self.strength = 0
|
|
2435
|
+
self.hunger = 0
|
|
2436
|
+
self.energy = self.max_energy
|
|
2437
|
+
self.nutr_protein = self.nutr_mineral = self.nutr_vitamin = START_NUTRITION
|
|
2438
|
+
elif self.stage == "InTraining":
|
|
2439
|
+
# inTraining(): toddler rebellion -- obedience above 50 KNOCKS
|
|
2440
|
+
# BACK to 50; it wakes with the lights on and real bedtime
|
|
2441
|
+
# pressure (sleepLapse 360)
|
|
2442
|
+
if self.obedience > IN_TRAINING_OBEDIENCE:
|
|
2443
|
+
self._set_obedience(IN_TRAINING_OBEDIENCE)
|
|
2444
|
+
self.asleep, self.nap = False, False
|
|
2445
|
+
self.lights = True
|
|
2446
|
+
self.sleep_lapse = IN_TRAINING_SLEEP_LAPSE
|
|
2447
|
+
elif self.stage == "Rookie":
|
|
2448
|
+
# rookie(): the childhood report card SETS obedience -- a Happy
|
|
2449
|
+
# daily-mood majority earns 50, Neutral 25, anything else 0
|
|
2450
|
+
# (a TIE is Mood.None -> the switch default -> bad, canon exact)
|
|
2451
|
+
counts = self.daily_mood
|
|
2452
|
+
best = max(counts.values()) if counts else 0
|
|
2453
|
+
tops = [k for k, v in counts.items() if v == best and best > 0]
|
|
2454
|
+
major = tops[0] if len(tops) == 1 else None
|
|
2455
|
+
self._set_obedience(ROOKIE_OBED_GOOD if major == "Happy"
|
|
2456
|
+
else ROOKIE_OBED_DEFAULT if major == "Neutral"
|
|
2457
|
+
else ROOKIE_OBED_BAD)
|
|
2414
2458
|
if was_young and self.stage == "Champion":
|
|
2415
2459
|
# randOnChampion (taste/rank audit 2026-07-06): the childhood-care
|
|
2416
2460
|
# tally becomes the adult temperament
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tuipet
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.332
|
|
4
4
|
Summary: A terminal virtual pet (Digimon V-Pet style) rendered with halfblock sprites, built on data extracted from DVPet.
|
|
5
5
|
Author-email: Joel Taylor <joeltaylor734@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -119,6 +119,7 @@ src/tuipet/data/sounds/wind.wav
|
|
|
119
119
|
tests/test_adventure.py
|
|
120
120
|
tests/test_adventure_math.py
|
|
121
121
|
tests/test_adventure_scenery.py
|
|
122
|
+
tests/test_album_dex.py
|
|
122
123
|
tests/test_anim_canon.py
|
|
123
124
|
tests/test_anim_timing.py
|
|
124
125
|
tests/test_announce.py
|
|
@@ -194,6 +195,7 @@ tests/test_sleep.py
|
|
|
194
195
|
tests/test_sleep_system.py
|
|
195
196
|
tests/test_sleep_weather_math.py
|
|
196
197
|
tests/test_sound.py
|
|
198
|
+
tests/test_stage_arrival.py
|
|
197
199
|
tests/test_status_box.py
|
|
198
200
|
tests/test_status_icons.py
|
|
199
201
|
tests/test_sync.py
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Album/dex — canon Evolution.setUnlocked at digivolve + checkNaturalUnlocked's
|
|
2
|
+
NAME sync across duplicate roster rows (the 1410+ egg-hatch block mirrors the
|
|
3
|
+
chart's canonical rows), persisted device-lifetime (saves/Shared/tree.txt ->
|
|
4
|
+
tuipet's settings progress channel). Audit 2026-07-06."""
|
|
5
|
+
from tuipet import data, persistence
|
|
6
|
+
from tuipet.egg import _conditions_met
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def test_name_twins_share_one_canonical_num():
|
|
10
|
+
assert data.canonical_num(1432) == data.canonical_num(944) == 944 # ChibiKiwimon
|
|
11
|
+
assert data.canonical_num(1410) == 1 # Yukimibotamon
|
|
12
|
+
assert data.canonical_num(100) == data.canonical_num(100) # stable
|
|
13
|
+
assert data.canonical_num(999999) == 999999 # unknown: identity
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def test_the_album_records_and_reveals_by_name():
|
|
17
|
+
"""Raising a form under its hatch-twin num reveals BOTH (canon
|
|
18
|
+
checkNaturalUnlocked): the album stores the canonical identity and
|
|
19
|
+
album_seen answers for either alias."""
|
|
20
|
+
persistence.album_add(1432) # lived as the hatch twin
|
|
21
|
+
assert persistence.album_seen(944) # ...the chart row is revealed
|
|
22
|
+
assert persistence.album_seen(1432)
|
|
23
|
+
assert 944 in persistence.get_album() and 1432 not in persistence.get_album()
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_old_raw_entries_canonicalize_on_read():
|
|
27
|
+
"""Existing saves may hold duplicate-block nums from before the sync --
|
|
28
|
+
get_album() canonicalizes on read, no migration needed."""
|
|
29
|
+
d = persistence.load_settings()
|
|
30
|
+
d.setdefault("progress", {})["album"] = [1410, 102] # an old-save shape
|
|
31
|
+
persistence.save_settings(d)
|
|
32
|
+
persistence._ALBUM_SEEN.clear()
|
|
33
|
+
assert persistence.get_album() == {1, 102}
|
|
34
|
+
assert persistence.album_seen(1) # the chart twin answers
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_the_chibikiwimon_gate_accepts_either_twin():
|
|
38
|
+
"""Egg 22's unlock history demands num 944 -- raising ChibiKiwimon from
|
|
39
|
+
its own egg (which hatches 1432) must satisfy it, like canon's name sync
|
|
40
|
+
(the exact stranding this audit found)."""
|
|
41
|
+
rule = data.load_egg_unlock()[22]
|
|
42
|
+
assert rule["history"] == [944]
|
|
43
|
+
prog = {"album": {944}, "wins": 10**9, "mega_kills": 10**9, "max_gen": 99,
|
|
44
|
+
"max_stage": 99, "xanti_ever": True, "maps": set(range(99)),
|
|
45
|
+
"tourneys": set(range(999)), "last_field": rule.get("prev_field"),
|
|
46
|
+
"last_xanti": True, "last_attribute": rule.get("prev_attribute"),
|
|
47
|
+
"last_element": rule.get("prev_element")}
|
|
48
|
+
# the album arrives canonicalized (get_album) -- 1432 stored old-style
|
|
49
|
+
# resolves to 944; simulate both shapes through the gate:
|
|
50
|
+
assert _conditions_met(rule, dict(prog, album={data.canonical_num(1432)}))
|
|
51
|
+
assert _conditions_met(rule, dict(prog, album={944}))
|
|
52
|
+
assert not _conditions_met(rule, dict(prog, album={1}))
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""Evolution.java's per-stage ARRIVAL setters (egg/hatch audit 2026-07-06):
|
|
2
|
+
fresh()/inTraining()/rookie() SET the newcomer's state on top of digivolve --
|
|
3
|
+
the missing fresh() obedience 75 was the deepest root of the misbehaving-
|
|
4
|
+
babies era (canon babies are born TRUSTING; the 0 was pre-hatch defaultData)."""
|
|
5
|
+
from tuipet.pet import (Pet, FRESH_MOOD, FRESH_OBEDIENCE, START_NUTRITION,
|
|
6
|
+
IN_TRAINING_OBEDIENCE, IN_TRAINING_SLEEP_LAPSE,
|
|
7
|
+
ROOKIE_OBED_GOOD, ROOKIE_OBED_DEFAULT, ROOKIE_OBED_BAD)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _egg():
|
|
11
|
+
p = Pet.new_egg(egg_type=0)
|
|
12
|
+
p.world_seconds = 10 * 60.0
|
|
13
|
+
return p
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def test_a_hatchling_is_born_trusting_grumpy_and_hungry():
|
|
17
|
+
p = _egg()
|
|
18
|
+
p.hatching = True
|
|
19
|
+
p._hatch_t = 0.0
|
|
20
|
+
assert p.advance_hatch(0.1) # the egg hatches
|
|
21
|
+
assert p.stage == "Fresh"
|
|
22
|
+
assert p.obedience == FRESH_OBEDIENCE == 75 # born trusting
|
|
23
|
+
assert p.mood == FRESH_MOOD == -10 # ...and grumpy
|
|
24
|
+
assert p.hunger == 0 and p.strength == 0 # born hungry, no effort yet
|
|
25
|
+
assert p.energy == p.max_energy # full of beans
|
|
26
|
+
assert (p.nutr_protein, p.nutr_mineral, p.nutr_vitamin) == (6, 6, 6)
|
|
27
|
+
lo, hi = p.ideal_temp
|
|
28
|
+
assert p.temp == (lo + hi) // 2
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_intraining_arrival_is_the_toddler_rebellion():
|
|
32
|
+
p = Pet(num=2, stage="Fresh", attribute="Vaccine")
|
|
33
|
+
p.world_seconds = 10 * 60.0
|
|
34
|
+
p.obedience = 75
|
|
35
|
+
p.asleep, p.lights = True, False
|
|
36
|
+
p.evolve_to(12) # any InTraining form
|
|
37
|
+
assert p.stage == "InTraining"
|
|
38
|
+
assert p.obedience == IN_TRAINING_OBEDIENCE == 50 # knocked back down
|
|
39
|
+
assert not p.asleep and p.lights # wakes, lights on
|
|
40
|
+
assert p.sleep_lapse == IN_TRAINING_SLEEP_LAPSE == 360
|
|
41
|
+
q = Pet(num=2, stage="Fresh", attribute="Vaccine")
|
|
42
|
+
q.world_seconds = 10 * 60.0
|
|
43
|
+
q.obedience = 10
|
|
44
|
+
q.evolve_to(12)
|
|
45
|
+
assert q.obedience == 10 # only re-set when ABOVE the cap
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_rookie_arrival_grades_the_childhood():
|
|
49
|
+
for moods, want in ((dict(Happy=5, Neutral=1), ROOKIE_OBED_GOOD),
|
|
50
|
+
(dict(Neutral=5, Happy=1), ROOKIE_OBED_DEFAULT),
|
|
51
|
+
(dict(Unhappy=5), ROOKIE_OBED_BAD),
|
|
52
|
+
(dict(Happy=3, Neutral=3), ROOKIE_OBED_BAD)): # a TIE is Mood.None -> bad
|
|
53
|
+
p = Pet(num=12, stage="InTraining", attribute="Vaccine")
|
|
54
|
+
p.world_seconds = 10 * 60.0
|
|
55
|
+
p.obedience = 99
|
|
56
|
+
for k, v in moods.items():
|
|
57
|
+
p.daily_mood[k] = v
|
|
58
|
+
p.evolve_to(25) # any Rookie form
|
|
59
|
+
assert p.obedience == want, (moods, p.obedience)
|
|
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
|
|
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
|